2015-12-29 87 views
0

我正在使用Windows 2008 Server R2。我發現這個VBScript應該檢查服務是啓動還是停止。服務狀態檢查失敗

下面是腳本:

'Declare Variables 
Dim objWMIService, objProcess, colProcess, Status, strComputer, strService 

'Assign Arguments 
strComputer = WScript.Arguments(0) 
strService = WScript.Arguments(1) 
Status = False 

'Check For Arguments - Quit If None Found 
If Len(strService) < 1 Then 
    Wscript.echo "No Arguments Entered - Exiting Script" 
    WScript.Quit 
End If 

'Setup WMI Objects 
Set objWMIService = GetObject("winmgmts:"& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 
Set colProcess = objWMIService.ExecQuery ("SELECT DisplayName, Status, State FROM Win32_Service WHERE DisplayName = '" & strService & "'") 

'Check For Running Service 
For Each objProcess In colProcess 
    If InStr(objProcess.DisplayName, strService) > 0 And objProcess.State = "Running" Then 
     Status = True 
    End If 
Next 

If Status = True Then 
    WScript.Echo "Service: " & UCase(strComputer) & " " & strService & " Running" 
Else 
    WScript.Echo "Service: " & UCase(strComputer) & " " & strService & " Not Running" 
End If 

通過命令行我稱之爲像在命令行這

CSCRIPT ServiceCheckScript.vbs LOCALHOST "Print Spooler" 

響應腳本是

... \ ServiceCheckScript .vbs(20,1)(null):0x80041017

我看到0x80041017錯誤是指查詢返回空值的結果,但我不確定這是爲什麼。

+0

在我的Windows 7機器上,它工作正常。由於某些原因,錯誤代碼正在提醒我WMI損壞時返回的錯誤代碼。試試這個:start> run> wbemtest(打開它)> Connect> Connect> Query> [type]'select * from win32_service'> Apply。如果在任何時候出現錯誤(包括單擊「連接」時,包括在查詢中輸入錯誤時排除),那麼WMI將被破壞。 – eurotrash

+0

錯誤0x8041017表示您的[查詢無效](https://msdn.microsoft.com/en-us/library/windows/desktop/aa394559.aspx)。仔細檢查'strService'的值是否與你期望的一樣(例如,使用像'WScript.Echo「 - 」&strService&「 - 」'「這樣的語句)。 –

+0

WMI不是使用'.'來表示當前機器而不是'localhost'?猜猜它應該仍然有效,只是一個觀察。 – Lankymart

回答

0

與上面的代碼的幾個問題:

  1. 驗證你有從WMI查詢結果,所以你不要試圖使用空。將結果用於if colProcess.count > 0 then

  2. 通過將參數驗證中的代碼括起來,刪除額外的.quit。由於您只是檢查以確保它們不是空的,所以它的參數計數比字符串函數wscript.arguments.count = 2更便宜/更清潔。如果您需要更復雜的驗證,則需要更多邏輯。

  3. 沒有任何理由使用instr(objProcess.Displayname, strService),因爲您的WMI查詢已指定結果等於服務顯示名稱where DisplayName = strService中的服務顯示名稱。

  4. 在整個循環內執行條件檢查服務狀態更簡單/更清晰。

這是我的例子。

'Declare Variables 
Dim objWMIService, objProcess, colProcess, Status, strComputer, strService 

'Verify arguments were passed 
if WScript.Arguments.Count = 2 then 
    'Assign Arguments 
    strComputer = WScript.Arguments(0) 
    strService = WScript.Arguments(1) 

    'Setup WMI Objects 
    Set objWMIService = GetObject("winmgmts:"& "{impersonationLevel=impersonate}!\\" & _ 
         strComputer & "\root\cimv2") 
    Set colProcess = objWMIService.ExecQuery ("SELECT DisplayName, Status, State FROM " & _ 
        "Win32_Service WHERE DisplayName = '" & strService & "'") 

    'Ensure there were results returned 
    if colProcess.count > 0 then 
     'Check For Running Service 
     For Each objProcess In colProcess 
     If objProcess.State = "Running" Then 
      WScript.Echo "Service: " & UCase(strComputer) & " " & strService & " Running" 
     else 
      WScript.Echo "Service: " & UCase(strComputer) & " " & strService & " Not Running" 
     End If 
     Next 
    else 
     WScript.Echo "Service: " & UCase(strComputer) & " " & strService & " Does not exist" 
    end if 
end if 

編輯:剛纔還說我驗證了上面的代碼在Win 8.1和服務器2012R2兩者同時使用有效和無效的服務名稱。但是,我會添加更多的錯誤檢查,例如驗證計算機參數是否有效,以確保您的WMI查詢不會不必要地/無法解釋地失敗。