Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

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

01.01.2007

Здесь представлены две функции 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 !

Взято из https://forum.sources.ru