Как иногда достают эти процессы на удаленных компьютерах с захватом CPU под 100%! Особенно таинственные образования с префиксом HP от одноименной компании. Самое интересное висит такой процесс сутками, после перезагрузки воскресает вновь, но стоит его один раз качественно убить – и он исчезает навечно! Чудеса!
Вопрос в том, как найти процесс вредитель и как его качественно убить с помощью Powershell.
Есть стандартный командлет Get-Process. Самый бессмысленный, как я считаю:
1. Он возвращает массив объектов описывающих текущие процессы в системе и даже показывает CPU(s), но вот это CPU(s) не загрузка процессора, а время занятия процессора с момента старта сервиса, что совсем иное и не то, что нам нужно.
2. У объектов описывающих текущие процессы есть метод Kill, но работает он только для локальных объектов: для процессов полученных с удаленного компьютера метод Kill не работает.
Другой вариант использовать WMI класс Win32_Process. В этом случае можно получить список процессов на удаленном компьютере и даже убить удаленный процесс. Только вот загрузку процессора этот класс нам не даст. Для получения загрузки процессора нужен другой WMI класс – Win32_PerfFormattedData_PerfProc_Process.
Теперь мы можем найти самые прожорливые процессы хоть на локальном, хоть на удаленном компьютере:
$CompName = "."
gwmi Win32_PerfFormattedData_PerfProc_Process -Computername $CompName | Sort-Object PercentProcessorTime -desc | Select-Object -first 6 | ft Name, PercentProcessorTime,IDProcess
Получаем что-то подобное:
Name |
PercentProcessorTime |
IDProcess |
—- |
——————— |
——— |
_Total |
100 |
0 |
Idle |
100 |
0 |
ouc |
5 |
3620 |
ETDCtrlHelper |
0 |
4408 |
ATKOSD |
0 |
4508 |
hkcmd |
0 |
1784 |
Теперь остается решить какой процесс проблемный и убить его. Проще всего не заморачиваться с командлетами Powershell и объектами .Net, а использовать стандартную утилиту TASKKILL, вызывая ее из Powershell:
TASKKILL /PID 3620 /S $CompName
Удачи в охоте на Билла!
Filed under: Powershell | Tagged: Powershell |
Спасибо, Илья!