Как запустить и остановить сервис (или получить его статус)

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

— Почему программисты не заливают в машину 95-й бензин?

— Боятся, что повиснет.

Здесь представлены две функции ServiceStart и ServiceStop, которые показывают, как пользоваться API функциями OpenSCManager, OpenService и т.д.:

function ServiceStart(aMachine, aServiceName: string ): boolean;

// aMachine это UNC путь, либо локальный компьютер если пусто

var

h_manager,h_svc: SC_Handle;

svc_status: TServiceStatus;

Temp: PChar;

dwCheckPoint: DWord;

begin

svc_status.dwCurrentState := 1;

h_manager := OpenSCManager(PChar(aMachine), nil, SC_MANAGER_CONNECT);

if h_manager > 0 then

begin

h_svc := OpenService(h_manager, PChar(aServiceName),

SERVICE_START or SERVICE_QUERY_STATUS);

if h_svc > 0 then

begin

temp := nil;

if (StartService(h_svc,0,temp)) then

if (QueryServiceStatus(h_svc,svc_status)) then

begin

while (SERVICE_RUNNING svc_status.dwCurrentState) do

begin

dwCheckPoint := svc_status.dwCheckPoint;

Sleep(svc_status.dwWaitHint);

if (not QueryServiceStatus(h_svc,svc_status)) then

break;

if (svc_status.dwCheckPoint < dwCheckPoint) then

begin

// QueryServiceStatus не увеличивает dwCheckPoint

break;

end;

end;

end;

CloseServiceHandle(h_svc);

end;

CloseServiceHandle(h_manager);

end;

Result := SERVICE_RUNNING = svc_status.dwCurrentState;

end;

function ServiceStop(aMachine,aServiceName: string ): boolean;

// aMachine это UNC путь, либо локальный компьютер если пусто

var

h_manager, h_svc: SC_Handle;

svc_status: TServiceStatus;

dwCheckPoint: DWord;

begin

h_manager:=OpenSCManager(PChar(aMachine),nil, SC_MANAGER_CONNECT);

if h_manager > 0 then

begin

h_svc := OpenService(h_manager,PChar(aServiceName),

SERVICE_STOP or SERVICE_QUERY_STATUS);

if h_svc > 0 then

begin

if(ControlService(h_svc,SERVICE_CONTROL_STOP, svc_status))then

begin

if(QueryServiceStatus(h_svc,svc_status))then

begin

while(SERVICE_STOPPED svc_status.dwCurrentState)do

begin

dwCheckPoint := svc_status.dwCheckPoint;

Sleep(svc_status.dwWaitHint);

if(not QueryServiceStatus(h_svc,svc_status))then

begin

// couldn’t check status

break;

end;

if(svc_status.dwCheckPoint < dwCheckPoint)then

break;

end;

end;

end;

CloseServiceHandle(h_svc);

end;

CloseServiceHandle(h_manager);

end;

Result := SERVICE_STOPPED = svc_status.dwCurrentState;

end;

Чтобы узнать состояние сервиса, используйте следующую функцию:

function ServiceGetStatus(sMachine, sService: string ): DWord;

var

h_manager, h_service: SC_Handle;

service_status: TServiceStatus;

hStat: DWord;

begin

hStat := 1;

h_manager := OpenSCManager(PChar(sMachine) ,nil, SC_MANAGER_CONNECT);

if h_manager > 0 then

begin

h_svc := OpenService(h_manager,PChar(sService), SERVICE_QUERY_STATUS);

if h_svc > 0 then

begin

if(QueryServiceStatus(h_svc, service_status)) then

hStat := service_status.dwCurrentState;

CloseServiceHandle(h_svc);

end;

CloseServiceHandle(h_manager);

end;

Result := hStat;

end;

Она возвращает одну из следующих констант:

SERVICE_STOPPED

SERVICE_RUNNING

SERVICE_PAUSED

SERVICE_START_PENDING

SERVICE_STOP_PENDING

SERVICE_CONTINUE_PENDING

SERVICE_PAUSE_PENDING

Всё что, что Вам нужно, это unit WinSvc!

{/codecitation}

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