我需要得到所有者的一些过程。我下面的演示脚本将首先在本地查找所有者的触发器,然后它将执行相同的操作,但它会在同一个盒子上调用该命令:
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。我不明白为什么因为它第一次工作。当我调用命令时,它是否在某种“泡沫”中运行?在我的大脚本中,这导致了更严重的问题,因为作业状态失败并且执行暂停,即使它抛出相同的错误。虽然一次有一个问题。
答案 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
所以,现在你知道是什么导致了,你可以开始考虑如何处理它......