strComputer = "." Set objWMIService = GetObject("winmgmts:\\" strComputer "\root\cimv2") Set colServiceList = objWMIService.ExecQuery _ ("Select * from Win32_Service where Name = 'Alerter'") For Each objService in colServiceList If objService.State = "Running" Then objService.StopService() Wscript.Sleep 5000 End If errReturnCode = objService.ChangeStartMode("Disabled") Next
如您所見,禁用服務(wù)并不需要很多代碼,并且所需的一小段代碼都是很基礎(chǔ)的代碼。不過,有一個棘手的部分,這就是我們?yōu)槭裁磳⒒◣追昼姇r間逐步向您介紹此腳本的原因。 除此以外,不管怎樣 Rolls Royce 經(jīng)銷權(quán)都不會多開放一小時。 腳本開始并沒什么奇特之處:我們只是連接到本地計算機上的 WMI 服務(wù)(盡管我們也可以禁用遠程計算機上的服務(wù))。然后,我們發(fā)出以下查詢,該查詢返回一個僅包含一項的集合:Alerter 服務(wù): Set colServiceList = objWMIService.ExecQuery _ ("Select * from Win32_Service where Name = 'Alerter'") 順便說一下,請確保包括了如上所示的 Where 子句。為什么?設(shè)想一下,假設(shè)您省略了 Where 子句。在這種情況下,您的集合將包含安裝在計算機上的所有服務(wù),那么,你的腳本將盡職盡責地試圖禁用每個服務(wù)。 您說對了:這通常不是什么好事。此外,腳本專家可能會控告您;畢竟,禁用計算機上的一切是我們的主意! 得到集合后,我們建立一個 For Each 循環(huán)以遍歷該集合內(nèi)的所有項。(是的,我們知道:集合中只有一項。但我們?nèi)孕枋褂?nbsp;For Each 循環(huán)。)以下是棘手部分。您可以禁用運行中的服務(wù);但是,該服務(wù)在停止運行前實際并未被禁用。如果禁用運行中的服務(wù),該服務(wù)會一如既往地繼續(xù)運行;更改將在服務(wù)停止后才生效。 正因為如此,我們使用下面這行代碼來查看 Alerter 服務(wù)是否正在運行: If objService.State = "Running" Then 如果該服務(wù)正在運行,那么我們就調(diào)用 StopService() 方法來停止該服務(wù)。之后我們暫停 5 秒(5,000 毫秒);使得服務(wù)有時間在我們繼續(xù)操作以禁用它之前真正停止。我們就是照下面這樣做的: objService.StopService() Wscript.Sleep 5000 注意:為了使該示例腳本盡可能簡短,我們做了些手腳。我們假設(shè)您的服務(wù)僅處于“運行”或“停止”狀態(tài)。實際上,服務(wù)還可能包含其他狀態(tài),最顯著地是“暫停”或“繼續(xù)”。要編寫一個更穩(wěn)妥的腳本,您或許還應(yīng)該檢查這些狀態(tài)(并采取相應(yīng)的措施)。但是,因為在 99.9% 情況下,服務(wù)都處于運行或停止狀態(tài),所以您通常可以使用我們給出的腳本蒙混過去。 服務(wù)停止后,我們就可以使用下面這行代碼禁用它: errReturnCode = objService.ChangeStartMode("Disabled") 如您所見,我們只是使用 ChangeStartMode 方法更改 StartMode 屬性的值。我們要禁用該服務(wù),所以我們將參數(shù)“Disabled”傳遞給 ChangeStartMode。我們還可以將 StartMode 設(shè)置為“Manual”或“Automatic”;這樣會將 StartMode 設(shè)置為“手動”或“自動”。 請記住,服務(wù)被停止并禁用后,將無法再啟動;重新啟動該服務(wù)的唯一方法是重新啟用它(通過將 StartMode 更改為“手動”或“自動”)。但是,我們會等到說服每個人禁用其計算機上的一切后,才介紹如何重新啟用這些東西。畢竟,我們也許能夠?qū)@些腳本收取雙倍的費用。