1

我需要得到所有者的一些procs。下面我的演示脚本将首先在本地查找所有者的 procs,然后它会做同样的事情,但它会在同一个盒子上调用命令:

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 是它为本地运行的所有者找到的 procs 数。它第二次也找到 38,但调用 getowner 时出错。我不明白为什么,因为它第一次工作。当我调用命令时,它是否在某种“气泡”中运行?在我较大的脚本中,这给我带来了更严重的问题,因为作业状态失败并且执行停止,即使它抛出相同的错误。不过一次一个问题。

4

2 回答 2

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
于 2013-06-18T14:36:46.343 回答
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

所以,现在你知道是什么原因了,你可以开始考虑如何处理它了……

于 2013-06-14T09:41:44.600 回答