![]() |
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:
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).
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; 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 :) |
Re: Vista Systemdienst -> Programm mit Adminrechten start
Ich glaube, da musst du ein entsprechendes Manifest beilegen.
|
Re: Vista Systemdienst -> Programm mit Adminrechten start
Hallo Luckie,
hab ich gemacht ;) (siehe mein Eingangsposting). Nur dann konnte der Prozess garnicht mehr aufgerufen werden :( |
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.
|
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 01:06 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-2025 by Thomas Breitkreuz