Einzelnen Beitrag anzeigen

nahpets
(Gast)

n/a Beiträge
 
#5

Re: Laufende Dienste abfragen (lokal und Netzwerk?)

  Alt 24. Sep 2009, 12:50
Hallo,

schau Dir bitte mal das da an: ServiceManager. Wenn ich das recht verstehe, handelt es sich um eine Klasse, mit der Du den Zustand eines Dienstes auf einem "beliebigen" Rechner abfragen kannst und den Zustand auch ändern kannst. Es ist damit z. B. möglich, remote auf einem anderen Rechner Dienste zu überwachen und ggfls. gestoppte Dienste wieder zu starten.

ein Auszug aus der Benutzung dieser Klasse:
Delphi-Quellcode:
...
Try
  ServiceManager.MachineName := '\\' + sServer; // Servername
  ServiceManager.ServiceName := sl[k]; // Liste der Dienste, die geprüft werden sollen
  iError := 0;
  Repeat
    Inc(iError);
  Until ServiceManager.Open or (iError >= 3);
  iError := 0;
  Repeat
    Inc(iError);
  Until (ServiceManager.State <> 0) or (iError >= 3);
  Case ServiceManager.State Of
    SERVICE_RUNNING : sColor := sEvenOdd; // Status ist okay.
    SERVICE_START_PENDING,
    SERVICE_CONTINUE_PENDING : sColor := ' class="yellow" '; // Status wird vermutlich in Kürze okay sein.
    SERVICE_STOP_PENDING,
    SERVICE_PAUSE_PENDING : Begin // Status muß geändert werden.
                                     // Hier müssen wir warten, bis Service angehalten bzw. beendet wurde.
                                 sColor := ' class="red" ';
                                 bMailIt := True;
                               End;
    SERVICE_STOPPED : Begin // Status muß geändert werden.
                                 If Not ServiceManager.Start Then Begin
                                   sColor := ' class="red" ';
                                 End;
                                 Case ServiceManager.State Of
                                   SERVICE_RUNNING : Begin
                                                       sColor := ' class="yellow" '; // Status ist okay.
                                                       bMailIt := True;
                                                     end;
                                 else begin
                                     sColor := 'class="red"';
                                     slSSI.Add('<tr><th ' + sColor + ' colspan="5">
                                            + 'Service konnte nicht gestartet werden?' + '</th></tr>');
                                     bMailIt := True;
                                   end;
                                 end;
                               End;
    SERVICE_PAUSED : Begin // Status muß geändert werden.
                                 sColor := ' class="red" ';
                                 ServiceManager.Continue;
                                 iError := 0;
                                 while ServiceManager.IsPending
                                 and (iError < 30) do Begin // bis zu 15 Sekunden auf den Start warten
                                   Sleep(500);
                                   Inc(iError);
                                 end;
                                 Case ServiceManager.State Of
                                   SERVICE_RUNNING : sColor := ''; // Status ist okay.
                                 else
                                   bMailIt := True;
                                 end;
                               End;
  Else
    sColor := ' class="red" '; // Status muß durch Anwender geprüft werden.
    bMailIt := True;
  End;
  ServiceManager.Close;
Except
  On e : Exception Do Begin
    ErrorLog(tmDienste.Name + ' Exception: ' + e.Message,0);
  End;
End;
...
Der Codeausschnitt ist so nicht zu verwenden, er dient nur als "Ideenlieferant". Er wird in einem Dienst benutzt, der zur Serverüberwachung u. a. das Laufen definierter Dienste prüft und ggfls. die Dienste neu startet bzw. im Fehlerfalle per Mail den Admin benachrichtigt. Der Dienst läuft auf mehreren Servern, die sich so gegenseitig überwachen.
  Mit Zitat antworten Zitat