Announcement

Collapse
No announcement yet.

Batch

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Batch

    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...

  • #2
    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

    Working...
    X