Powershell: исключение, вызывающее "GetOwner": "Не найдено" при вызове в качестве задания
Мне нужно получить некоторые процы от владельца. Мой демонстрационный скрипт ниже будет сначала искать 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 - это количество процедур, которые он нашел для владельца, работающего локально. Он также находит 38 во второй раз, но ошибки вызывают getowner. Я не понимаю почему, так как это сработало в первый раз. Это работает в каком-то "пузыре", когда я вызываю команду? В моем более крупном сценарии это вызывает у меня более серьезные проблемы, так как состояние задания переходит в состояние сбоя, и выполнение останавливается, даже если оно выдает ту же ошибку. Одна проблема за один раз, хотя.
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
Вероятно, это связано с тем, что процесс, для которого вы хотите запросить владельца, больше не существует.
Вы можете смоделировать это поведение на своем локальном ПК следующим образом:
Запустите какое-нибудь приложение, например 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
Итак, теперь вы знаете, что является причиной, вы можете начать думать о том, как справиться с этим...