![]() |
Ermitteln ob ein Programm oder Prozess ein Dienst ist
Hallo zusammen.
Weiß jemand, wie ich herausfinden kann, ob ein Programm (exe?) oder ein Prozess ein Dienst ist. Ich würde gerne einen Prozess bei beenden neu starten, jedoch muss man ja Programme über CreateProcess und Dienste im Systemkonto mit "net start dienstname" starten. Wie kann man diesen Unterschied automatisch ermitteln? |
Re: Ermitteln ob ein Programm oder Prozess ein Dienst ist
du könntest versuchen den Dienst oder das Programm mit NET STOP vorher zu beenden, wenn die Meldung kommt der es kein installierter DIenst ist, ist es ein normales Programm.. kA ob des so funzt.
|
Re: Ermitteln ob ein Programm oder Prozess ein Dienst ist
Herausbekommen kann man das mit Sicherheit garnicht richtig (es gibt nämlich auch EXE-Dateien, die sich als Zwitter verhalten). Es gibt aber gewisse Anhaltspunkte:
1. Ist der Elternprozeß SERVICES.EXE? 2. Läuft der Prozeß als SYSTEM? Es gibt sicher noch mehr. Das Problem ist halt, daß man bei einer Zwitter-EXE es kaum generisch ermitteln kann. |
Re: Ermitteln ob ein Programm oder Prozess ein Dienst ist
Danke, ich werds damit mal versuchen...
|
Re: Ermitteln ob ein Programm oder Prozess ein Dienst ist
Zitat:
|
Re: Ermitteln ob ein Programm oder Prozess ein Dienst ist
Das geht mit den entsprechenden API-Funktionen zum Starten und Stoppen. Anhaltspunkte findest du hier:
![]() |
Re: Ermitteln ob ein Programm oder Prozess ein Dienst ist
Für die Forensuche - Die Lösung:
Hilfsfunktion:
Delphi-Quellcode:
Eigentliche Funktion:
function GetUserAndDomainFromPID(ProcessId: DWORD; var User, Domain: String): Boolean;
{ Hilfsfunktion. Ermittelt zu einer PID den Benutzerkontext und die Domäne } var hToken: THandle; cbBuf: Cardinal; ptiUser: PTOKEN_USER; snu: SID_NAME_USE; ProcessHandle: THandle; UserSize, DomainSize: DWORD; bSuccess: Boolean; begin Result := False; ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessId); if ProcessHandle <> 0 then begin if OpenProcessToken(ProcessHandle, TOKEN_QUERY, hToken) then begin bSuccess := GetTokenInformation(hToken, TokenUser, nil, 0, cbBuf); ptiUser := nil; while (Not bSuccess) And (GetLastError = ERROR_INSUFFICIENT_BUFFER) do begin ReallocMem(ptiUser, cbBuf); bSuccess := GetTokenInformation(hToken, TokenUser, ptiUser, cbBuf, cbBuf); end; CloseHandle(hToken); if Not bSuccess then begin Exit; end; UserSize := 0; DomainSize := 0; LookupAccountSid(nil, ptiUser.User.Sid, nil, UserSize, nil, DomainSize, snu); if (UserSize <> 0) And (DomainSize <> 0) then begin SetLength(User, UserSize); SetLength(Domain, DomainSize); if LookupAccountSid(nil, ptiUser.User.Sid, PChar(User), UserSize, PChar(Domain), DomainSize, snu) then begin Result := True; User := StrPas(PChar(User)); Domain := StrPas(PChar(Domain)); end; end; if bSuccess then begin FreeMem(ptiUser); end; end; CloseHandle(ProcessHandle); end; end;
Delphi-Quellcode:
Funktioniert bis jetzt ohne Probleme, bin aber für Diskussion offen :wink:
function IsServiceApp(AppName: String; PID: Integer; var ServiceName: String): Boolean;
{ Überprüft, ob ein Prozess mit der PID ein Dienst ist. Bedingungen: - Benutzerkonto ist das Systemkonto - Service ist in der Registry eingetragen } var User, Domain: String; Reg: TRegistry; List: TStringList; I: Integer; begin Result := False; GetUserAndDomainFromPID(PID, User, Domain); // Ermittelt den Benutzerkontext if User = 'SYSTEM' then begin // Programm läuft im Systemkontext... (könnte ein Dienst sein) Reg := TRegistry.Create; List := TStringList.Create; Reg.RootKey := HKEY_LOCAL_MACHINE; Reg.OpenKeyReadOnly('\SYSTEM\CurrentControlSet\Services\'); // Serviceliste öffnen Reg.GetKeyNames(List); // Alle Untereinträge auflisten for I := 0 to List.Count - 1 do begin Reg.OpenKeyReadOnly('\SYSTEM\CurrentControlSet\Services\' + List[i]); if Reg.ValueExists('ImagePath') // Wenn zugehörige Startdatei angegeben... (sonst kann nicht zugeordnet werden über den Prozessnamen) then begin if LowerCase(ExtractFileNameFromSystemPath(Reg.ReadString('ImagePath'))) = LowerCase(AppName) // Wenn die Dienst-EXE = Prozess-EXE --> Prozess ist ein Dienst then begin Result := True; // Prozess = Dienst ServiceName := List[i]; // Prozessnamen zurückgeben (z.B. "Spooler") Break; // Schleife verlassen end; end; end; List.Free; Reg.Free; end; end; |
Re: Ermitteln ob ein Programm oder Prozess ein Dienst ist
Zitat:
1. Punkt: was passiert, wenn einmal der Service-Schlüssel aaa und einmal zzz, beidemale mit dem gleichen ImagePath existieren? Hat ja niemand gesagt, daß man von einer EXE nur eine Instanz als Service laufen lassen kann. 2. Punkt: ImagePath kann auch Parameter enthalten, nicht nur Pfade. Abgesehen davon kann es mal eine Umgebungsvariable und einmal schon "expandierte" Pfade enthalten. 3. Punkt: ![]() 4. Punkt: Zuguterletzt Stichwort ![]() Anderes ließe sich noch anführen. So richtig kann man es eben doch nicht rausbekommen. Der Prozeßbaum (Suche nach "svchost") wäre noch eine Alternative, aber auch nicht 100% sicher - schließlich kann ein Dienst auch einen "normalen" Prozeß starten. |
Re: Ermitteln ob ein Programm oder Prozess ein Dienst ist
okay, okay. 1:0 für Dich, verdammt gute Argumente :wink: . Aber ich hab einen Vorschlag, es zu ändern:
Zitat:
Zitat:
Zitat:
![]() Zitat:
Zitat:
|
Re: Ermitteln ob ein Programm oder Prozess ein Dienst ist
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
|
Re: Ermitteln ob ein Programm oder Prozess ein Dienst ist
Zitat:
Delphi-Quellcode:
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.
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; Zitat:
Zitat:
|
Re: Ermitteln ob ein Programm oder Prozess ein Dienst ist
Zitat:
![]() |
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:
|
Re: Ermitteln ob ein Programm oder Prozess ein Dienst ist
Zitat:
|
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).
|
Re: Ermitteln ob ein Programm oder Prozess ein Dienst ist
Zitat:
|
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. |
Re: Ermitteln ob ein Programm oder Prozess ein Dienst ist
Zitat:
%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. |
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.
|
Re: Ermitteln ob ein Programm oder Prozess ein Dienst ist
Zitat:
Zitat:
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) |
Re: Ermitteln ob ein Programm oder Prozess ein Dienst ist
Zitat:
Zitat:
Bei Diensten in DLLs wird's dann nochmal etwas knackiger. Aber das geht eh nur auf Systemen, die auch APIs zum Ermitteln der Eigenschaften anbieten, soweit ich das überschauen kann ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:24 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