Einzelnen Beitrag anzeigen

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