Service 服务的状态检查失败

Service 服务的状态检查失败,service,command-line,vbscript,wmi,windows-server-2008-r2,Service,Command Line,Vbscript,Wmi,Windows Server 2008 R2,我正在Windows 2008服务器R2上工作。我发现这个VBScript应该检查服务是启动还是停止 以下是脚本: 'Declare Variables Dim objWMIService, objProcess, colProcess, Status, strComputer, strService 'Assign Arguments strComputer = WScript.Arguments(0) strService = WScript.Arguments(1) Status =

我正在Windows 2008服务器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
来自命令行的响应是

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


我看到0x80041017错误是指返回空值的查询结果,但我不确定这是为什么。

上述代码存在一些问题:

  • 验证是否从WMI查询中获得了结果,以便不尝试使用null。如果colProcess.count>0,则将结果的使用包装在
    中,然后

  • 删除额外的。通过在参数验证中包含代码退出。使用参数计数比使用字符串函数更便宜/更干净,因为您只是检查它们是否为空。如果您需要更复杂的验证,那么需要更多的逻辑

  • 没有任何理由使用
    instr(objProcess.Displayname,strService)
    ,因为WMI查询已指定结果等于此
    中的服务显示名称,其中Displayname=strService

  • 在循环内部执行服务状态的条件检查更简单/更清晰

  • 这是我的例子

    '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和Server 2012R2中验证了上述代码,使用了有效和无效的服务名称。但是,我会添加更多的错误检查,比如验证计算机参数是否有效,以确保WMI查询不会不必要地/莫名其妙地失败

    在我的Windows7机器上,它工作正常。由于某些原因,该错误代码提醒我WMI被破坏时返回的错误代码。尝试以下操作:启动>运行>wbemtest(打开它)>连接>连接>查询>[输入]
    select*fromWin32\u服务应用。如果在任何时候出现错误(包括单击“连接”时,不包括在查询中键入错误),则WMI已损坏。错误0x8041017表示您的WMI已损坏。仔细检查
    strService
    的值是否与您期望的值相同(例如,使用类似
    WScript.Echo“-”&strService&“-”
    )的语句)。WMI是否使用
    来表示当前机器,而不是
    本地主机
    ?我想它仍然可以工作,只是一个观察。@Lankymart名字对象允许
    localhost
    ,IP地址或主机名。此外,名字对象字符串的问题应该会引发不同的错误(在较早的时候也是如此)。