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

=== Как запустить и остановить сервис (или получить его статус)? ===
Здесь представлены две функции ServiceStart и ServiceStop, которые показывают, как пользоваться API функциями OpenSCManager, OpenService и т.д.:
// aMachine это UNC путь, либо локальный компьютер если пусто
function ServiceStart(aMachine, aServiceName: string): Boolean;
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
 begin
 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;
 end;
 CloseServiceHandle(h_svc);
 end;
 CloseServiceHandle(h_manager);
 end;
 Result := (SERVICE_RUNNING = svc_status.dwCurrentState);
end;
// aMachine это UNC путь, либо локальный компьютер если пусто
function ServiceStop(aMachine, aServiceName: string): Boolean;
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 !
Source: Взято из http://forum.sources.ru
ID: 02230