Re: Wie prüfen, ob Service/Dienst -installiert- (nicht läuft
du wirst es selbst importieren müssen bzw. die suche im Forum nutzen da es andere schon gemacht haben :wink:
|
Re: Wie prüfen, ob Service/Dienst -installiert- (nicht läuft
Zitat:
Bisher habe ich neben dem WMI Ansatz die ServiceGetStatus Funktion gefunden. Das war dann auch schon alles, der Link zu Michael Puffs EnumServices führte ins Leere, da mußte ich seine Seite erstmal durchforsten. Auch gut, aber nur Ansi - und nicht das was ich will. Ich finde hier sehr viel zu Thema "Prüfen, ob Service läuft", aber nicht, ob er installiert ist. ServiceGetStatus liefert den Vergleich für:
Delphi-Quellcode:
Nun hab ich mir gedacht, ich prüfe einfach auf -1. Wenn er nicht geöffnet werden kann, ist er anscheinend nicht da. Richtig?
{*** -1 = Error opening service ***}
{*** 1 = SERVICE_STOPPED ***} {*** 2 = SERVICE_START_PENDING ***} {*** 3 = SERVICE_STOP_PENDING ***} {*** 4 = SERVICE_RUNNING ***} {*** 5 = SERVICE_CONTINUE_PENDING ***} {*** 6 = SERVICE_PAUSE_PENDING ***} {*** 7 = SERVICE_PAUSED ***} Nur der Vergleich auf -1 bzw. <> -1 liefert immer True bzw. False. So sagt es der Compiler... Bsp:
Delphi-Quellcode:
Also, bitte nicht sagen: Nutze die Suchfunktion. Das mach ich immer... :wall:
function ServiceGetStatus(sMachine, sService: PChar): DWORD;
{******************************************} {*** Parameters: ***} {*** sService: specifies the name of the service to open {*** sMachine: specifies the name of the target computer {*** ***} {*** Return Values: ***} {*** -1 = Error opening service ***} {*** 1 = SERVICE_STOPPED ***} {*** 2 = SERVICE_START_PENDING ***} {*** 3 = SERVICE_STOP_PENDING ***} {*** 4 = SERVICE_RUNNING ***} {*** 5 = SERVICE_CONTINUE_PENDING ***} {*** 6 = SERVICE_PAUSE_PENDING ***} {*** 7 = SERVICE_PAUSED ***} {******************************************} var SCManHandle, SvcHandle: SC_Handle; SS: TServiceStatus; dwStat: DWORD; begin dwStat := 0; // Open service manager handle. SCManHandle := OpenSCManager(sMachine, nil, SC_MANAGER_CONNECT); if (SCManHandle > 0) then begin SvcHandle := OpenService(SCManHandle, sService, SERVICE_QUERY_STATUS); // if Service installed if (SvcHandle > 0) then begin // SS structure holds the service status (TServiceStatus); if (QueryServiceStatus(SvcHandle, SS)) then dwStat := ss.dwCurrentState; CloseServiceHandle(SvcHandle); end; CloseServiceHandle(SCManHandle); end; Result := dwStat; end; function IsServiceRunning(sMachine, sService: PChar): Boolean; begin Result := SERVICE_RUNNING = ServiceGetStatus(sMachine, sService); end; function IsServiceInstalled(sMachine, sService: PChar): Boolean; begin Result := -1 <> ServiceGetStatus(sMachine, sService); // genau hier sagt der Compiler liefert immer True bzw. False end; Nicht böse gemeint. Gruß winkel79 |
Re: Wie prüfen, ob Service/Dienst -installiert- (nicht läuft
ich hab nach EnumServices (was du im ersten Beitrag erwähnst) gesucht.
|
Re: Wie prüfen, ob Service/Dienst -installiert- (nicht läuft
Egal, hier die Lösung. Mal wieder selbst gemacht. Ist ja in fast all meinen Threads so ;)
Delphi-Quellcode:
Der ursprüngliche Autor (hier ein paar mal zu finden, auch in der CodeLib glaube ich) legte den Rückgabewert als DWORD fest. Und wie soll das -1 annehmen? Also deswegen meckert der Compiler "immer True".
function ServiceGetStatus(sMachine, sService: PChar): Integer;
{******************************************} {*** Parameters: ***} {*** sService: specifies the name of the service to open {*** sMachine: specifies the name of the target computer {*** ***} {*** Return Values: ***} {*** -1 = Error opening service ***} {*** 1 = SERVICE_STOPPED ***} {*** 2 = SERVICE_START_PENDING ***} {*** 3 = SERVICE_STOP_PENDING ***} {*** 4 = SERVICE_RUNNING ***} {*** 5 = SERVICE_CONTINUE_PENDING ***} {*** 6 = SERVICE_PAUSE_PENDING ***} {*** 7 = SERVICE_PAUSED ***} {******************************************} var SCManHandle, SvcHandle: SC_Handle; SS: TServiceStatus; dwStat: Integer; begin dwStat := -1; // Open service manager handle. SCManHandle := OpenSCManager(sMachine, nil, SC_MANAGER_CONNECT); if (SCManHandle > 0) then begin SvcHandle := OpenService(SCManHandle, sService, SERVICE_QUERY_STATUS); // if Service installed if (SvcHandle > 0) then begin // SS structure holds the service status (TServiceStatus); if (QueryServiceStatus(SvcHandle, SS)) then dwStat := ss.dwCurrentState; CloseServiceHandle(SvcHandle); end; CloseServiceHandle(SCManHandle); end; Result := dwStat; end; function IsServiceRunning(sMachine, sService: PChar): Boolean; begin Result := SERVICE_RUNNING = ServiceGetStatus(sMachine, sService); end; function IsServiceInstalled(sMachine, sService: PChar): Boolean; begin Result := -1 <> ServiceGetStatus(sMachine, sService); end; Nun ist es ein Integer. Geht. Ohne Admin-Rechte oder UAC. Ende. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:20 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