![]() |
Programm aus Dienst herraus Beenden/Starten usw.
Hallo zusammen,
ich habe hier, in welchem Thread genau weiß ich gerade nicht mehr, gelesen das dies nicht wirklich möglich sei, wenn der Dienst nicht im Interaktiven Modus oder als System-Benutzer läuft. Frage, wie kann ich dennoch ein Programm welches auf dem Desktop läuft, über den Dienst killen und starten, so das ich das auf den Desktop des jeweiligen Benutzer zusehen bekomme. (RunAs?) Wird von verschiedenen Quellen als Deprecated deklariert, ggf. aus Sicherheitsrelevanten Aspekten? Solutions? LG Toby - Btw: Der Dienst wird ausschliesslich unter Windows 2003 Server im Einsatz sein. |
Re: Programm aus Dienst herraus Beenden/Starten usw.
Der einfachste Weg dürfte über CreateProcessWithLogonW sein.
CreateProcess reicht hier nicht, du möchtest ja nicht alle Anwendungen mit Systemrechten starten. Soll dein Programm auch unter nt 4 laufen musst du mit LogonUser und CreateProcessAsUser arbeiten. Allerdings musst du hier alles manuell laden (Benutzerdaten...) Wenn du kein Passwort eingeben lassen willst kannst du dir auch ein Token von einem unter dem Benutzerkonto laufendem Prozess schnappen mit DuplicateToken clonen und an CreateProcessAsUser übergeben. Damit die Programme auf dem richtigen Desktop angezeigt werden musst du den in den StartupInformationen angeben. Zusätzlich musst du dem betreffenden Benutzer natürlich Zugriffsrechte auf den Desktop einräumen. Sonst gibts nen Fehler. Wenn bereits Programme unter dem Benutzerkonto laufen, hat der betreffende Benutzer natürlich die entsprechenden Rechte, also fällt dieser Schritt weg. Das Beenden von Prozessen sollte doch eigentlich genauso funktionieren, wie mit nem normalen Prozess. Allerdings musst du aufpassen, dass nicht aufeinmal jeder alle Programme beenden kann!!! Vielleicht auch von einem Programm Beenden lassen, dass du mit der oben beschreibenen Methode gestartet hast. Alles Andere führt zu Sicherheitsproblemen. MfG |
Re: Programm aus Dienst herraus Beenden/Starten usw.
Ohne System-Rechte wird es schwierig. Der normale Weg benötigt das TCB-Privileg (welches normalerweise nur der Benutzer System hat), um WTSQueryUserToken aufrufen zu können, welches das Token des angemeldeten Benutzers zurückgibt. Dieses kann man dann mit CreateProcessAsUser verwenden.
Der Desktop ist kein Problem - er lässt sich in der STARTUPINFO-Struktur angeben. Interaktivität benötigst du nicht. |
Re: Programm aus Dienst herraus Beenden/Starten usw.
Danke, werd mir das mal anschauen! Melde mich dann nochmal wenn ich erste Erfloge verzeichnen kann. :-)
|
Re: Programm aus Dienst herraus Beenden/Starten usw.
Hy,
mit folgendem Code beende ich Tasks aus meinem Systemdienst:
Delphi-Quellcode:
Das Starten eines Programms aus einem Dienst mit Benutzerrechten ist mir bisher (leider) noch nicht gelungen. Ich benötige allerdings auch Windows 2000 Kompatibilität.
function KillTask(ExeFileName: string): integer;
const PROCESS_TERMINATE=$0001; var ContinueLoop: BOOL; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; begin result := 0; FSnapshotHandle := CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwSize := Sizeof(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); while integer(ContinueLoop) <> 0 do begin if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then Result := Integer(TerminateProcess(OpenProcess( PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID), 0)); ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); end; CloseHandle(FSnapshotHandle); end; KUBA |
Re: Programm aus Dienst herraus Beenden/Starten usw.
Jwscl implementiert
![]() Die aktualisierte Version im SVN trunk Ordner funktioniert auch unter Windows 2000 Workstation.
Delphi-Quellcode:
{[B]JwCreateProcessInSession[/B] creates a new process in a user's session using various ways to
achieve success. This procedure needs JwInitWellKnownSIDs to be called. To run a process in another session you need to have SYSTEM rights. @param ApplicationName defines the application to be run in the session @param CommandLine defines the parameters for the application @param CurrentDirectory defines the start folder of the app. @param SessionID defines the target session where the new application is to be started. @param CreationFlags defines creation flags that are delivered to CreateProcess parameter with same name @param Desktop defines the target windowstation and desktop name. If empty the default target is "winsta0\default" @param StartupInfo defines startup info delivered to to CreateProcess parameter with same name. Don't forget to initialize the structure first before calling this procedure. <code lang="delphi> ZeroMemory(@StartupInfo, sizeof(StartupInfo)); </code> @param WaitForProcess defines whether the procedure should wait for the process to end and clean up all allocated resources or just return to the caller. In last case the caller is responsible to free the returned token, the environment block and the users profile @param Output contains returned data in case parameter WaitForProcess is false. The caller is responsible to free the contained member allocation @param LogServer receives a log server instance. It is used to log events for mostly debugging purposes. If this parameter is nil, no events are logged raises EJwsclProcessIdNotAvailable: will be raised if no token could be found for the given SessionID EJwsclNilPointer: will be raised if JwInitWellKnownSIDs was not called before } |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:03 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