Я пытаюсь получить модули, загруженные процессом на удаленном компьютере - PullRequest
2 голосов
/ 16 марта 2020

как получить модули, загруженные процессом на удаленном компьютере с помощью PowerShell.

Есть некоторые модули процессов, для которых я получаю сообщение об ошибке, например, отказано в разрешении и невозможно перечислить. Как я могу устранить эти ошибки.

Невозможно перечислить модули процесса "services" . + CategoryInfo: PermissionDenied: (System.Diagnostics.Process (services): Process) [Get-Process], ProcessCommandException + FullyQualifiedErrorId: CouldnotEnumerateModules, Microsoft.PowerShell.Comands.GetProcessCommand + PSComputerName

с помощью команды:

$Module = Invoke-Command -Session $session -ScriptBlock { Get-Process -Module }

1 Ответ

0 голосов
/ 16 марта 2020

Проблема не указана c для удаленного взаимодействия: существуют процессы, модули которых принципиально [1] не могут быть перечислены из-за отсутствия разрешений, даже при работе с повышением прав (как администратор ) .

Поскольку отчет об ошибках не прекращается ошибок, вы можете просто игнорировать (все) ошибки с -ErrorAction Ignore в источнике:

Invoke-Command -Session $session -ScriptBlock { Get-Process -Module -ErrorAction Ignore }

Если вы хотите захватить сообщения об ошибках, чтобы можно было определить процессы, для которых не удалось выполнить перечисление, используйте -ErrorVariable errs -ErrorAction SilentlyContinue, который отключает ошибки , но собирает их в переменную $errs для последующей проверки:

Invoke-Command -Session $session -ScriptBlock { Get-Process -Module } -ErrorVariable errs -ErrorAction SilentlyContinue

В частности, $errs.TargetObject перечислит объекты процесса, модули которых не могут быть перечислены.


Если целью является найти (и, возможно, уничтожить) все процессы, которые используют интересующий модуль (DLL) , используйте стандартную tasklist.exe утилиту или taskkill.exe утилита с параметром /m.

$moduleOfInterest = 'oleaut32.dll' # example DLL
$pids = (tasklist /m $moduleOfInterest /fo csv | ConvertFrom-Csv).PID

# Alternatively, use `taskkill` in lieu of `tasklist` above in 
# order to kill the processes directly.
if ($pids) { Stop-Process -Id $pids -WhatIf }

Примечание : -WhatIf общий параметр в приведенной выше команде предварительно выполняет операцию. Удалите -WhatIf, как только вы убедитесь, что операция будет выполнять то, что вы хотите.

Однако при таком подходе вы можете столкнуться и с проблемами с разрешениями.

Обратите внимание, что tasklist.exe и taskkill.exe имеют встроенную функцию удаленного взаимодействия через параметр /S, позволяющую настроить таргетинг на один удаленный компьютер.

Однако, используя удаленное взаимодействие PowerShell (через Invoke-Command s -ComputerName / -Session (параметры)) дает вам больше гибкости, в частности, возможность нацеливаться на несколько компьютеров параллельно.


[1] По крайней мере по умолчанию, только высота недостаточно; если кто-нибудь знает, есть ли способ перечислить, тем не менее, дайте нам знать. Этот связанный вопрос специально запрашивает эту информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...