Delphi - база знаний

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


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



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

Взято с Исходников.ru



Содержание раздела