Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Wie prüfen, ob Service/Dienst -installiert- (nicht läuft!) (https://www.delphipraxis.net/101017-wie-pruefen-ob-service-dienst-installiert-nicht-laeuft.html)

Assertor 7. Okt 2007 00:10


Wie prüfen, ob Service/Dienst -installiert- (nicht läuft!)
 
Hallo,

kennt jemand einen Weg zu prüfen, ob ein Dienst installiert ist?

Ich möchte in einem Tool anbieten, einen Dienst zu installieren, wenn dieser nicht bereits installiert ist (dann halt die Option ist zu Deinstallieren).

Die Prüfung sollte ohne UAC Elevation unter Vista laufen...

Die Prüfung, ob ein Dienst läuft hab ich hier schon gefunden. Auch die Beschreibungen etc. Aber wie prüft man die Existenz eines Dienstes. Ist EnumServices der einzige Weg?

Ich dachte mehr an IsServiceInstalled: True/False ;)

Gruß winkel79

Mazel 7. Okt 2007 08:25

Re: Wie prüfen, ob Service/Dienst -installiert- (nicht läuft
 
Hallo,

eine weitere Möglichkeit wär das Auslesen über WMI. Jetzt weis ich aber nicht genau, was du mit "Existens eines Dienstes" meinst. Wenn der Dienst aufgelistet wird, ist er auch vorhanden.

Dezipaitor 7. Okt 2007 08:31

Re: Wie prüfen, ob Service/Dienst -installiert- (nicht läuft
 
Wenn du in einem Restaurant bist und wissen möchtest, ob es eine bestimmte Speise gibt. Welche Möglichkeiten hast du dann?

1. Du schaust dir die Speisekarte an, indem du dabei jede Speise, mit der gewünschen vergleichst. Das ist eine Service-Aufzählung.
2. Du fragst den Kelner. Er gibt die Ja oder Nein als Antwort. Das ist vergleichbar mit dem Verlangein eines Dienstes (Open).

paritycheck 7. Okt 2007 10:39

Re: Wie prüfen, ob Service/Dienst -installiert- (nicht läuft
 
Hi,

Du könntest versuchen die Dienste aus "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Servi ces\" auszulesen. Dort sind allerdings auch Treiber aufgelistet. Ich bin mir jetz nicht sicher ob das 100% korrekt ist aber soweit ich das ableiten konnte haben Dienste den Key "ObjectName" welcher bei den Treibern nicht vorhanden ist.

Unter den einzelnen Dienst Schlüsseln gibts ausserdem noch folgende Werte die für Dich interessant sein könnten:

DisplayName -> Name des Dienstes
Description -> Beschreibung
Imagepath -> Dateiname
Start -> Starttyp: 0 = Boot, 1= System, 2 = Automatisch, 3 = Manuell, 4 = 'Deaktiviert';

Gruss

Phoenix 7. Okt 2007 10:42

Re: Wie prüfen, ob Service/Dienst -installiert- (nicht läuft
 
Also WMI ist imho der einfachste Weg.
Irgendwo habe ich hier mal einen WMI-Browser gepostet, der kann Dienste auflisten (und diese Starten / Stoppen / Pausieren) etc.
Hier kannst Du dann nachgucken, ob Dein Dienst vorhanden ist.

Für sämtliche weiteren Funktionen (deinstallieren, installieren, starten, stoppen etc.) benötigst Du aber Adminrechte und damit die UAC Elevation unter Vista.

Assertor 7. Okt 2007 10:44

Re: Wie prüfen, ob Service/Dienst -installiert- (nicht läuft
 
Hallo,

Zitat:

Zitat von Mazel
was du mit "Existens eines Dienstes" meinst

Ob er vorhanden ist, also in der Dienstverwaltung von Windows aufgeführt wird.

Zitat:

Zitat von Dezipaitor
1. Du schaust dir die Speisekarte an, indem du dabei jede Speise, mit der gewünschen vergleichst. Das ist eine Service-Aufzählung.
2. Du fragst den Kelner. Er gibt die Ja oder Nein als Antwort. Das ist vergleichbar mit dem Verlangein eines Dienstes (Open).

Sehr abstrakt und so hatte ich es bereits auch verstanden.

Bekomme ich beim Open aber keine Probleme mit den Rechten und der UAC? Es geht mir ja gerade darum in einem Programm das unter den Rechten "asInvoker" läuft dies zu prüfen...

Mist, edit zu schnell. Ihr seid aber fix ;) Gut, dann setzte ich mich mal mit WMI auseinander. Geht doch ab Win2k, oder? NT schließ ich dann per Setup bzw. OS-Check aus...

Gruß winkel79

Phoenix 7. Okt 2007 10:58

Re: Wie prüfen, ob Service/Dienst -installiert- (nicht läuft
 
Bevor Du zu langse suchst: Hier ist das Beispielprogramm.

Assertor 7. Okt 2007 12:32

Re: Wie prüfen, ob Service/Dienst -installiert- (nicht läuft
 
Danke, Phoenix.

Dann werd ich mir das mal ansehen.

Gruß winkel79

SirThornberry 7. Okt 2007 12:45

Re: Wie prüfen, ob Service/Dienst -installiert- (nicht läuft
 
was spricht gegen das Auflisten der Services?

Assertor 7. Okt 2007 12:47

Re: Wie prüfen, ob Service/Dienst -installiert- (nicht läuft
 
Zitat:

Zitat von SirThornberry
was spricht gegen das Auflisten der Services?

Nichts! Und wie? Ist das etwas in WinSvc oder SvcMgr schon enthalten?

Ich möchte nur wissen, ob es sowas schon gibt, damit ich nicht das Rad neu erfinde...

SirThornberry 7. Okt 2007 12:57

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:

Assertor 7. Okt 2007 13:03

Re: Wie prüfen, ob Service/Dienst -installiert- (nicht läuft
 
Zitat:

Zitat von SirThornberry
die suche im Forum nutzen da es andere schon gemacht haben :wink:

Ich suche jetzt seit gestern hier rum. Wenn es einen Counter für die Forensuche gäbe, würde man das auch sehen :(

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:
{*** -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 ***}
Nun hab ich mir gedacht, ich prüfe einfach auf -1. Wenn er nicht geöffnet werden kann, ist er anscheinend nicht da. Richtig?
Nur der Vergleich auf -1 bzw. <> -1 liefert immer True bzw. False. So sagt es der Compiler...

Bsp:
Delphi-Quellcode:
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;
Also, bitte nicht sagen: Nutze die Suchfunktion. Das mach ich immer... :wall:

Nicht böse gemeint.

Gruß winkel79

SirThornberry 7. Okt 2007 13:05

Re: Wie prüfen, ob Service/Dienst -installiert- (nicht läuft
 
ich hab nach EnumServices (was du im ersten Beitrag erwähnst) gesucht.

Assertor 7. Okt 2007 13:15

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:
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;
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".

Nun ist es ein Integer. Geht. Ohne Admin-Rechte oder UAC.

Ende.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:28 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