Управление сервисами NT

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Оформил: DeeCo

Автор: http://www.swissdelphicenter.ch

{

The following class TServiceManager can be used to manage your NT-Services.

You can do things like start, stop, pause or querying a services status.

}

{

Die folgende Klasse TServiceManager kann verwendet werden, um NT-Dienste

zu verwalten. Hierbei gibt es Funktionen wie Start, Stop, Pause sowie

Statusabfragen.

}

// Thanks for this one to Frederik Schaller as well — it’s a co-work }

unit ServiceManager;

interface

uses

SysUtils, Windows, WinSvc;

type

TServiceManager = class

private

{ Private declarations }

ServiceControlManager: SC_Handle;

ServiceHandle: SC_Handle;

protected

function DoStartService(NumberOfArgument: DWORD; ServiceArgVectors: PChar): Boolean;

public

{ Public declarations }

function Connect(MachineName: PChar = nil; DatabaseName: PChar = nil;

Access: DWORD = SC_MANAGER_ALL_ACCESS): Boolean; // Access may be SC_MANAGER_ALL_ACCESS

function OpenServiceConnection(ServiceName: PChar): Boolean;

function StartService: Boolean; overload; // Simple start

function StartService(NumberOfArgument: DWORD; ServiceArgVectors: PChar): Boolean;

overload; // More complex start

function StopService: Boolean;

procedure PauseService;

procedure ContinueService;

procedure ShutdownService;

procedure DisableService;

function GetStatus: DWORD;

function ServiceRunning: Boolean;

function ServiceStopped: Boolean;

end;

implementation

{ TServiceManager }

function TServiceManager.Connect(MachineName, DatabaseName: PChar;

Access: DWORD): Boolean;

begin

Result := False;

{ open a connection to the windows service manager }

ServiceControlManager := OpenSCManager(MachineName, DatabaseName, Access);

Result := (ServiceControlManager 0);

end;

function TServiceManager.OpenServiceConnection(ServiceName: PChar): Boolean;

begin

Result := False;

{ open a connetcion to a specific service }

ServiceHandle := OpenService(ServiceControlManager, ServiceName, SERVICE_ALL_ACCESS);

Result := (ServiceHandle 0);

end;

procedure TServiceManager.PauseService;

var

ServiceStatus: TServiceStatus;

begin

{ Pause the service: attention not supported by all services }

ControlService(ServiceHandle, SERVICE_CONTROL_PAUSE, ServiceStatus);

end;

function TServiceManager.StopService: Boolean;

var

ServiceStatus: TServiceStatus;

begin

{ Stop the service }

Result := ControlService(ServiceHandle, SERVICE_CONTROL_STOP, ServiceStatus);

end;

procedure TServiceManager.ContinueService;

var

ServiceStatus: TServiceStatus;

begin

{ Continue the service after a pause: attention not supported by all services }

ControlService(ServiceHandle, SERVICE_CONTROL_CONTINUE, ServiceStatus);

end;

procedure TServiceManager.ShutdownService;

var

ServiceStatus: TServiceStatus;

begin

{ Shut service down: attention not supported by all services }

ControlService(ServiceHandle, SERVICE_CONTROL_SHUTDOWN, ServiceStatus);

end;

function TServiceManager.StartService: Boolean;

begin

Result := DoStartService(0, »);

end;

function TServiceManager.StartService(NumberOfArgument: DWORD;

ServiceArgVectors: PChar): Boolean;

begin

Result := DoStartService(NumberOfArgument, ServiceArgVectors);

end;

function TServiceManager.GetStatus: DWORD;

var

ServiceStatus: TServiceStatus;

begin

{ Returns the status of the service. Maybe you want to check this

more than once, so just call this function again.

Results may be: SERVICE_STOPPED

SERVICE_START_PENDING

SERVICE_STOP_PENDING

SERVICE_RUNNING

SERVICE_CONTINUE_PENDING

SERVICE_PAUSE_PENDING

SERVICE_PAUSED }

Result := 0;

QueryServiceStatus(ServiceHandle, ServiceStatus);

Result := ServiceStatus.dwCurrentState;

end;

procedure TServiceManager.DisableService;

begin

{ Implementation is following… }

end;

function TServiceManager.ServiceRunning: Boolean;

begin

Result := (GetStatus = SERVICE_RUNNING);

end;

function TServiceManager.ServiceStopped: Boolean;

begin

Result := (GetStatus = SERVICE_STOPPED);

end;

function TServiceManager.DoStartService(NumberOfArgument: DWORD;

ServiceArgVectors: PChar): Boolean;

var

err: integer;

begin

Result := WinSvc.StartService(ServiceHandle, NumberOfArgument, ServiceArgVectors);

end;

end.

{/codecitation}

Добавить комментарий