Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Defragmentierung als Administrator ausführen (https://www.delphipraxis.net/105293-defragmentierung-als-administrator-ausfuehren.html)

eticket 19. Dez 2007 10:19


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:

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? :lol:

Danke für eure Hilfe

Michael

Dezipaitor 19. Dez 2007 11:48

Re: Defragmentierung als Administrator ausführen
 
Wenn du RevertToSelf; nach ShellExecute aufrufen würdest,
könnte das Defrag Programm auch mit Adminrechten gestartet werden.

himitsu 19. Dez 2007 14:49

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.

eticket 19. Dez 2007 14:56

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?

Dezipaitor 19. Dez 2007 16:41

Re: Defragmentierung als Administrator ausführen
 
Ist der Code in einem Dienst ausgeführt?

eticket 19. Dez 2007 17:00

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.

Dezipaitor 19. Dez 2007 17:14

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.

eticket 20. Dez 2007 05:51

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?

Dezipaitor 20. Dez 2007 10:17

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.

eticket 20. Dez 2007 12:22

Re: Defragmentierung als Administrator ausführen
 
Ich komme doch noch mal hierauf zurück.

Zitat:

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.."


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:08 Uhr.
Seite 1 von 2  1 2      

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