AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Vista Systemdienst -> Programm mit Adminrechten starten

Vista Systemdienst -> Programm mit Adminrechten starten

Offene Frage von "Stephan"
Ein Thema von Stephan · begonnen am 12. Dez 2007 · letzter Beitrag vom 13. Dez 2007
Antwort Antwort
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
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Vista Systemdienst -> Programm mit Adminrechten start

  Alt 12. Dez 2007, 23:17
Ich glaube, da musst du ein entsprechendes Manifest beilegen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Stephan

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

Re: Vista Systemdienst -> Programm mit Adminrechten start

  Alt 12. Dez 2007, 23:19
Hallo Luckie,

hab ich gemacht (siehe mein Eingangsposting). Nur dann konnte der Prozess garnicht mehr aufgerufen werden
viele Grüße

Stephan
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.169 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Vista Systemdienst -> Programm mit Adminrechten start

  Alt 13. Dez 2007, 06:22
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#5

Re: Vista Systemdienst -> Programm mit Adminrechten start

  Alt 13. Dez 2007, 10:33
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.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:03 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