Hallo Leute, kann mir einer sagen wie ich einen Dienst bzw. einen Service unter XP, 2000 & Co starten bzw. stoppen kann. Über z.B eine Batch...
Announcement
Collapse
No announcement yet.
Batch
Collapse
X
-
Hallo,
das folgende Beispiel demonstriert den direkten Zugriff auf den <b>Service Control Manager</b> (SCM) des Betriebssystems:
<pre>
{ ************************************************** **************
Autor : Andreas Kosch
Compiler : Delphi 6.0 Enterprise
Betriebssystem : Windows 2000 SP1
Erstellt am : 05.07.2001
Beschreibung : Eigener Dienst-Guardian überwacht und startet
einen anderen Dienst
************************************************** ************** }
unit OSSrvGuard_Impl;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
SvcMgr, Dialogs;
type
TOSSrvGuard = class(TService)
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServiceExecute(Sender: TService);
private
{ Private-Deklarationen }
public
function GetServiceController: TServiceController; override;
{ Public-Deklarationen }
end;
var
OSSrvGuard: TOSSrvGuard;
implementation
{$R *.DFM}
uses WinSvc;
const
cID_START = 1;
cID_STOP = 2;
cID_ERROR = 3;
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
OSSrvGuard.Controller(CtrlCode);
end;
function TOSSrvGuard.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;
procedure TOSSrvGuard.ServiceStart(Sender: TService; var Started: Boolean);
begin
LogMessage('OSSrvGuard ServiceStart', EVENTLOG_INFORMATION_TYPE,
0, cID_START);
end;
procedure TOSSrvGuard.ServiceExecute(Sender: TService);
resourcestring
cExecServiceName = 'OSServiceTest';
var
aSrvHdl : SC_HANDLE;
aSCM : SC_HANDLE;
aStatus : TServiceStatus;
Argv : PChar;
begin
ServiceThread.ProcessRequests(False);
aSCM := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if (aSCM <= 0) then
begin
LogMessage('OSSrvGuard OpenSCManager-Fehler',
EVENTLOG_ERROR_TYPE, 0, cID_ERROR);
Exit;
end;
ServiceThread.ProcessRequests(False);
try
aSrvHdl := OpenService(aSCM, PChar(cExecServiceName),
SERVICE_ALL_ACCESS);
if (aSrvHdl <= 0) then
begin
LogMessage('OSSrvGuard OpenService-Fehler',
EVENTLOG_ERROR_TYPE, 0, cID_ERROR);
Exit;
end;
ServiceThread.ProcessRequests(False);
// überwachten Dienst starten
Winsvc.StartService(aSrvHdl, 0, Argv);
// überwachten Dienst kontrollieren
while not Terminated do
begin
ServiceThread.ProcessRequests(False);
if not QueryServiceStatus(aSrvHdl, aStatus) or
((aStatus.dwCurrentState <> SERVICE_RUNNING) and
(aStatus.dwCurrentState <> SERVICE_START_PENDING)) then
begin
CloseServiceHandle(aSrvHdl);
aSrvHdl := OpenService(aSCM, PChar(cExecServiceName),
SERVICE_ALL_ACCESS);
if (aSrvHdl <= 0) then
begin
LogMessage('OSSrvGuard OpenService-Fehler',
EVENTLOG_ERROR_TYPE, 0, cID_ERROR);
Exit;
end;
Winsvc.StartService(aSrvHdl, 0, Argv);
LogMessage('OSSrvGuard StartService', EVENTLOG_INFORMATION_TYPE, 0, 6);
end
else
Sleep(2000);
end;
// überwachten Dienst stoppen
ServiceThread.ProcessRequests(False);
if ControlService(aSrvHdl, SERVICE_CONTROL_STOP, aStatus) then
begin
while (QueryServiceStatus(aSrvHdl, aStatus)) do
begin
if aStatus.dwCurrentState = SERVICE_STOP_PENDING then
begin
ServiceThread.ProcessRequests(False);
Sleep(1000);
end
else
Break;
ServiceThread.ProcessRequests(False);
end;
if aStatus.dwCurrentState <> SERVICE_STOPPED then
begin
LogMessage('OSSrvGuard SERVICE_STOPPED-Fehler',
EVENTLOG_ERROR_TYPE, 0, cID_ERROR);
Exit;
end
else
LogMessage('OSSrvGuard SERVICE_STOPPED',
EVENTLOG_INFORMATION_TYPE, 0, cID_STOP);
end;
CloseServiceHandle(aSrvHdl);
finally
CloseServiceHandle(aSCM);
end;
end;
end.
</pre>
Im Win32 SDK oder im Windows 2000 Resource Kit ist das Tool <b>SC.EXE</b> zu finden, dass als Consolen-Anwendungen aus einer BAT-Datei heraus ebenfalls Dienste konfigurieren kann
Comment