Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Programm aus Dienst herraus Beenden/Starten usw. (https://www.delphipraxis.net/117520-programm-aus-dienst-herraus-beenden-starten-usw.html)

xSkaschY 19. Jul 2008 17:57


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.

new32 19. Jul 2008 20:17

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

Apollonius 19. Jul 2008 20:29

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.

xSkaschY 20. Jul 2008 06:13

Re: Programm aus Dienst herraus Beenden/Starten usw.
 
Danke, werd mir das mal anschauen! Melde mich dann nochmal wenn ich erste Erfloge verzeichnen kann. :-)

kuba 21. Jul 2008 11:52

Re: Programm aus Dienst herraus Beenden/Starten usw.
 
Hy,

mit folgendem Code beende ich Tasks aus meinem Systemdienst:

Delphi-Quellcode:
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;
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.

KUBA

Dezipaitor 21. Jul 2008 13:47

Re: Programm aus Dienst herraus Beenden/Starten usw.
 
Jwscl implementiert JwCreateProcessInSession

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 03:00 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