Delphi 获取Windows服务状态、启动和停止服务

以下为Delphi获取Windows服务、启动和停止服务的代码,使用方法如下:

if SERVICE_RUNNING = ServiceGetStatus('', '服务名') then
   StopServices('服务名', true);
StartServices('服务名', false);

---------------------------------------------------------------------------------------------------------

unit UStartServices;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, WinSVC, StdCtrls;

  //获取服务状态
  //参数:sMachine计算机名(本机可用空字符串表示)   sService:服务名称
  //输出:服务的状态 SERVICE_RUNNING/SERVICE_STOPPED/SERVICE_PAUSED等
  function ServiceGetStatus(sMachine, sService: string ): DWord;
  //开启服务  BWait=true表示一直等待服务启动或停止完成后才能继续操作界面
  function StartServices(const SvrName: string; BWait: boolean): Boolean;
  //停止服务
  function StopServices(const SvrName: string; BWait: boolean): Boolean;
  //重启服务
  function RestartServices(const SvrName: string; BWait: boolean): Boolean;
  //等待服务启动或停止
  function WaitForService(ServiceHandle: Longword; AStatus: Longword): Boolean;

implementation


function StartServices(const SvrName: string; BWait: boolean): Boolean;
var
  SCH, SvcSCH: SC_HANDLE;
  arg: PChar;
  dwStartType: DWORD;
begin
  Result := False;
  SCH := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  if SCH <= 0 then Exit;
  SvcSCH := OpenService(SCH, PChar(SvrName), SERVICE_ALL_ACCESS);
  if SvcSCH <= 0 then Exit;
  try
    Result := StartService(SvcSCH, 0, arg);
    if BWait then
      WaitForService(SvcSCH, SERVICE_RUNNING);
  finally
    CloseServiceHandle(SvcSCH);
    CloseServiceHandle(SCH);
  end;
end;

function RestartServices(const SvrName: string; BWait: boolean): Boolean;
var
  SCH, SvcSCH: SC_HANDLE;
  arg: PChar;
  dwStartType: DWORD;
  ServiceStatus: _SERVICE_STATUS;
  SS: TServiceStatus;
begin
  Result := False;
  SCH := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  if SCH <= 0 then Exit;
  SvcSCH := OpenService(SCH, PChar(SvrName), SERVICE_ALL_ACCESS);
  if SvcSCH <= 0 then Exit;

  if not ControlService(SvcSCH, SERVICE_CONTROL_INTERROGATE, ServiceStatus) then exit;
  if ServiceStatus.dwCurrentState = SERVICE_RUNNING then  //如果正在运行,则先停止服务
  begin
    ControlService(SvcSCH, SERVICE_CONTROL_STOP, SS);
    WaitForService(SvcSCH, SERVICE_STOPPED);
    //StopServices(SvrName, true);
  end;

  try
    Result := StartService(SvcSCH, 0, arg);
    if BWait then
      WaitForService(SvcSCH, SERVICE_RUNNING);
  finally
    CloseServiceHandle(SvcSCH);
    CloseServiceHandle(SCH);
  end;
end;

function StopServices(const SvrName: string; BWait: boolean): Boolean;
var
  SCH, SvcSCH: SC_HANDLE;
  SS: TServiceStatus;
begin
  Result := False;
  SCH := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  if SCH <= 0 then Exit;
  SvcSCH := OpenService(SCH, PChar(SvrName), SERVICE_ALL_ACCESS);
  if SvcSCH <= 0 then Exit;
  try
    Result := ControlService(SvcSCH, SERVICE_CONTROL_STOP, SS);
    if BWait then
      WaitForService(SvcSCH, SERVICE_STOPPED);
  finally
    CloseServiceHandle(SCH);
    CloseServiceHandle(SvcSCH);
  end;
end;

function ServiceGetStatus(sMachine, sService: string ): DWord;
var
  schm,      //service control manager handle
  schs: SC_Handle;   //service handle
  ss: TServiceStatus;  //service status
  dwStat : DWord;  //current service status
begin
  dwStat := 0;
  schm := OpenSCManager(PChar(sMachine), Nil, SC_MANAGER_CONNECT);
  if(schm > 0)then
  begin
    //open a handle to the specified service
    schs := OpenService(schm, PChar(sService), SERVICE_QUERY_STATUS);
    if(schs > 0)then
    begin
      //retrieve the current status of the specified service
      if(QueryServiceStatus(schs, ss))then
      begin
        dwStat := ss.dwCurrentState;
      end;

      CloseServiceHandle(schs);  //close service handle
    end;

    CloseServiceHandle(schm);  // close service control manager handle
  end;

  Result := dwStat;
end;

function WaitForService(ServiceHandle: Longword; AStatus: Longword): Boolean;
var
  PendingStatus: Longword;
  ServiceStatus: _SERVICE_STATUS;
  Error: Integer;
begin
  Result := False;
  case AStatus of
    SERVICE_RUNNING: PendingStatus := SERVICE_START_PENDING;
    SERVICE_STOPPED: PendingStatus := SERVICE_STOP_PENDING;
  end;
  repeat
    if not ControlService(ServiceHandle, SERVICE_CONTROL_INTERROGATE, ServiceStatus) then
    begin
      
    end;
    if ServiceStatus.dwWin32ExitCode <> 0 then
      Break;
    Result := ServiceStatus.dwCurrentState = AStatus;
    if not Result and (ServiceStatus.dwCurrentState = PendingStatus) then
      Sleep(ServiceStatus.dwWaitHint)
    else
      Break;
  until Result;
end;

end.

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值