![]() |
Dienste auslesen und ggf. Werte ändern
Wie kann man die Dienste (aus der Computerverwaltung) auslesen, stehen die irgendwo in der Registry?
Ich würde nämlich genr ein Prog schreiben, was die Dienste ausliest, in eine Datei speichert (mit dem Wert, ob sie Deaktiviert, auf Manuell oder auf Automatisch gestellt sind) und dann mit den Diensten (auch mit dem Prog ausgelesen auf meinem andern PC) von meinem "großen" vergleicht. Danke im Vorraus. |
Re: Dienste auslesen und ggf. Werte ändern
|
Re: Dienste auslesen und ggf. Werte ändern
IMHO hat Christian Seehase hier mal Code gepostet. Zumindest glaube ich, dass ich den Code von ihm gekla... äh, dass ich von ihm inspiriert wurde ... *g* @Christian? :?
|
Re: Dienste auslesen und ggf. Werte ändern
Danke Luckie!! :party: Das geht schonmal super!
Eine Frage noch, wenn der 2. Wert hinter dem Komma, der mit ausgegeben wird, der Autostarttyp ist, finde ich ich nicht ganz rein, der Autostarttyp ist das Wichtigste! (Neben den Namen der Prozesse ;-)) Aber das hat mich schonmal ein ganzes Stück nach vorn gebracht! |
Re: Dienste auslesen und ggf. Werte ändern
Moin F.W.,
hier mal ein Beispiel, wie man die sich die Services die als Starttype "Automatisch" haben in einem Memo anzeigen lassen kann. Da ich teilweise etwas mit Borlands Deklarationen auf dem Kriegsfuss stehe, habe ich einen Teil der Funktionen/Strukturen selber deklariert. Zusätzlich muss noch die Unit WinSvc mit eingebunden werden. Auf eine Kommentierung habe ich vorerst mal verzichtet. Schau es Dir einfach mal in Ruhe an, und versuch' mal nachzuvollziehen was da passiert. Eines möchte ich allerdings schon vorab erklären: Funktionen, die eine bestimmte Buffergrösse erfordern kann man mit gezielt zu kleinem Buffer aufrufen, damit sie einem zurückgeben wieviel Platz sie brauchen. Deshalb tauchen Funktionsaufrufe mehrfach auf.
Delphi-Quellcode:
type
PENUM_SERVICE_STATUS = ^ENUM_SERVICE_STATUS; ENUM_SERVICE_STATUS = packed record lpServiceName : PCHAR; lpDisplayName : PCHAR; ServiceStatus : SERVICE_STATUS; end; PQUERY_SERVICE_CONFIG = ^QUERY_SERVICE_CONFIG; QUERY_SERVICE_CONFIG = packed record dwServiceType : DWORD; dwStartType : DWORD; dwErrorControl : DWORD; lpBinaryPathName : PCHAR; lpLoadOrderGroup : PCHAR; dwTagId : DWORD; lpDependencies : PCHAR; lpServiceStartName : PCHAR; lpDisplayName : PCHAR; end; function EnumServicesStatus( const hSCManager : DWORD; const dwServiceType : DWORD; const dwServiceState : DWORD; const lpServices : PENUM_SERVICE_STATUS; const cbBufSize : DWORD; const pcbBytesNeeded : PDWORD; const lpServicesReturned : PDWORD; const lpResumeHandle : PDWORD ) : Longbool; stdcall; external 'advapi32.dll' name 'EnumServicesStatusA'; function QueryServiceConfig( const hService : DWORD; const lpServiceConfig : PQUERY_SERVICE_CONFIG; const cbBufSize : DWORD; const pcbBytesNeeded : PDWORD ) : Longbool; stdcall; external 'advapi32.dll' name 'QueryServiceConfigA'; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var hSCDB : DWORD; hService : DWORD; pStatus : PENUM_SERVICE_STATUS; pWork : PENUM_SERVICE_STATUS; pServiceConfig : PQUERY_SERVICE_CONFIG; cbBufSize : DWORD; dwSaveBufSize : DWORD; pcbBytesNeeded : DWORD; lpServicesReturned : DWORD; lpResumeHandle : DWORD; i : integer; begin hSCDB := OpenSCManager(nil,nil,SC_MANAGER_ENUMERATE_SERVICE or GENERIC_READ); if hSCDB = 0 then begin ShowMessage(SysErrorMessage(GetLastError)); exit; end; try cbBufSize := 0; pStatus := nil; lpResumeHandle := 0; EnumServicesStatus(hSCDB,SERVICE_WIN32,SERVICE_STATE_ALL,pStatus,cbBufSize,@pcbBytesNeeded,@lpServicesReturned,@lpResumeHandle); lpResumeHandle := 0; pStatus := AllocMem(pcbBytesNeeded); try cbBufSize := pcbBytesNeeded; dwSaveBufSize := cbBufSize; if not EnumServicesStatus(hSCDB,SERVICE_WIN32,SERVICE_STATE_ALL,pStatus,cbBufSize,@pcbBytesNeeded,@lpServicesReturned,@lpResumeHandle) then begin ShowMessage(SysErrorMessage(GetLastError)); exit; end; pWork := pStatus; Memo1.Lines.Clear; for i := 1 to lpServicesReturned do begin hService := OpenService(hSCDB,pWork.lpServiceName,GENERIC_READ); if hService <> 0 then begin pServiceConfig := nil; cbBufSize := 0; pcbBytesNeeded := 0; QueryServiceConfig(hService,pServiceConfig,cbBufSize,@pcbBytesNeeded); pServiceConfig := AllocMem(pcbBytesNeeded); try cbBufSize := pcbBytesNeeded; if QueryServiceConfig(hService,pServiceConfig,cbBufSize,@pcbBytesNeeded) then begin if pServiceConfig.dwStartType = SERVICE_AUTO_START then begin Memo1.Lines.Add(pServiceConfig.lpDisplayName); end; end else begin ShowMessage(SysErrorMessage(GetLastError)); end; finally if pServiceConfig <> nil then FreeMem(pServiceConfig,cbBufSize); end; end else begin ShowMessage(SysErrorMessage(GetLastError)); end; inc(pWork); end; finally if pStatus <> nil then FreeMem(pStatus,dwSaveBufSize); end; finally CloseServiceHandle(hSCDB); end; end; |
Re: Dienste auslesen und ggf. Werte ändern
Hab den Code leider erst jetzt ausprobieren können, allerdings auch nur so, an das Projekt komm iczh erst in ein paar Tagen wieder ran (zum intensiven dran rumbasteln!). Ich muss es mal mit dem anderen abgleichen, sonst könnte man wenigstens die Prozesse, von deinem Code suchen und den Autostarttyp auf Automatisch setzen...
...und alle anderen sind manuell bzw. deaktiviert? Ich werd mir deinen Quellcode nochmal ansehen und drauf zurückkommen, wenn ich Fragen habe, ok? Also ich versuch's erstmal selbst! Danke!! :thuimb: |
Re: Dienste auslesen und ggf. Werte ändern
Moin F.W.,
am Besten schaust Du Dir mal die entsprechenden Dokumentationen im PSDK in Ruhe durch. Speziell EnumServicesStatus und QueryServiceConfig. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:07 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