AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Get Service State

Ein Thema von DaSchwoa · begonnen am 25. Nov 2020 · letzter Beitrag vom 25. Nov 2020
Antwort Antwort
Seite 1 von 2  1 2   
DaSchwoa

Registriert seit: 15. Sep 2020
13 Beiträge
 
#1

Get Service State

  Alt 25. Nov 2020, 14:13
Hallo Leute
Ich habe jetzt einige Services Programmiert und möchte in einem VLC Programm diese Starten und Stoppen bzw überprüfen ob sie gestartet oder gestoppt sind. Ich habe viele Seiten durchsucht und auch bei hier einige Threads gelesen.
Um zu überprüfen welchen Status ein Service hat habe ich mich für diese Lösung entschieden:
Code:
function TFrmManage.ServiceGetStatus(sService: String): Boolean;
var
   SCManager, SCService: THandle;
   ServiceStatus: TServiceStatus;

begin
   Result:= false;
  SCManager := OpenSCManager(nil, nil, SC_MANAGER_CONNECT);
  if SCManager = 0 then
  begin
    ShowMessage('Exit 1');
    Exit;
  end;

  try
    SCService := OpenService(SCManager, PChar(sService), SERVICE_START or SERVICE_STOP or SERVICE_QUERY_STATUS);

    if SCService = 0 then
    begin
      ShowMessage('Exit 2');
      Exit;
    end;

    try
      ZeroMemory(@ServiceStatus, SizeOf(ServiceStatus));
      QueryServiceStatus(SCService, ServiceStatus);
      Result:= ServiceStatus.dwCurrentState = SERVICE_RUNNING;
      ShowMessage(BoolToStr(result));
    finally
      CloseServiceHandle(SCService);
    end;

  finally
    CloseServiceHandle(SCManager);
  end;
end;
Jedoch wenn ich den Namen des Services angebe werdich ich bei Exit 2 immer aus der Procedure geworfen, da es das Service nicht kennt.
Als namen habe ich angegeben: Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlS et\Services\MeinSrv

Habe ich einen Falschen Namen angegeben oder ist ein Fehler im Code?

Geändert von DaSchwoa (25. Nov 2020 um 14:16 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai
Online

Registriert seit: 9. Apr 2006
1.679 Beiträge
 
Delphi 5 Professional
 
#2

AW: Get Service State

  Alt 25. Nov 2020, 14:21
Die Win32 API Service-Funktionen wollen nur den Namen, nichts weiter. Kurz gesagt: Lass den Registry-Pfad weg.

Grüße
Dalai
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.016 Beiträge
 
Delphi 12 Athens
 
#3

AW: Get Service State

  Alt 25. Nov 2020, 14:23
Was hast du denn bei deinem Service als Namen angegeben?
"Nur" den mußt du dann auch verwenden.

CMD: sc query
und da dann siehe SERVICE_NAME (manchmal kann auch der DISPLAY_NAME genutzt werden)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
DaSchwoa

Registriert seit: 15. Sep 2020
13 Beiträge
 
#4

AW: Get Service State

  Alt 25. Nov 2020, 14:43
Danke für die Antworten.
Ich habe es jetzt auch mit dem Service Name versucht. Jedoch falle ich auf der selben Zeile raus :/

Bei SC Query wird mein Dienst nicht angezeigt obwohl er installiert ist. Auch im Registrierungs-Editor ist er aufgelistet wie im Bild unten zu sehen ist:
Miniaturansicht angehängter Grafiken
unbenannt.png  
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai
Online

Registriert seit: 9. Apr 2006
1.679 Beiträge
 
Delphi 5 Professional
 
#5

AW: Get Service State

  Alt 25. Nov 2020, 15:13
Wie wurde der Dienst installiert? Einfach nur Registry-Zweig anlegen klappt in der Regel nicht, weil der ServiceManager dann nichts davon mitbekommt.

Grüße
Dalai
  Mit Zitat antworten Zitat
DaSchwoa

Registriert seit: 15. Sep 2020
13 Beiträge
 
#6

AW: Get Service State

  Alt 25. Nov 2020, 15:17
der dienst wurde mit CMD: MeinDienst.exe /install installiert
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai
Online

Registriert seit: 9. Apr 2006
1.679 Beiträge
 
Delphi 5 Professional
 
#7

AW: Get Service State

  Alt 25. Nov 2020, 15:46
Dann würde ich den Dienst nochmals deinstallieren und wieder installieren. Und danach testen mit
Code:
sc query <dienstname>
Grüße
Dalai
  Mit Zitat antworten Zitat
DaSchwoa

Registriert seit: 15. Sep 2020
13 Beiträge
 
#8

AW: Get Service State

  Alt 25. Nov 2020, 15:54
Habe ich gemacht. Mit sc query MeinDienst finde ich das Service. Ich kann es auch über die Dienste app starten und stoppen.
Nur meine Prozedur findet das Service nicht. (SCService = 0)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai
Online

Registriert seit: 9. Apr 2006
1.679 Beiträge
 
Delphi 5 Professional
 
#9

AW: Get Service State

  Alt 25. Nov 2020, 16:23
Also geht's nun mit sc query im Vergleich zu vorher? Das ist ja schon mal ein Fortschritt.

Ich empfehle, eine ordentliche Fehlerbehandlung zu machen. Also sowas wie
Delphi-Quellcode:
if SCService = 0 then
    RaiseLastOsError;
statt einfach nur eine generische Meldung auszugeben. Meine Vermutung: Starten und Stoppen von Diensten ist Administratoren vorbehalten, daher wird das Öffnen des Dienstes mit diesen Flags wegen fehlender Rechte nicht klappen. Wenn du nur den Status des Dienstes ermitteln willst, reicht das SERVICE_QUERY_STATUS.

Grüße
Dalai
  Mit Zitat antworten Zitat
TiGü
Online

Registriert seit: 6. Apr 2011
Ort: Berlin
3.058 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Get Service State

  Alt 25. Nov 2020, 16:27
Dalei hat eigentlich schon alles gesagt.

Ansonsten probiere mal das hier:
Delphi-Quellcode:
function TFrmManage.ServiceGetStatus(sService: String): Boolean;
var
   SCManager, SCService: SC_HANDLE;
   ServiceStatus: TServiceStatus;
begin
  Result:= false;
  SCManager := OpenSCManager(nil, nil, SC_MANAGER_CONNECT);
  if SCManager = 0 then
  begin
    ShowMessage('Exit 1');
    Exit;
  end;

  try
    SCService := OpenService(SCManager, PChar(sService), SERVICE_START or SERVICE_STOP or SERVICE_QUERY_STATUS);

    if SCService = 0 then
    begin
      ShowMessage('Exit 2 - Endlich, nun weiß ich, warum es scheitert:' +
        sLineBreak +
        SysErrorMessage(GetLastError));
      Exit;
    end;

    try
      ZeroMemory(@ServiceStatus, SizeOf(ServiceStatus));
      QueryServiceStatus(SCService, ServiceStatus);
      Result:= ServiceStatus.dwCurrentState = SERVICE_RUNNING;
      ShowMessage(BoolToStr(Result, True));
    finally
      CloseServiceHandle(SCService);
    end;

  finally
    CloseServiceHandle(SCManager);
  end;
end;
Wenn dir dann ein fröhliches "Zugriff verweigert" entgegenschlägt, dann machst du nur SCService := OpenService(SCManager, PChar(sService), SERVICE_QUERY_STATUS);
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:19 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