![]() |
Herausfinden ob ein bestimmter Service installiert ist
hallo
ich möchte möglichst einfach rausfinden ob ein bestimmter service installiert ist, bevor ich den Status diese Service abfrage. wie ich den Status des Service abfrage ist mir klar und auch schon eingebaut, nur hab ich das Problem, dass wenn der Service NICHT installiert ist, die Abfrage als Resultat bringt der Service sei "running" also er laufe, was natürlich quatsch ist. |
Re: Herausfinden ob ein bestimmter Service installiert ist
Folgende Funktion liefert E_FAIL zurück, wenn der Service nicht installiert ist. Getestet unter Win2003.
Delphi-Quellcode:
...:cat:...
uses
WinSvc; function ServiceGetStatus(sMachine, sService: AnsiString): Integer; var srvManager,srvHandle: SC_Handle; srvStatus: TServiceStatus; hStat: Integer; begin hStat := E_FAIL; srvManager := OpenSCManager(PChar(sMachine), nil, SC_MANAGER_CONNECT); if srvManager > 0 then begin srvHandle := OpenService(srvManager, PChar(sService), SERVICE_QUERY_STATUS); if srvHandle > 0 then begin if QueryServiceStatus(srvHandle, srvStatus) then hStat := srvStatus.dwCurrentState; CloseServiceHandle(srvHandle); end; CloseServiceHandle(srvManager); end; Result := hStat; end; |
Re: Herausfinden ob ein bestimmter Service installiert ist
Zitat:
Ich versteh das nicht... |
Re: Herausfinden ob ein bestimmter Service installiert ist
Zitat:
...:cat:... |
Re: Herausfinden ob ein bestimmter Service installiert ist
Warum nicht EnumServicesStatus(Ex)?
Alles andere ist nur eine Krücke. (BTW, Handles sind keine Integer - ein Vergleich auf > 0 ist meiner bescheidenen Meinung nach 'unpassend') |
Re: Herausfinden ob ein bestimmter Service installiert ist
Zitat:
Zitat:
|
Re: Herausfinden ob ein bestimmter Service installiert ist
Zitat:
|
Re: Herausfinden ob ein bestimmter Service installiert ist
Schonmal EnumServicesStatusEx() oder EnumServicesStatus() versucht? Oder muß man hier immer sofort ein mundgerechtes Beispiel dazugeben?!
|
Re: Herausfinden ob ein bestimmter Service installiert ist
Zitat:
Ich habe nicht nach einem mundgerechten Beispiel gesucht sondern nach einer Möglichkeit. Solche Aussagen liebt man wirklich :roll: |
Re: Herausfinden ob ein bestimmter Service installiert ist
Ja das war ein Hinweis schon weiter oben von Nico. Aber du ignorierst offenbar Nicos Vorschlag geflissentlich, weil du dann die Doku durchlesen müßtest o.ä?!
Ich werde mich mal eben an ein kleines Beispiel setzen, damit du nicht zu sehr suchen mußt ... dauert ein paar Minuten. Also Geduld. |
Re: Herausfinden ob ein bestimmter Service installiert ist
Delphi-Quellcode:
uses
WinSvc; type TAnswer = (aUnknown, aYes, aNo); function IsServiceInstalled(const MachineName, ServiceName: string; ServiceType: DWORD = SERVICE_DRIVER or SERVICE_WIN32; ServiceState: DWORD = SERVICE_STATE_ALL): TAnswer; const MAX_SERVICE_NAME = 256; MAX_DISPLAY_NAME = 256; type PEnumServiceStatusBuffer = ^TEnumServiceStatusBuffer; TEnumServiceStatusBuffer = record EnumService: TEnumServiceStatus; ServiceName: array [0..MAX_SERVICE_NAME-1] of Char; DisplayName: array [0..MAX_DISPLAY_NAME-1] of Char; end; var SCManager: SC_HANDLE; EnumBuffer: array [0..7] of TEnumServiceStatusBuffer; // ~4KB Stack size BytesNeeded: DWORD; ResumeHandle: DWORD; ServicesReturned: DWORD; Service: PEnumServiceStatus; Index: DWORD; begin Result := aUnknown; SCManager := OpenSCManager(PChar(MachineName), SERVICES_ACTIVE_DATABASE, SC_MANAGER_ENUMERATE_SERVICE); if (SCManager <> 0) then try Result := aNo; ResumeHandle := 0; while EnumServicesStatus(SCManager, ServiceType, ServiceState, EnumBuffer[0].EnumService, SizeOf(EnumBuffer), BytesNeeded, ServicesReturned, ResumeHandle) or (GetLastError = ERROR_MORE_DATA) do begin Service := @EnumBuffer[0].EnumService; for Index := 1 to ServicesReturned do begin if (StrIComp(PChar(ServiceName), Service.lpServiceName) = 0) then begin Result := aYes; Break; end; Inc(Service); end; if (Result = aYes) then Break; if (ResumeHandle = 0) then Break; end; finally CloseServiceHandle(SCManager); end; end; procedure TForm1.Button1Click(Sender: TObject); begin case IsServiceInstalled(EmptyStr, 'Messenger') of aUnknown: ShowMessage('Vielleicht.'); aYes: ShowMessage('Scheint so.'); aNo: ShowMessage('Wohl nicht.'); else ShowMessage('Hmmm.'); end; end; |
Re: Herausfinden ob ein bestimmter Service installiert ist
Danke Nico! Das spart mir Zeit :zwinker:
|
Re: Herausfinden ob ein bestimmter Service installiert ist
Zitat:
ich hab lediglich die frage von sakura beantwortet! ich würds nochmals durchlesen |
Re: Herausfinden ob ein bestimmter Service installiert ist
Danke an Nico und die Beteiligten
Es funzt :) aber nochmal... ich hab nicht gewartet das mir einer den code hinfözelt nei nein.. das habt ihr falsch verstanden. ich habe nix dergleichen verlauten lassen, also bitte nicht alle Foren User in den gleichen Topf werfen. Habe in der Zwischenzeit nämlich im Internet geforscht und ähnliche Funktionen aufgetrieben... war also nicht untätig wie mir der Mephistopheles unterstellen will... amen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:41 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