2010-03-08 77 views

回答

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); 
+12

這是窮人的服務管理。 sc.exe旨在供命令行或腳本使用 - 並且在較早的Windows版本上不可用 - 應用程序應使用SCM API。 如果你真的想使用SC,則不需要調用shell。直接運行sc.exe。 – 2010-03-08 19:33:45

+0

我明白這不是理想的解決方案,但它可以根據我的具體問題需要。我正在評估一般使用的OpenService解決方案。 – 2010-03-08 22:13:54

+1

還要考慮使用SCM API,如果有錯誤,則更容易出錯。使用除退出代碼之外的命令行工具,您可能需要攔截並解析輸出,這更加困難並且可能是語言特定的。對於一個快速而骯髒的解決方案來說沒問題,但我不會將其用作一般解決方案。另外檢查JCL,IIRC還有一些類來管理服務。 – 2010-03-09 09:06:10

18

打開與OpenService的服務,然後通過傳遞Service_Disabled作爲dwStartType參數ChangeServiceConfig禁用它。對於其他參數指定空指針或Service_No_Change,因爲您不想更改它們。

+1

另請注意,用戶必須具有更改服務配置的適當權限。 – 2010-03-08 19:34:46

3

這是我用

這只是周圍的一些 Windows API函數一點包裝,我們發現有用 處理NT-服務。它允許你 查詢,啓動,停止,暫停和 本地或遠程系統上啓用/禁用NT-Services。

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; 
+0

如果Delphi代碼展示了Eder所要求的內容,而不是他說他已經知道如何去做的東西,那麼Delphi代碼會更好。 – 2010-03-09 01:41:49

+0

是的你的權利,我沒有完全讀完這個問題,我會更新它 – 2010-03-22 00:38:33

+0

太可惜了,現在鏈接被破壞 – 2014-01-30 17:51:15

7

除了使用以前的方法,如果你需要更多的控制,你可以使用WMI。
隨着Win32_Service class訪問安裝在計算機上的服務的所有信息,你可以訪問方法:啓動,停止,暫停,恢復,查詢,創建,刪除,更改,ChangeStartMode ...

這裏( Web/SourceForge)您可以找到一組與WMI配合使用的組件(GLibWMI組件庫);有一個叫做CServiceInfo給你所有的信息和這個類的一些方法。

除了包tere是一些演示;一個被稱爲(ServiceControl)並實現所有方法。

alt text http://img341.imageshack.us/img341/8505/imagen336.png

所有封裝中包含的源。看看它可以用於你的代碼。

問候。

+0

El proyecto tiene muy buena pintaNeftalí... Felicitaciones por la iniciativa! – jachguate 2010-03-09 21:18:41

+0

格拉西亞斯安東尼奧。 La verdad es que aunestáen la primera fase,pero tiene muchas posibilidades para ampliar funcionalidades。不要saludo。 – 2010-03-10 08:29:55

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

當然你也可以使用M.FindService。它完全一樣! – ChristianWimmer 2010-03-11 15:51:39

+0

我是JEDI圖書館的忠實粉絲,我肯定會使用它。 – 2010-03-11 17:16:42