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