![]() |
Defragmentierung als Administrator ausführen
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:
Es funktioniert klar, wenn der User lokale Administrationsrechte hat, nicht aber, wennfunction 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; er Hauptbenutzer ist. Wie mache ich das? :lol: Danke für eure Hilfe Michael |
Re: Defragmentierung als Administrator ausführen
Wenn du RevertToSelf; nach ShellExecute aufrufen würdest,
könnte das Defrag Programm auch mit Adminrechten gestartet werden. |
Re: Defragmentierung als Administrator ausführen
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. |
Re: Defragmentierung als Administrator ausführen
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? |
Re: Defragmentierung als Administrator ausführen
Ist der Code in einem Dienst ausgeführt?
|
Re: Defragmentierung als Administrator ausführen
Liste der Anhänge anzeigen (Anzahl: 1)
Der Code wird in einem Programm ausgeführt, nicht in einem Dienst.
Den Quellcode habe ich beigefügt. |
Re: Defragmentierung als Administrator ausführen
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. |
Re: Defragmentierung als Administrator ausführen
Danke für den Tip.
Wie realisiere ich deinen ersten Vorschlag denn programmtechnisch ode rmuß ich da betriebssystemtechnisch etwas tun? |
Re: Defragmentierung als Administrator ausführen
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. |
Re: Defragmentierung als Administrator ausführen
Ich komme doch noch mal hierauf zurück.
Zitat:
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.." |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz