📄 servicecontrolunit.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 + -