Основываясь на информации из моего предыдущего вопроса, я пытаюсь изучить wmic.
Я играю, пытаясь посмотреть, какие процессы используют больше всего ресурсов на удаленном сервере. То, что мне удалось придумать, находится в нижней части этого поста. Он очень хорошо работает на моем локальном компьютере, но когда я psexec на сервере (Windows 2003 или 2008) и пытаюсь запустить эту команду, она почти каждый раз зависает. Я не могу даже ctrl + c заставить его остановиться. Я использовал RDP (используя другое имя пользователя), чтобы попасть на одну из машин, на которой эта команда зависает. Имя пользователя, которое отправляет команду из psexec, показывает два элемента, перечисленных в диспетчере задач, cmd и wmic. Они остались в диспетчере задач через несколько часов после отправки команды. Когда я их заканчиваю, моя консоль освобождается на моем локальном компьютере.
Я попытался найти причины, по которым это может зависать, но ничего не могу найти. Я также спросил одного из своих системных администраторов, но эти ребята всегда слишком заняты, чтобы помочь скромному парню из NOC (хотя вполне законно. Они действительно очень заняты). Есть идеи относительно того, что может пойти не так?
wmic path win32_perfformatteddata_perfproc_process where (PercentProcessorTime != 0) get Name, PercentProcessorTime, IDProcess
Я настоятельно рекомендую отказаться от WMIC.EXE и использовать вместо него PowerShell. PowerShell позволяет использовать RPC для доступа к интерфейсу WMI удаленного сервера, устраняя необходимость в PsExec. Хотя PsExec - полезный инструмент, я бы использовал его только в случае крайней необходимости, поскольку он создает службу на удаленном сервере, вновь созданная удаленная служба затем порождает процесс для запуска вашего кода, а затем служба должна автоматически запускаться. Удалить. Однако я встречал серверы, на которых произошел сбой служб PsExec, и множество потерянных процессов, которые не работали по той или иной причине. Итак, после того, как я проповедую, вот эквивалент с использованием PowerShell:
Get-WmiObject -ComputerName "<REMOTE-SERVER-NAME>" -class Win32_PerfFormattedData_PerfProc_Process -Impersonation Impersonate -Filter "PercentProcessorTime != 0 and name != '_Total'" | Select-Object name, PercentProcessorTime, IDProcess