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