AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Defragmentierung als Administrator ausführen
Thema durchsuchen
Ansicht
Themen-Optionen

Defragmentierung als Administrator ausführen

Ein Thema von eticket · begonnen am 19. Dez 2007 · letzter Beitrag vom 20. Dez 2007
Antwort Antwort
Seite 1 von 2  1 2      
eticket

Registriert seit: 30. Aug 2007
17 Beiträge
 
Delphi 5 Enterprise
 
#1

Defragmentierung als Administrator ausführen

  Alt 19. Dez 2007, 11:19
Hallo,

die Defragmentierung kann nur mit Administrationsrechten ausgeführt werden.
Ich suche ein Programm, mit dem man die Defragmentierung als "Hauptbenutzer" aufruft,
d.h. in der Oberfläche werden Administrator und Passwort (voreingestellt) übergeben.
Der User klickt dann nur auf Start und die Defragmentierung wird gestartet.

Anbei das Programmkonstrukt

Delphi-Quellcode:

function GetCurrUserName: string;
var
  Size : DWORD;
begin
  Size := MAX_COMPUTERNAME_LENGTH + 1;
  SetLength(Result, Size);
  if GetUserName(PChar(Result), Size) then
    SetLength(Result, Size)
  else
    Result := '';
end;

function ComputerNameStr: String;
var
  Size: DWORD;
begin
  Size := MAX_COMPUTERNAME_LENGTH + 1;
  SetLength(Result, Size);
  if GetComputerName(PChar(Result), Size) then
    SetLength(Result, Size)
  else
    Result := '';
end;

function Impersonate(const User, PW: string): Boolean;
var
  LogonType : Integer;
  LogonProvider : Integer;
  strAdminUser : string;
  strAdminDomain : string;
  strAdminPassword : string;
begin
  LogonType := LOGON32_LOGON_INTERACTIVE;
  LogonProvider := LOGON32_PROVIDER_DEFAULT;
  strAdminUser := USER;
  strAdminDomain := ComputerNameStr;
  strAdminPassword := PW;
  Result := LogonUser(PChar(strAdminUser), PChar(strAdminDomain), PChar(strAdminPassword), LogonType, LogonProvider, TokenHandle);
  if Result then
  begin
    Result := ImpersonateLoggedOnUser(TokenHandle);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
Var unstr, pwstr : String;
begin
     // Starte Defragmentierung
     unstr := Username.Text;
     pwstr := Password.Text;

     if Impersonate(unstr, pwstr) then
     begin
          RevertToSelf;
          if ShellExecute( Application.Handle , 'open' , PChar('dfrg.msc'), Nil, Nil, SW_NORMAL) <= 32 then
             ShowMessage('Es ist ein Fehler aufgetreten');
     end
     else
         MessageBox(0, PChar(SysErrorMessage(GetLastError)), '', 0);

end;
Es funktioniert klar, wenn der User lokale Administrationsrechte hat, nicht aber, wenn
er Hauptbenutzer ist.

Wie mache ich das?

Danke für eure Hilfe

Michael
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#2

Re: Defragmentierung als Administrator ausführen

  Alt 19. Dez 2007, 12:48
Wenn du RevertToSelf; nach ShellExecute aufrufen würdest,
könnte das Defrag Programm auch mit Adminrechten gestartet werden.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

Re: Defragmentierung als Administrator ausführen

  Alt 19. Dez 2007, 15:49
Muß der Benutzer unbedingt selber den Defragmentierer starten?

Die Meinsten laufen ja als Service und verügen auch über eine Job-geührte Steuerung ... man kann also sagen wann/wie die Platten automatisch defragmentiert werden sollen.
$2B or not $2B
  Mit Zitat antworten Zitat
eticket

Registriert seit: 30. Aug 2007
17 Beiträge
 
Delphi 5 Enterprise
 
#4

Re: Defragmentierung als Administrator ausführen

  Alt 19. Dez 2007, 15:56
Wenn ich RevertToSelf nach dem ShellExecute aufrufe, kommt es zu der Fehlermeldung:

MMC konnte nicht initialisiert werden, weil nicht richtig installiert oder
ein Teil der Registrierungs beschädigt wurde. Bitte vergewissern Sie sich, daß
die Datei Mmcndrmgr.dll registriert wurde, indem Sie "regsrv32
%systemroot%\system32\mmcndmgr.dll" aus

Das habe ich auch gemacht und es funktioniert trotzdem nicht.

Was tun?
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#5

Re: Defragmentierung als Administrator ausführen

  Alt 19. Dez 2007, 17:41
Ist der Code in einem Dienst ausgeführt?
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
eticket

Registriert seit: 30. Aug 2007
17 Beiträge
 
Delphi 5 Enterprise
 
#6

Re: Defragmentierung als Administrator ausführen

  Alt 19. Dez 2007, 18:00
Der Code wird in einem Programm ausgeführt, nicht in einem Dienst.

Den Quellcode habe ich beigefügt.
Angehängte Dateien
Dateityp: pas defrag_239.pas (2,6 KB, 15x aufgerufen)
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#7

Re: Defragmentierung als Administrator ausführen

  Alt 19. Dez 2007, 18:14
ich denke mal, dass die LogonSID die im Token von LogonUser steckt, nicht in der Desktop DACL existiert, und so kein Fenster auf dem Desktop geöffnet werden kann.
Es gibt zwei Lösungen:
1. Einfügen der LogonSID des neuen Benutzers in die DACL
2. Einfügen der LogonSID des aktuellen Benutzers in die TokenGroups - nur über einen Dienst möglich.

Ersteres sollte immer möglich sein, da die LogonSID des Benutzer in der Desktop DACL volle Kontrolle hat.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
eticket

Registriert seit: 30. Aug 2007
17 Beiträge
 
Delphi 5 Enterprise
 
#8

Re: Defragmentierung als Administrator ausführen

  Alt 20. Dez 2007, 06:51
Danke für den Tip.
Wie realisiere ich deinen ersten Vorschlag denn programmtechnisch ode rmuß ich da betriebssystemtechnisch etwas tun?
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#9

Re: Defragmentierung als Administrator ausführen

  Alt 20. Dez 2007, 11:17
Die Funktionsaufrufe sehen etwa so aus. Es gibt da auch in der MSDN ein C Beispiel.

OpenWindowStation
OpenDesktop
GetSecurityInfo
GetSecurityInfo
AddAceAllowed
AddAceAllowed
SetSecurityInfo
SetSecurityInfo

Mit der JWSCL sind es ein paar sichere Zeilen weniger.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
eticket

Registriert seit: 30. Aug 2007
17 Beiträge
 
Delphi 5 Enterprise
 
#10

Re: Defragmentierung als Administrator ausführen

  Alt 20. Dez 2007, 13:22
Ich komme doch noch mal hierauf zurück.

Zitat von Dezipaitor:
ich denke mal, dass die LogonSID die im Token von LogonUser steckt, nicht in der Desktop DACL existiert, und so kein Fenster auf dem Desktop geöffnet werden kann.
Es gibt zwei Lösungen:
1. Einfügen der LogonSID des neuen Benutzers in die DACL
2. Einfügen der LogonSID des aktuellen Benutzers in die TokenGroups - nur über einen Dienst möglich.

Ersteres sollte immer möglich sein, da die LogonSID des Benutzer in der Desktop DACL volle Kontrolle hat.
Der neue Benutzer ist der Administrator des Rechners.
Hat dieser wirklich keinen Zugriff auf die DACL?

Gibt es nichts einfacheres?

Mir geht es doch im Pronzip nur um die Programmtechnische Umgehung des Rechte-Maus "Ausführen als.."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz