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; // 服务启动  StartService('',0,nil)
function StartServicea(AServName: string): boolean; // 开始服务
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;

function StartServicea(AServName: string): boolean; // use WinSvc
var
  SCManager, hService: SC_HANDLE;
  lpServiceArgVectors: PChar;
begin
  SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  Result := SCManager <> 0;
  if Result then
    try
      hService := OpenService(SCManager, PChar(AServName), SERVICE_ALL_ACCESS);
      Result := hService <> 0;
      if (hService = 0) and (GetLastError = ERROR_SERVICE_DOES_NOT_EXIST) then
        Exception.Create('指定的服务不存在!');
      if hService <> 0 then
        try
          lpServiceArgVectors := nil;
          Result := WinSvc.StartService(hService, 0,
            PChar(lpServiceArgVectors));
          if not Result and (GetLastError = ERROR_SERVICE_ALREADY_RUNNING) then
            Result := True;
        finally
          CloseServiceHandle(hService);
        end;
    finally
      CloseServiceHandle(SCManager);
    end;
end;

end.

  

posted @ 2021-02-19 08:55  delphi中间件  阅读(203)  评论(0编辑  收藏  举报