AW: Dienste und PID?
Hallo..
Viele Dienste, gerade Systemdienste werden als Sub-Dienst mit svchost gestartet. Diese Dienste können in deiner Enum zwar einzeln aufgelistet sein, haben aber keine PID, weil nur der Main-Dienst (svchost) eine bekommt. Somit müsstest Du wohl nach einem anderen Weg suchen, um weitere Infos zu bekommen. Vielleicht gibs ja eine API hierfür, den Tools wie der ProzessExplorer zeigen ja auch mehr Infos. |
AW: Dienste und PID?
Hallo,
der process explorer macht das nur für Prozesse. Da ist das "kein Problem". Das kriege ich auch, vielleicht sogar noch mehr - soweit man mit 32Bit im 64er System rumwerkeln kann. Wie gesagt, das Problem sind die Dienste... Ich habe gerade im Taskmanager nachgesehen. Tatsächlich!!! Viele Dienste haben auch da keine PID. Die Dienste, die da eine haben, haben auch bei mir eine. Also, wenn MS selber da nicht mehr liefert... Nun ja, schaun mer mal, was man da noch so machen kann... Gruß Mattze |
AW: Dienste und PID?
Wozu brauchst du die PID denn?
|
AW: Dienste und PID?
Zitat:
|
AW: Dienste und PID?
Hallo,
wozu die PID? Das ist genau das "Wozu" meiner Anfangsfrage. Ich möchten rauskriegen, ob der Dienst nun 32- oder 64-Bit-breit ist. Bei Prozessen nehme mich dazu IsWow64Process. Dazu muss man zuerst mal OpenProcess machen und dazu braucht man die PID. Ich wollte nun probieren, ob das bei Diensten vielleicht genauso funktioniert. Übrigens habe ich eben noch ein Problem gesehen. Über EnumServicesStatusEx und GetServiceExecutablePath kriegt man den Pfad der Dienste-Datei. Wie üblich ist der oft %Systemroot%\System32\drivers\[Dienstdatei]. (Z. Bsp. c:\Windows\system32\drivers\cdrom.sys) Unter XP mag das auch noch gestimmt haben. Unter Win 7 pro stimmt das nicht mehr! (Immer???) (Z. Bsp.: Die Cdrom.sys liegt in: C:\Windows\System32\DriverStore\FileRepository\cdr om.inf_amd64_neutral_0b3d0d1942ab684b\cdrom.sys und C:\Windows\winsxs\amd64_cdrom.inf_31bf3856ad364e35 _6.1.7601.17514_none_bdcf6151ba66f48b\cdrom.sys) Also, man kann nicht mal so einfach die Dienste-Datei untersuchen nach 32 oder 64Bit. Also, ich bin nun erst mal am Ende meiner Ideen angekommen. Wie kriege ich denn nun die richtige Datei? Gruß Mattze |
AW: Dienste und PID?
IsWow64Process funktioniert definitiv auch bei Services. Dass du für bestimmte Services keine PID bekommst, liegt wie gesagt daran, dass der entsprechende Service momentan nicht ausgeführt wird.
Musst du denn auch für inaktive Services ermitteln können, ob es sich um einen 32 oder 64 Bit Prozess handelt? Bzw. was genau ist das Problem mit GetServiceExecutablePath? Konnte dir da nicht ganz folgen. Für laufende Prozesse kannst du den Pfad hiermit bestimmen: http://www.delphipraxis.net/160046-d...ermitteln.html |
AW: Dienste und PID?
Sys Dateien sind ja auch eigentlich Treiber und keine Dienste.
|
AW: Dienste und PID?
Hallo,
vielen Dank für die schnelle Antwort. Das mit dem 64Bit-Pfad werde ich probieren. Müssen muss ich das eigentlich alles nicht, aber wissen möchte ich es doch gern. Ich möchte soviele Infos wie möglich zu Prozessen und Diensten bekommen. Einfach aus dem Interesse heraus, was denn alles machbar ist. Und man kriegt auch ein bisschen Gefühl dafür, wie man mit den API-Funktionen, speziell, wenn man sie selber einbauen muss, umzugehen hat. Und da das bei Prozessen geht und Du schreibst, dass das IsWow64Process auch bei Diensten klappt, möchte ich das gerne machen... Wie gesagt, selbst bei beendeten Diensten, die Windows ja noch in der Liste der Dienste angibt, bin ich der Meinung, dass Windows durchaus weiß, ob 32- oder 64Bit. Ich probiere weiter... Nun, das mit den sys-Dateien ist schon klar. Nur, das Windows eben wie beschrieben den (falschen) Ort der Cdrom.sys in der Diensteliste angibt zum Dienst Cdrom. Als Typ sagt Windows sogar: Gerätetreiber. Trotzdem: Diensteliste!!! (EnumSERVICESStatusEx) Gruß und schönen Abend Mattze |
AW: Dienste und PID?
Hallo Zacherl,
im Grunde gießt Du Wasser auf meine Rumreitermühlen. Du betonst zwar "laufende Prozesse", aber... Da Windows die Dienste ja auch mal startet, muss es doch auch ohne PID wissen, wo die wirklich sind. (Bei Prozessen muss Windows ja auch vor dem Start - also auch ohne PID - wissen, wo er sie herholen soll.) Und, z. Bsp., das will ich eben auch wissen. Ob das undokumentiert ist? Übrigens WMI mit W32_SystemServices gibt (im 64er System?) auch den "falschen" Pfad aus! Für cdrom.sys als auch C:\Windows\system32\drivers. Gruß Mattze |
AW: Dienste und PID?
Ja klar, die Prozesspfade hat das System selbstverständlich. Ich werde das gleich selbst mal testen. Bei mir zumindest liegt die cdrom.sys allerdings an genau der genannten Stelle (C:\Windows\system32\drivers\cdrom.sys).
Mein nicht optimierter, auf die Schnelle zusammengeschusterter Testcode:
Delphi-Quellcode:
Erhalte für laufende Prozess wie erwartet eine PID, für Treiber und inaktive Prozesse 0. Die Pfade habe ich stichprobenartig überprüft und die stimmen auch soweit.
procedure PrintServicePaths(IncludeDrivers, IncludeInactive: Boolean);
type ENUM_SERVICE_STATUSW = record lpServiceName: LPWSTR; lpDisplayName: LPWSTR; ServiceStatus: SERVICE_STATUS_PROCESS; end; PENUM_SERVICE_STATUSW = ^ENUM_SERVICE_STATUSW; var SvcMgr, Svc: SC_HANDLE; SvcType, SvcState, SizeNeeded, ServiceCount: DWord; Services, Service: PENUM_SERVICE_STATUSW; I: Integer; Config: PQueryServiceConfigW; begin SvcMgr := OpenSCManager(nil, nil, SC_MANAGER_CONNECT or SC_MANAGER_ENUMERATE_SERVICE); if (SvcMgr <> 0) then try SvcType := SERVICE_WIN32; if (IncludeDrivers) then begin SvcType := SERVICE_WIN32 or SERVICE_DRIVER; end; SvcState := SERVICE_ACTIVE; if (IncludeInactive) then begin SvcState := SERVICE_STATE_ALL; end; if not EnumServicesStatusExW(SvcMgr, SC_ENUM_PROCESS_INFO, SvcType, SvcState, nil, 0, @SizeNeeded, @ServiceCount, nil, nil) then begin if (GetLastError <> ERROR_MORE_DATA) then begin RaiseLastOsError; end; end; GetMem(Services, SizeNeeded); try if not EnumServicesStatusExW(SvcMgr, SC_ENUM_PROCESS_INFO, SvcType, SvcState, PByte(Services), SizeNeeded, @SizeNeeded, @ServiceCount, nil, nil) then begin RaiseLastOsError; end; Service := Services; for I := 0 to ServiceCount - 1 do begin WriteLn(Format('[%4d] %s', [Service^.ServiceStatus.dwProcessId, Service^.lpServiceName])); Svc := OpenService(SvcMgr, Service^.lpServiceName, SERVICE_QUERY_CONFIG); if (Svc <> 0) then try if not QueryServiceConfig(Svc, nil, 0, SizeNeeded) then begin if (GetLastError <> ERROR_INSUFFICIENT_BUFFER) then begin RaiseLastOsError; end; end; GetMem(Config, SizeNeeded); try if not QueryServiceConfig(Svc, Config, SizeNeeded, SizeNeeded) then begin RaiseLastOsError; end; WriteLn(' Path: ' + Config^.lpBinaryPathName); finally FreeMem(Config); end; finally CloseServiceHandle(Svc); end else RaiseLastOsError; Inc(Service); end; finally FreeMem(Services); end; finally CloseServiceHandle(SvcMgr); end else RaiseLastOsError; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:16 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