Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Vista Systemdienst -> Programm mit Adminrechten starten (https://www.delphipraxis.net/104928-vista-systemdienst-programm-mit-adminrechten-starten.html)

Stephan 12. Dez 2007 23:15


Vista Systemdienst -> Programm mit Adminrechten starten
 
Hallo,

zur Zeit schreibe ich einen Systemdienst, dessen Aufgabe es ist, ein anderes Programm unter einem anderen Benutzerkonto aufzurufen. Hierbei ist es zwingend erforderlich, dass dieses Programm unter einem Administrator mit Administratorrechten gestartet wird. Der Systemdienst selber läuft im übrigen unter SYSTEM-Rechten, und hat daher die nötigen Berechtigungen, eine externe Anwendung mit femden Benutzerdaten zu starten.

Zum starten des Programms aus meinem Systemdienst verwende ich folgendes Code-Snippet (gefunden über die Suchfunktion hier im Forum):

Delphi-Quellcode:
function RunProcess(ExePath:String;Param:String;Username,Domain,Password:String):Cardinal;
var
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
var TokenHandle:Cardinal;
begin
  Result:=0;

  //Existiert dieses File?
  if not FileExists(ExePath) then
    raise Exception.CreateFmt('File "%s" existiert nicht!',[ExePath]);

  //User anmelden und Token erhalten
  if not LogOnUser(PChar(Username),PChar(Domain),PChar(Password),LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT,TokenHandle) then
    raise Exception.CreateFmt('LogonUser fehlgeschlagen! Errorcode: %d',[GetLastError]);

  //StartupInfo-Struktur initialisieren
  FillChar(StartupInfo, SizeOf(StartupInfo), #0);

  //Werte zuweisen
  StartupInfo.cb         := SizeOf(StartupInfo);
  StartupInfo.dwFlags    := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
  StartupInfo.wShowWindow := SW_SHOW;

  //Prozess starten
  if not CreateProcessAsUser(
    TokenHandle,
    @ExePath[1],
    pchar(param),
    NIL,
    NIL,
    True,
    NORMAL_PRIORITY_CLASS,
    NIL,
    NIL,
    StartupInfo,
    ProcessInfo)
  then
    raise Exception.CreateFmt('CreateProcessAsUser für "%s" fehlgeschlagen! Errorcode: %d',[ExePath,GetLastError]);

  //Auf Beendigung warten
  WaitForSingleObject(ProcessInfo.hProcess, INFINITE);

  //Exitcode des Prozesses ermitteln
  GetExitCodeProcess(ProcessInfo.hProcess, Result);

  //Handles freigeben
  if ProcessInfo.hProcess <> 0 then
    CloseHandle(ProcessInfo.hProcess);
  if ProcessInfo.hThread <> 0 then
    CloseHandle(ProcessInfo.hThread);
end;
Unter Windows XP klappt das auch hervorragend. Das externe Programm wird unter den hierfür angegebenen Benutzerdaten aufgerufen. Leider scheint unter Vista zwar das Programm ebenfalls gestartet zu werden, nur leider läuft dies NICHT mit Adminrechten (unter Vista laufen normale Programme - auch beim Administrator - standardmäßig nicht mit Adminrechten). Was macht man also normalerweise in einem solchen Fall? Ja, eine entsprechende Manifest Datei mit einkompillieren. Gesagt, getan! Mit dem Resultat, dass nun das Programm überhaupt nicht mehr gestartet werden konnte (das muss wohl beim CreateProcessAsUser ausgestiegen sein).


Meine Frage also: wie ist es möglich, unter Vista ein normales Programm aus einem System Dienst heraus unter fremden Zugangsdaten (*) zu starten, wobei die Berechtigung des Programms gleichzeitig auf Administratorebene anzuheben ist.

(*) Zugangsdaten eines Administrators (sonst wär auch eine Anhebung der Rechte logischerweise nicht möglich ;) )


Ich hoffe, dass ich mein Problem einigermaßen verständlich schildern konnte. Die Sache ist doch etwas verzwickt und ich wäre für jeden Hinweis dankbar :)

Luckie 12. Dez 2007 23:17

Re: Vista Systemdienst -> Programm mit Adminrechten start
 
Ich glaube, da musst du ein entsprechendes Manifest beilegen.

Stephan 12. Dez 2007 23:19

Re: Vista Systemdienst -> Programm mit Adminrechten start
 
Hallo Luckie,

hab ich gemacht ;) (siehe mein Eingangsposting). Nur dann konnte der Prozess garnicht mehr aufgerufen werden :(

Bernhard Geyer 13. Dez 2007 06:22

Re: Vista Systemdienst -> Programm mit Adminrechten start
 
AFAIK ist das gar nicht mehr möglich ohne Registry-Einträge per Hand umzustellen da die Dienste mit interaktion zum Desktop nicht mehr möglich sind bzw. maximal mit eigenem Desktop hochkommen. Auch schlägt dir u.U. UAC eine Schnippe. Protokollier mal für alle API-Funktionsaufrufe den genauen Rückgabewert mit.

Dezipaitor 13. Dez 2007 10:33

Re: Vista Systemdienst -> Programm mit Adminrechten start
 
wenn ich mich nicht irre passiert folgendes unter Vista:
CreateProcessAsUser entnimmt dem übergebenen Token alle Adminrechte, sobald der Benutzer Administrator ist. Das Token des Benutzers hat dann ein sogenanntes LinkedToken, welches man stattdessen verwenden muss.
Kurz gesagt, verwendet CreateProcess bei einem bekannten Token, nimmt es das LinkedToken stattdessen. Du kannst es natürlich auch verwenden direkt. Verwirrt?


Übrigens hast du noch ein paar Dinge nicht bedacht:
+Die Tokengroupliste muss die Logon-Sid des Benutzers besitzen, der den Prozess ausgeführt haben will. Das gibt zugriff auf den Desktop.
+LoadUserProfile sollte verwendet werden (z.b. wenn der Benutzer noch nicht eingeloggt wurde)
+Schon an die verschiedenen TerminalSessions gedacht? Benutzer können nicht nur lokal sich einloggen, sondern auch remote. Der Dienst muss das erkennen und die Session wechseln.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:28 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