操控Windows服务程序的单元

一个操控Windows服务程序的单元

unit untServerInfo;

interface

uses
  Windows, Messages, SysUtils, Classes, Forms, WinSvc, SvcMgr,
  System.Win.Registry;

function ServiceGetStatus(sMachine, sService: string): DWord; //取服务状态
function ServiceUninstalled(sMachine, sService: string): boolean; //反安装服务
function ServiceRunning(sMachine, sService: string): boolean; //判断服务是否运行
function ServiceStopped(sMachine, sService: string): boolean; //停止服务
function StartService(ServiceName: string; NumberOfArgument: DWord;
  ServiceArgVectors: PChar): boolean; overload; // More complex start
function StopService(ServiceName: string): boolean; // 暂停服务
function ShutdownService(ServiceName: string): boolean; // 御载服务
function IsServiceInstalled(ServiceName: string): boolean; // 服务是否安装
function InstallService(ServiceName, DisplayName, Filename: string;
  ServiceDescription: string = ''): boolean; // 安装服务
procedure ServiceUpdateDescription(const ServiceName, Description: string);
// 添加服务描述
function DoControlService(ServiceName: string; ControlFalg: Cardinal): boolean;
// 反安装服务
function UnInstallService(ServiceName: string): boolean;

implementation

function UnInstallService(ServiceName: string): boolean;
var
  SCManager, ServiceHandle: SC_HANDLE;
begin
  Result := False;
  if (Trim(ServiceName) = '') then
    Exit;

  SCManager := OpenSCManager(nil, nil, GENERIC_WRITE);
  if SCManager = 0 then
    Exit;
  try
    ServiceHandle := OpenService(SCManager, PChar(ServiceName), _DELETE);
    Result := DeleteService(ServiceHandle);
    CloseServiceHandle(ServiceHandle);
  finally
    CloseServiceHandle(SCManager);
  end;
end;

function DoControlService(ServiceName: string; ControlFalg: Cardinal): boolean;
var
  ServiceStatus: TServiceStatus;
  SCManager, hService: SC_HANDLE;
begin
  Result := False;
  if (Trim(ServiceName) = '') then
    Exit;

  SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  if SCManager <> 0 then
  begin
    hService := OpenService(SCManager, PChar(ServiceName), SERVICE_ALL_ACCESS);
    if hService <> 0 then
    begin
      Result := ControlService(hService, ControlFalg, ServiceStatus);
      CloseServiceHandle(hService);
    end;
    CloseServiceHandle(SCManager);
  end;
end;

procedure ServiceUpdateDescription(const ServiceName, Description: string);
var
  reg: TRegistry;
begin
  reg := TRegistry.Create;
  try
    with reg do
    begin
      RootKey := HKEY_LOCAL_MACHINE;
      if OpenKey('SYSTEM\CurrentControlSet\Services\' + ServiceName, False) then
      begin
        WriteString('Description', Description);
      end;
      CloseKey;
    end;
  finally
    reg.Free;
  end;
end;

function InstallService(ServiceName, DisplayName, Filename: string;
  ServiceDescription: string = ''): boolean;
var
  SCManager, ServiceHandle: SC_HANDLE;
begin
  Result := False;
  if (Trim(ServiceName) = '') and not FileExists(Filename) then
    Exit;

  SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  if SCManager = 0 then
    Exit;

  try
    ServiceHandle := CreateService(SCManager, PChar(ServiceName),
      PChar(DisplayName), SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS or
      SERVICE_INTERACTIVE_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
      PChar(Filename), nil, nil, nil, nil, nil);

    if IsServiceInstalled(ServiceName) and (ServiceDescription <> '') then
      ServiceUpdateDescription(ServiceName, ServiceDescription);
    CloseServiceHandle(ServiceHandle);
    Result := ServiceHandle <> 0;
  finally
    CloseServiceHandle(SCManager);
  end;
end;

function IsServiceInstalled(ServiceName: string): boolean;
var
  Mgr, Svc: Integer;
begin
  Result := False;
  if (Trim(ServiceName) = '') then
    Exit;

  Mgr := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  if Mgr <> 0 then
  begin
    Svc := OpenService(Mgr, PChar(ServiceName), SERVICE_ALL_ACCESS);
    Result := Svc <> 0;
    if Result then
      CloseServiceHandle(Svc);
    CloseServiceHandle(Mgr);
  end;
end;

function ShutdownService(ServiceName: string): boolean;
begin
  Result := DoControlService(ServiceName, SERVICE_CONTROL_SHUTDOWN);
end;

function StopService(ServiceName: string): boolean;
begin
  Result := DoControlService(ServiceName, SERVICE_CONTROL_STOP);
end;

function ServiceGetStatus(sMachine, sService: string): DWord;
var
  schm, schs: THandle;
  ss: TServiceStatus;
  dwStat: DWord;
begin
  dwStat := 0;
  schm := OpenSCManager(PChar(sMachine), Nil, SC_MANAGER_CONNECT);
  if (schm > 0) then
  begin
    schs := OpenService(schm, PChar(sService), SERVICE_QUERY_STATUS);
    if (schs > 0) then
    begin

      if (QueryServiceStatus(schs, ss)) then
        dwStat := ss.dwCurrentState;

      CloseServiceHandle(schs);

    end;

    CloseServiceHandle(schm);

  end;

  Result := dwStat;

end;

{ 判断某服务是否安装,未安装返回true,已安装返回false }

function ServiceUninstalled(sMachine, sService: string): boolean;
begin

  Result := 0 = ServiceGetStatus(sMachine, sService);

end;

{ 判断某服务是否启动,启动返回true,未启动返回false }

function ServiceRunning(sMachine, sService: string): boolean;
begin

  Result := SERVICE_RUNNING = ServiceGetStatus(sMachine, sService);

end;

{ 判断某服务是否停止,停止返回true,未停止返回false }

function ServiceStopped(sMachine, sService: string): boolean;
begin
  Result := SERVICE_STOPPED = ServiceGetStatus(sMachine, sService);
end;

function StartService(ServiceName: string; NumberOfArgument: DWord;
  ServiceArgVectors: PChar): boolean; overload; // More complex start
var
  SCManager, hService: SC_HANDLE;
begin
  Result := False;
  if (Trim(ServiceName) = '') then
    Exit;

  SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  Result := SCManager <> 0;
  if Result then
    try
      hService := OpenService(SCManager, PChar(ServiceName),
        SERVICE_ALL_ACCESS);
      Result := hService <> 0;
      if (hService <> 0) then
        try
          Result := WinSvc.StartService(hService, NumberOfArgument,
            PChar(ServiceArgVectors));
          if not Result and (GetLastError = ERROR_SERVICE_ALREADY_RUNNING) then
            Result := True;
        finally
          CloseServiceHandle(hService);
        end;
    finally
      CloseServiceHandle(SCManager);
    end;
end;

end.



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值