使用带有get-WMIObject和interrogateservice方法的变量引用

时间:2017-03-08 14:48:20

标签: powershell

我使用Get-WMIObject和类Win32_Service来获取对服务的引用。我将该引用存储在变量中。我的问题是,我可以使用引用变量来获取服务状态的更新,还是需要执行另一个Get-WMIObject?

目前我用这个:

$parameters = @{
        Class = 'Win32_Service'
        ComputerName = $server
        Credential = $script:credentials
        Filter = "Name='$ServiceName'"
    }
$targetservice = Get-WMIObject @parameters
$results = $targetservice.startservice()
if($results.returnvalue -eq 0)
{
    do
    {
        start-sleep -milliseconds 100
     } until((Get-WMIObject @parameters).state -eq 'Running')
}

我是否需要第二次调用Get-WMIObject,或者我可以这样做吗?

$parameters = @{
        Class = 'Win32_Service'
        ComputerName = $server
        Credential = $script:credentials
        Filter = "Name='$ServiceName'"
    }
$targetservice = Get-WMIObject @parameters
$results = $targetservice.startservice()
if($results.returnvalue -eq 0)
{
    do
    {
        start-sleep -milliseconds 100
        $targetservice.interrogateservice()
     } until(($targetservice).state -eq 'Running')
}

我知道询问服务是假设更新服务的状态,但由于某种原因,它无法正常工作并陷入循环中。

2 个答案:

答案 0 :(得分:0)

WMI结果仅反映执行查询时的状态。您需要重新运行Get-WmiObject才能获得当前状态。

答案 1 :(得分:0)

您已经接近。.不幸的是,InterrogateService不会更新$ targetservice对象,但它确实具有自己的返回码,可用于确定状态。

因此您可以使用以下if语句: if($ targetservice .InterrogateService()。ReturnValue -ne 6){“无法停止”}

有关返回码,请参见下面的Microsoft参考: https://docs.microsoft.com/en-us/windows/desktop/cimwin32prov/interrogateservice-method-in-class-win32-service

...但是我会再打一次WMI,因为返回码不是那么直接...我相信,如果状态没有从原始状态更改,它会给出0。因此,您必须考虑到这一点。