我使用一個可以通過Delphi啓動和停止服務的例程,但我也需要能夠禁用它們,這有可能嗎?如何通過Delphi禁用服務?
回答
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);
打開與OpenService
的服務,然後通過傳遞Service_Disabled
作爲dwStartType
參數ChangeServiceConfig
禁用它。對於其他參數指定空指針或Service_No_Change
,因爲您不想更改它們。
另請注意,用戶必須具有更改服務配置的適當權限。 – 2010-03-08 19:34:46
這是我用
這只是周圍的一些 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;
如果Delphi代碼展示了Eder所要求的內容,而不是他說他已經知道如何去做的東西,那麼Delphi代碼會更好。 – 2010-03-09 01:41:49
是的你的權利,我沒有完全讀完這個問題,我會更新它 – 2010-03-22 00:38:33
太可惜了,現在鏈接被破壞 – 2014-01-30 17:51:15
除了使用以前的方法,如果你需要更多的控制,你可以使用WMI。
隨着Win32_Service class訪問安裝在計算機上的服務的所有信息,你可以訪問方法:啓動,停止,暫停,恢復,查詢,創建,刪除,更改,ChangeStartMode ...
這裏( Web/SourceForge)您可以找到一組與WMI配合使用的組件(GLibWMI組件庫);有一個叫做CServiceInfo給你所有的信息和這個類的一些方法。
除了包tere是一些演示;一個被稱爲(ServiceControl)並實現所有方法。
alt text http://img341.imageshack.us/img341/8505/imagen336.png
所有封裝中包含的源。看看它可以用於你的代碼。
問候。
El proyecto tiene muy buena pintaNeftalí... Felicitaciones por la iniciativa! – jachguate 2010-03-09 21:18:41
格拉西亞斯安東尼奧。 La verdad es que aunestáen la primera fase,pero tiene muchas posibilidades para ampliar funcionalidades。不要saludo。 – 2010-03-10 08:29:55
您可以使用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;
當然你也可以使用M.FindService。它完全一樣! – ChristianWimmer 2010-03-11 15:51:39
我是JEDI圖書館的忠實粉絲,我肯定會使用它。 – 2010-03-11 17:16:42
- 1. 如何通過服務android
- 2. 如何通過web服務
- 3. 如何用Delphi調試Windows服務?
- 4. 如何通過服務調用
- 5. 如何通過服務處理通知?
- 6. 如何通過服務發送通知
- 7. 通過Powershell腳本啓用/禁用防火牆服務
- 8. 通過腳本啓用/禁用asp.net web服務擴展
- 9. 通過服務
- 10. 通過SSL從Delphi程序連接到遠程MySQL服務器
- 11. 禁用特定服務的nagios通知
- 12. 通過Java代碼禁用部署的Web服務
- 13. 通過Powershell禁用計算機管理服務
- 14. 如何在Delphi中創建Windows服務?
- 15. Angular2:如何通過HTTP服務
- 16. 如何通過curl驗證web服務?
- 17. 如何通過android消費node.js服務
- 18. 如何通過XRM服務共享CRM2011?
- 19. 如何通過Windows服務登錄?
- 20. 如何通過Web服務發送ArrayList?
- 21. 如何通過HBase的REST服務
- 22. 如何通過https訪問kubernetes服務?
- 23. 如何通過URI引用WCF Web服務/如何通過URI將WCF服務POST?
- 24. 通過Delphi引用WinHTTP.dll
- 25. 如何通過Delphi 7連接到JIRA?
- 26. 通過Web服務
- 27. 通過RESTful服務
- 28. 通過Web服務
- 29. 如何禁用Delphi中的Unicode xe2
- 30. 如何通過ActiveSync禁用Internet連接?
這是窮人的服務管理。 sc.exe旨在供命令行或腳本使用 - 並且在較早的Windows版本上不可用 - 應用程序應使用SCM API。 如果你真的想使用SC,則不需要調用shell。直接運行sc.exe。 – 2010-03-08 19:33:45
我明白這不是理想的解決方案,但它可以根據我的具體問題需要。我正在評估一般使用的OpenService解決方案。 – 2010-03-08 22:13:54
還要考慮使用SCM API,如果有錯誤,則更容易出錯。使用除退出代碼之外的命令行工具,您可能需要攔截並解析輸出,這更加困難並且可能是語言特定的。對於一個快速而骯髒的解決方案來說沒問題,但我不會將其用作一般解決方案。另外檢查JCL,IIRC還有一些類來管理服務。 – 2010-03-09 09:06:10