Einzelnen Beitrag anzeigen

Stephan

Registriert seit: 28. Jun 2002
Ort: Tuttlingen
245 Beiträge
 
Delphi 2007 Professional
 
#1

Vista Systemdienst -> Programm mit Adminrechten starten

  Alt 12. Dez 2007, 23:15
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
viele Grüße

Stephan
  Mit Zitat antworten Zitat