Powershell — убить Билла


Как иногда достают эти процессы на удаленных компьютерах с захватом 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

Удачи в охоте на Билла!

Один ответ

  1. Спасибо, Илья!

Оставьте комментарий