Powershell:调用“GetOwner”的异常:作为作业调用时“未找到”

时间:2013-06-13 20:53:55

标签: powershell wmi invoke-command powershell-jobs

我需要得到所有者的一些过程。我下面的演示脚本将首先在本地查找所有者的触发器,然后它将执行相同的操作,但它会在同一个盒子上调用该命令:

cls
write-host 'LOCAL CALL: '
$procs = @(Get-WmiObject win32_process |? {($_.getowner().user -eq 'APP_ACCOUNT') })
write-host $procs.count

$func = {
$procs = @(Get-WmiObject win32_process |? {($_.getowner().user -eq 'APP_ACCOUNT') })
write-host $procs.count
}

write-host 'REMOTE CALL: '
$session = New-PSSession -ComputerName 'SERVER'
$job = Invoke-Command -Session $session -ScriptBlock $func -AsJob
Wait-Job -Job $job    
$job | Receive-Job
$job | Remove-Job
Remove-PSSession -Session $session

大多数情况下,当我运行脚本时,它会出现以下输出错误:

LOCAL CALL:
38
REMOTE CALL: 

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command                  
--     ----            -------------   -----         -----------     --------             -------                  
26     Job26           RemoteJob       Completed     True            SERVER               ...                      
Exception calling "GetOwner" : "Not found "
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : WMIMethodException
    + PSComputerName        : SERVER

38

因此,前38个是它为本地运行的所有者找到的过程数。它第二次找到38,但是错误调用了getowner。我不明白为什么因为它第一次工作。当我调用命令时,它是否在某种“泡沫”中运行?在我的大脚本中,这导致了更严重的问题,因为作业状态失败并且执行暂停,即使它抛出相同的错误。虽然一次有一个问题。

2 个答案:

答案 0 :(得分:2)

似乎我需要更好地确保我的流程在所有者过滤之前仍然存在:

    $procs = @()
    $allProcs = @(Get-WmiObject win32_process)
    foreach($proc in $allProcs)
    {
        $procActive = get-process -Id $proc.processId -ErrorAction SilentlyContinue
        if($procActive)
        {
            if($proc.getowner().user -eq 'jdholbrook')
            {
                $procs += $proc
            }
        }
    }
    write-host $procs.count

答案 1 :(得分:1)

这可能是因为您要查询所有者的进程不再存在。

您可以在本地PC上模拟此行为,如下所示:

启动一些应用程序,例如notepad.exe。现在运行:

$w = (Get-WmiObject win32_process) # Your notepad process will now be the last in the `$w` array.

关闭notepad.exe进程。

现在管道$w的内容以获取所有者:

$w | % {$_.getowner()}

对于您将获得的最后一个对象:

Exception calling "GetOwner" : "Not found "
At line:1 char:20
+ $w | % {$_.getowner <<<< ()}
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : WMIMethodException

要确保这是您刚关闭的notepad.exe,您可以仔细检查:

$w[-1]; # last object
$w[-1].getowner(); # error

所以,现在你知道是什么导致了,你可以开始考虑如何处理它......