如何通过Delphi禁用服务?

时间:2010-03-08 13:23:18

标签: delphi service

我使用的例程可以通过Delphi启动和停止服务,但我也需要能够禁用它们,是否可能?

6 个答案:

答案 0 :(得分:19)

使用OpenService打开服务,然后将Service_Disabled作为ChangeServiceConfigdwStartType参数,将其停用。为其余参数指定空指针或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;