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.