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

Итак, теперь вы знаете, что является причиной, вы можете начать думать о том, как справиться с этим...

Другие вопросы по тегам