2019-02-05

PowerShell: Процессы

Когда нужно просмотреть информацию о процессах более детально, можно воспользоваться программами на подобии Process Explorer или Process Hacker. А если выбор ограничен? Получить информацию о процессах поможет PowerShell.



Содержание




Вывод Списка Процессов Системы


Получить информацию о процессах можно с помощью командлета Get-Process. Запускаем PowerShell, и выполняем команду:

# Вывод списка процессов
Get-Process


Вывод команды представлен в виде таблицы. По умолчанию выводятся поля: Количество дескрипторов процесса (Handles), Объем невыгружаемой памяти процесса (NPM - Nonpaged System Memory), Объем памяти процесса возможный для записи в файл подкачки (PM - Paged System Memory), Объем памяти процесса выделенный в оперативной памяти (WS - Working Set), Использованное процессорное время (CPU), Имя процесса (ProcessName).


Фильтрация Выводимых Данных


Полученные данные, представляют полный список процессов системы. Что если вам необходимо отслеживать только конкретные процессы. Вывод командлета Get-Process можно отфильтровать используя имя конкретного процесса, или маску имени процесса.

# Вывод всех процессов с именем "browser"
Get-Process browser


Теперь все то же самое, но с использованием масок.

# Вывод всех процессов начинающихся на "bro"
Get-Process bro*


Для ясности, знак звездочки *, означает любое количество символов, а знак вопросительного знака ?, один любой символ.

Кроме фильтрации по именам процессов, можно отфильтровать и выводимые поля всей таблицы. К примеру, нас интересуют только поля Id, ProcessName, WS. Причем вывод должен быть именно в указанном порядке.

# Вывод указанных полей всех процессов начинающихся на "bro"
 Get-Process bro* | Select-Object Id, ProcessName, WS



Вывод Дополнительной Информации


Кроме базовых полей (Handles, NPM, PM, WS, CPU, SI, ProcessName) выводимых командлетом Get-Process, существуют еще дополнительные. По умолчанию они не выводятся при выполнении командлета, так как вывод всех полей в виде таблицы, не может поместиться в окне консоли, даже если данное окно развернуть на весь экран. Но отобразить все поля все же можно.

Для примера, выведем все поля процесса winlogon в виде списка.

# Вывод всех полей процесса "winlogon" в виде списка
Get-Process winlogon | Format-List *


Как можно заметить, полей довольно-таки много. Причем значение некоторых дублируется, к примеру Name и ProcessName. Это сокращения, для удобства использования.

Дополнительные поля содержат полезную информацию, к примеру:

Path - Путь до исполняемого файла процесса.
Description - Описание исполняемого файла.
MainWindowTitle - Заголовок главного окна процесса, если окно конечно есть.
Modules - Модули используемые процессом.
MainModule - Главный модуль процесса.
StartTime - Время запуска процесса.
Priority - Приоритет процесса.
Company - Компания создавшая исполняемый файл процесса.
ProductVersion - Версия исполняемого файла процесса.
UserProcessorTime - То же что и CPU (использованное процессорное время), но только в более удобном формате.
Threads -

Составим из этих полей свою версию вывода информации о процессах.

# Вывод указанных полей в виде таблицы
Get-Process v*,p*,n* | Format-Table Id, Path, MainWindowT*, Description, Company, ProductVersion



Пользователь Запустивший Процесс


Если вы обратили внимание, то скорее всего заметили, что среди дополнительных полей нет информации о пользователе запустившем конкретный процесс. Вывести данную информацию можно выполнив командлет Get-Process с ключом -IncludeUserName.

# Вывод указанных процессов с информацией о пользователе
Get-Process v*,p*,n* -IncludeUserName | Format-Table -AutoSize



Сортировка Вывода


Выполнить сортировку вывода командлета Get-Process можно передав его вывод по конвейеру командлету Sort-Object. К примеру, сортировка по имени процесса, в алфавитном порядке.

# Выполнение сортировки по имени процесса
Get-Process | Sort-Object ProcessName


Теперь, отсортируем вывод по полую WS, в порядке убывания. Так мы сможем определить самый прожорливый процесс, он будет первым в списке.

# Выполнение сортировки по используемой оперативной памяти
Get-Process | Sort-Object WS -Descending



Вывод Процессов по Условию


Условия, позволяют выбрать из списка всех процессов, те, что удовлетворяют определенным критериям. К примеру выберем из списка процессов, все, объем выделенной памяти для которых больше 50 МБ.

# Вывод процессов объем выделенной памяти для которых больше или равен 50 МБ
Get-Process | Where-Object WS -ge 50MB


Вся выборка осуществляется с помощью командлета Where-Object. Если вкратце, данный командлет принимает на вход указанный параметр, и выполняет его сравнение. В данном случае, в качестве параметра выступает поле WS, значение которого должно быть больше или равно 50MB. Данное равенство указывается с помощью параметра -ge (Greater than or equal).

Существуют и другие параметры сравнения: -gt больше, -lt меньше, -eq равно, -ge больше/равно, -le меньше/равно. Подробнее все параметры сравнения, можно посмотреть в справке по командлету Where-Object.

# Вызов онлайн-справки по командлету Where-Object
Get-Help Where-Object -online


Вывод Взаимосвязанных Служб


За запущенными процессами, могут скрываться службы. То есть, какой-то из процессов может быть на самом деле запущенной службой. Попробуем вывести такие службы.

# Вывод взаимосвязанных служб с сортировкой по ID процесса
Get-WmiObject Win32_Service | Where-Object ProcessId -In (Get-Process svc*).Id | Sort-Object proc* | Format-Table proc*, pathn*, stat*, name*


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

# Вывод взаимосвязанных служб с сортировкой по ID процесса
gwmi Win32_Service | ? Proc* -In(ps svc*).Id | sort proc* | ft proc*, pathn*, stat*, name*, des*



Закрытие Процессов


Научившись фильтровать необходимые процессы, можно с ними можно выполнять различные действия. К примеру можно их закрыть.

Допустим в системе запущено 4 процесса notepad и 1 notepad++.


Закрыть 4 обычных блокнота, можно передав отфильтрованный список командлету Stop-Process.

# Закрыть все процессы "notepad"
Get-Process notepad | Stop-Process




Получить список модулей используемых процессом, можно с помощью поля Modules. Желательно выводить данное поле для конкретно отдельного процесса, так как вывод данного свойства для всех процессов, выведет общий список всех используемых модулей.

# Вывод взаимосвязанных модулей процесса "x64dbg"
(get-process x64dbg).Modules


Если внимательно посмотреть на список модулей, то можно увидеть загруженные библиотеки DLL находящиеся в одной папке с исполняемым файлом.


Итог


В статье было рассмотрено: Как вывести список процессов в PowerShell? Как выполнить сортировку процессов в PowerShell? Как вывести взаимосвязанные службы процессов в PowerShell? Как вывести взаимосвязанные модули процесса в PowerShell? Как отфильтровать список процессов в PowerShell? Как вывести процессы по заданному условию в PowerShell?

Комментариев нет :

Отправка комментария