function GetServiceStatusString(sServiceName: string): string;//檢測服務(wù)狀態(tài)
var
hService, hSCManager: SC_HANDLE;
SS: TServiceStatus;
begin
hSCManager := OpenSCManager(nil, SERVICES_ACTIVE_DATABASE, SC_MANAGER_CONNECT);
if hSCManager = 0 then
begin
result := 'Can not open the service control manager';
exit;
end;
hService := OpenService(hSCManager, PChar(sServiceName), SERVICE_QUERY_STATUS);
if hService = 0 then
begin
CloseServiceHandle(hSCManager);
result := '無法找到(' + sServiceName + ')服務(wù)';
exit;
end;
if not QueryServiceStatus(hService, SS) then
result := '無法查詢服務(wù)狀態(tài)'
else
begin
case SS.dwCurrentState of
SERVICE_CONTINUE_PENDING:
result := sServiceName + '服務(wù),重啟動';
SERVICE_PAUSE_PENDING:
result := sServiceName + '服務(wù),即將停頓';
SERVICE_PAUSED:
result := sServiceName + '服務(wù),已停頓';
SERVICE_RUNNING:
result := sServiceName + '服務(wù),已運行';
SERVICE_START_PENDING:
result := sServiceName + '服務(wù),即將啟動';
SERVICE_STOP_PENDING:
result := sServiceName + '服務(wù),即將停止';
SERVICE_STOPPED:
result := sServiceName + '服務(wù),已停止';
else
result := 'Unknown Status';
end;
end;
CloseServiceHandle(hSCManager);
CloseServiceHandle(hService);
end;
function RunServies(sServiceName:String):Boolean;//啟動某個服務(wù);
var
schService:SC_HANDLE;
schSCManager:SC_HANDLE;
ssStatus:TServiceStatus;
Argv:PChar;
begin
schSCManager:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);
schService:=OpenService(schSCManager,Pchar(sServiceName),SERVICE_ALL_ACCESS);
result := True;
try
if StartService(schService,0,Argv) then
begin
while (QueryServiceStatus(schService,ssStatus)) do
begin
Sleep(500);
Application.ProcessMessages;
if ssStatus.dwCurrentState=SERVICE_START_PENDING then
Sleep(500)
else
Break;
end;//while
if ssStatus.dwCurrentState=SERVICE_RUNNING then
result := True
else
result := False;
end
else
result := False;
finally
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
end;
end;
function StopServies(sServiceName:String):Boolean;//停止某個服務(wù);
var
schService:SC_HANDLE;
schSCManager:SC_HANDLE;
ssStatus:TServiceStatus;
begin
schSCManager:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);
schService:=OpenService(schSCManager,Pchar(sServiceName),SERVICE_ALL_ACCESS);
try
if ControlService(schService,SERVICE_CONTROL_STOP,ssStatus) then
begin
Sleep(1000);
while (QueryServiceStatus(schService,ssStatus)) do
begin
Application.ProcessMessages;
if ssStatus.dwCurrentState=SERVICE_STOP_PENDING then
Sleep(1000)
else
break;
end; //while
if ssStatus.dwCurrentState=SERVICE_STOPPED then
result := True
else
result := False;
end
else
result := False;
finally
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
end;
end;
function ServiceIsInstalled(ServiceName: string): Boolean;//安裝服務(wù)
var
SCManager: THandle;
HService: THandle;
begin
Result := false;
if HInst = 0 then
Exit;
if Assigned(OpenSCManager) and Assigned(OpenService) and
Assigned(CloseServiceHandle) then
begin
SCManager := OpenSCManager(nil, nil, GENERIC_READ);
if SCManager <> 0 then
begin
HService := OpenService(SCManager, PChar(ServiceName), GENERIC_READ);
Result := HService <> 0;
if HService <> 0 then
begin
CloseServiceHandle(HService);
end;
CloseServiceHandle(SCManager);
end;
end;
function ChangeServiceConfig(ServiceName: string; StartType: Integer): Boolean;//配置服務(wù)
var
SCManager, HService: THandle;
PConfig: PQueryServiceConfigA;
Buf: DWORD;
begin
Result := False;
if HInst = 0 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
New(PConfig);
QueryServiceConfigA(HService, PConfig, SizeOf(_QUERY_SERVICE_CONFIGA), Buf);
ChangeServiceConfigA(HService, PConfig.dwServiceType,
StartType, PConfig.dwErrorControl, PConfig.lpBinaryPathName,
PConfig.lpLoadOrderGroup, 0, PConfig.lpDependencies,
PConfig.lpServiceStartName, '', PConfig.lpDisplayName);
CloseServiceHandle(HService);
DisPose(PConfig);
Result := True;
end
else
Result := False;
CloseServiceHandle(SCManager);
end
else
Result := False;
end;
end;