Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Ermitteln ob ein Programm oder Prozess ein Dienst ist (https://www.delphipraxis.net/69927-ermitteln-ob-ein-programm-oder-prozess-ein-dienst-ist.html)

Codewalker 14. Aug 2006 14:04

Re: Ermitteln ob ein Programm oder Prozess ein Dienst ist
 
Zitat:

Zitat von Olli
Das müßtest du mir nochmal erklären, wenn es geht.

Delphi-Quellcode:
function GetExecutableFromPID(dwProcessID: DWord): String;
var
  FSnapshotHandle: THandle;
  FModuleEntry32: TModuleEntry32;
begin
  Result := '';
  begin
    FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessID);
    FModuleEntry32.dwSize := Sizeof(FModuleEntry32);
    Module32First(FSnapshotHandle, FModuleEntry32);
    if FileExists(FModuleEntry32.szExePath) = True then
      Result := FModuleEntry32.szExePath
    else
      Result := '';
    CloseHandle(FSnapshotHandle);
  end;
end;
Ich wollte den Pfad zu einem Prozess ermitteln, um diesen z.B. neu starten zu können. In einem Forum (ich meine DP, bin mir aber nicht sicher) habe ich dann den Tipp gefunden, dass man zu die geöffneten Module auslesen kann. Das erste Modul ist dann immer die Prozessdatei selbst, da diese immer als erste geöffnet werden muss, bevor weitere Module geladen werden können. Bei einem Dienst steht in dort jedoch Speichermüll. So hat man ein weiteres Indiz, ob es sich um einen Dienst handelt.

Zitat:

Zitat von Olli
Ein Thread innerhalb eines Dienstes muß nicht als SYSTEM laufen, auch wenn der Dienst als SYSTEM gestartet wurde. Ergo kann das Token falsch sein, oder schlimmer, du kannst möglicherweise garnicht die Rechte haben um auf Ressourcen zuzugreifen, die du im obigen Code ansprichst.

Zitat:

Zitat von Olli
Daß einige Prozesse einen Elternprozeß haben ist dir klar? Für Dienste gibt es normalerweise einen einzigen Elternprozeß (services.exe) unter dem dann andere laufen (svchost.exe für DLL-Services usw.).

Wie kann ich denn diesen "Elternprozess" ermitteln? Kannst du das ein wenig ausführlicher beschreiben, da endet mein Wissen :oops:

NicoDE 14. Aug 2006 17:45

Re: Ermitteln ob ein Programm oder Prozess ein Dienst ist
 
Zitat:

Zitat von Codewalker
Weiß jemand, wie ich herausfinden kann, ob ein Programm (exe?) oder ein Prozess ein Dienst ist.

Wenn du die nötigen Rechte hast und das Betriebssystem mindestens Windows 2000 ist, dann mit MSDN-Library durchsuchenEnumServicesStatusEx (in den Strukturen steht u.a. die ID des jeweiligen Prozesses).

Olli 14. Aug 2006 18:17

Re: Ermitteln ob ein Programm oder Prozess ein Dienst ist
 
Das kommt davon, wenn man (== "ich") zu faul ist ins PSDK zu gucken :roll: :lol: :mrgreen: :zwinker:

Codewalker 15. Aug 2006 06:40

Re: Ermitteln ob ein Programm oder Prozess ein Dienst ist
 
Zitat:

Das kommt davon, wenn man (== "ich") zu faul ist ins PSDK zu gucken
Ich hab mir die Funktionen in der MSDN mal in Ruhe angesehen kann auch nur sagen: :wall: - Ich werd das mal umsetzen damit ich weiterhin so eine "Durch-die-Brust-ins-Auge"-Funktion nutzen muss, wenn das auch eleganter und besser geht.

NicoDE 15. Aug 2006 09:48

Re: Ermitteln ob ein Programm oder Prozess ein Dienst ist
 
Kleiner Tipp am Rande: Nimm gleich die Unicode-Variante (ich hab hier einen japanischen Systemdienst der von den meisten ANSI-Programmen nicht angesprochen werden kann).

Olli 16. Aug 2006 00:35

Re: Ermitteln ob ein Programm oder Prozess ein Dienst ist
 
Zitat:

Zitat von NicoDE
Kleiner Tipp am Rande: Nimm gleich die Unicode-Variante (ich hab hier einen japanischen Systemdienst der von den meisten ANSI-Programmen nicht angesprochen werden kann).

Dieses Problem hätten Sie sich mit einem C/C++ Compiler und #define _UNICODE erspart :stupid:

Harry M. 16. Aug 2006 00:46

Re: Ermitteln ob ein Programm oder Prozess ein Dienst ist
 
Ich habe jetzte nicht den ganzen Thread gelesen....
Aber möglich wäre zu Testen ob der Pfand des Programmes wo Du wissen möchstes ob es ein Dienst ist oder nicht in der Registry findest bei den Servicen.

Olli 16. Aug 2006 00:52

Re: Ermitteln ob ein Programm oder Prozess ein Dienst ist
 
Zitat:

Zitat von Harry M.
Ich habe jetzte nicht den ganzen Thread gelesen....
Aber möglich wäre zu Testen ob der Pfand des Programmes wo Du wissen möchstes ob es ein Dienst ist oder nicht in der Registry findest bei den Servicen.

Vergleiche mal folgende Pfade sinnvoll:

%SystemRoot%\System32\\drivers\etc\\..\..\kernel32 .dll

C:\Windows\System32\kernel32.dll

Diverse Funktionen ala GetFullPathName() könnten helfen, aber manches wird IMO nicht aufgelöst.

Dann hätten wir noch \SystemRoot\System32\kernel32.dll ... das ist der Object Manager Namespace ... was nu?

Und das ist ja nur die Spitze des Eisbergs, siehe oben. Registry ist nicht die korrekte Methode. Der Einzige, der weiß welcher Prozeß ein Service ist, ist der SCM.

Harry M. 16. Aug 2006 00:58

Re: Ermitteln ob ein Programm oder Prozess ein Dienst ist
 
Ja klar ServiceMgr auch wenn ich Registry geschrieben habe. Nur der mach auch nix weiter als dort nach den Infos zu suchen.

NicoDE 16. Aug 2006 09:42

Re: Ermitteln ob ein Programm oder Prozess ein Dienst ist
 
Zitat:

Zitat von Harry M.
Ich habe jetzte nicht den ganzen Thread gelesen...

Das solltest Du aber :)
Zitat:

Zitat von Harry M.
Aber möglich wäre zu Testen ob der Pfand des Programmes wo Du wissen möchstes ob es ein Dienst ist oder nicht in der Registry findest bei den Servicen.

Obwohl Äpfel und Birnen Obst sind, kann man beides nicht vergleichen. Es gibt einige Module, die in einem Image Dienst(e) und Anwendung vereinen.

ps: ganz davon abgesehen, dass Microsoft die Art der Speicherung jederzeit ändern könnte (unter Vista wurde bereits viel geändert - mit hart-codierten Pfaden kommt man da nicht weit)


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:26 Uhr.
Seite 2 von 3     12 3      

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