我使用的例程可以通过Delphi启动和停止服务,但我也需要能够禁用它们,是否可能?
答案 0 :(得分:19)
使用OpenService
打开服务,然后将Service_Disabled
作为ChangeServiceConfig
的dwStartType
参数,将其停用。为其余参数指定空指针或Service_No_Change
,因为您不想更改它们。
答案 1 :(得分:8)
您可以使用JEDI组件库(JCL)中的文件JclSvcCtrl.pas。 我写了一个你可以使用的伪示例。但是,请注意我没有测试它。但是这样它应该可以工作(省略错误检查):
M := TJclSCManager.Create;
M.Refresh(true); //Not sure if true is needed or not (refresh all services)
For i := 0 to M.ServiceCount -1 do
begin
S := M.Services[i]; //TJclNtService
if CompareText(S.ServiceName, 'bla') then
begin
S.Stop;
S.StartType := sstDisabled;
S.Commit;
break;
end;
end;
答案 2 :(得分:7)
除了使用以前的方法外,如果需要更多控制,可以使用WMI 使用Win32_Service class可以访问计算机上安装的所有服务信息,您可以访问以下方法:启动,停止,暂停,恢复,查询,创建,删除,更改,ChangeStartMode ......
在这里(Web / SourceForge)您可以找到一组可与WMI配合使用的组件( GLibWMI组件库);有一个名为 CServiceInfo ,它为您提供此类的所有信息和一些方法。
此外,包中还有一些演示;一个叫做(ServiceControl)并实现所有方法。
alt text http://img341.imageshack.us/img341/8505/imagen336.png
所有包都包含来源。查看它对您有用的代码。
的问候。
答案 3 :(得分:5)
ShellExecute(0, nil, 'cmd.exe', 'sc config "the service name" start=disabled', nil, SW_HIDE);
ShellExecute(0, nil, 'cmd.exe', 'sc config "the service name" start=auto', nil, SW_HIDE);
ShellExecute(0, nil, 'cmd.exe', 'sc config "the service name" start=demand', nil, SW_HIDE);
答案 4 :(得分:3)
这是我使用的
这只是一些有点包装 我们发现Windows API函数很有用 处理NT服务。它允许你 查询,开始,停止,暂停和 启用/禁用NT上的服务 本地或远程系统。
http://blog.marcduerst.com/post/How-to-use-TServiceManager-to-manage-Windows-services.aspx
这让你可以编写'漂亮'的delphi代码;)
procedure DisableService(ServiceName: PChar);
var SM: TServiceManager;
begin
SM:=TServiceManager.Create;
try
SM.Connect;
SM.OpenServiceConnection(ServiceName);
//not working with TServiceManager as is
//but its easy to fix, see below
SM.DisableService;
finally
SM.Free;
end;
end;
还没有编写DisableService部分,但所需的只是
procedure TServiceManager.DisableService;
begin
ChangeServiceConfig(ServiceHandle, SERVICE_NO_CHANGE,SERVICE_DISABLED,SERVICE_NO_CHANGE, nil, nil, nil, nil, nil, nil, nil);
end;
答案 5 :(得分:1)
另一种选择是使用 DelphiVault ServiceManager unit(另见 this answer):
var
SM: TServiceManager;
Svc: TServiceInfo;
begin
SM := TServiceManager.Create;
try
SM.Active := True;
Svc := SM.ServiceByName['MyServiceName'];
Svc.SetStartType(ssDisabled);
finally
SM.Free;
end;
end;