Паровой PowerShell Get-Process Cmdlet для Запущенных Процессов

Интересует использование командлета PowerShell Get-Process для отображения запущенных процессов системы? С помощью Get-Process вы можете найти владельца процесса, идентификатор процесса или даже местоположение процесса на диске.

В этой статье вы узнаете, как использовать командлет Get-Process в PowerShell на примерах из реального мира. Если управление процессами на Windows или Linux звучит для вас интересно, то продолжайте читать!

Связано: Как завершить процесс в Linux с использованием ps, pgrep, pkill и других инструментов!

Предварительные условия

Прежде чем двигаться дальше, вот необходимые предварительные условия для следования примерам в этой статье.

  • Хотя Windows PowerShell 5.1 достаточен для большинства примеров здесь, PowerShell 7.1 и выше необходим для поддержки Linux.

Связано: Обновление до PowerShell 7: Пошаговое руководство

  • В этой статье используются Windows 10 и Ubuntu 20.04 LTS, но любая ОС, на которой работает PowerShell, подойдет.

Готовы? Давайте погрузимся и управляем процессами!

Отображение запущенных процессов

Get-Process управляет локальными процессами. В этом первом примере вы используете модуль PowerShell Get-Process cmdlet. Эта команда отображает все запущенные процессы.

Get-Process возвращает моментальную снимок информации о запущенных процессах системы. Для отображения информации о процессах в реальном времени Windows предлагает Диспетчер задач Windows, а Linux предлагает команду top.

Для начала откройте консоль PowerShell и выполните команду Get-Process. Обратите внимание, что Get-Process возвращает информацию о запущенных процессах, как показано ниже. Формат вывода идентичен для операционных систем Windows и Linux.

Using the Get-Process cmdlet on Windows to display local processes.

По умолчанию gps или ps существуют как псевдонимы команды Get-Process. Поскольку PowerShell 7 кроссплатформенный, команда ps конфликтует с встроенной командой Linux. Поэтому на Linux работает только псевдоним gps.

Смысл вывода Get-Process может быть не сразу очевиден. По умолчанию свойства Get-Process описаны более подробно ниже.

  • NPM(K) – Количество непостоянной памяти, которую использует процесс, отображается в килобайтах, как указано в обозначении (K).
  • PM(M) – Количество используемой процессом разделяемой памяти, отображаемое в мегабайтах, как указано в обозначении (M).
  • WS(M) – Размер рабочего набора процесса, отображаемый в мегабайтах. Рабочий набор состоит из страниц памяти, на которые недавно ссылался процесс.
  • VM(M) – Количество виртуальной памяти, используемой процессом, отображаемое в мегабайтах. Включает хранение в файле подкачки на диске.
  • CPU(S) – Количество процессорного времени, использованного процессом для всех процессов, отображаемое в секундах.
  • Id – Идентификатор процесса (PID) процесса.
  • SI – Идентификатор сеанса запущенного процесса. Сеанс 0 указывает, что процесс доступен для всех пользователей, 1 указывает, что процесс существует под первым вошедшим пользователем и так далее.
  • ProcessName – Имя запущенного процесса.

Чтобы отобразить список псевдонимов свойств, сопоставленных полным именам свойств, используйте команду Get-Process | Get-Member -MemberType 'AliasProperty'.

Вот еще один отличный пример. Для каждого экземпляра процесса brave, который он находит, он использует ID этого процесса ($_.id) и передает его в Get-NetTCPConnection. Затем PowerShell использует Get-NetTCPConnection, чтобы найти информацию о каждом сетевом соединении, открытом процессом brave.

Запустите следующий код в вашей сессии PowerShell, когда запущен браузер Brave.

Get-Process -Name brave | ForEach-Object { Get-NetTCPConnection -OwningProcess $_.Id -ErrorAction SilentlyContinue } 

Спасибо Jay Adams из SystemFrontier!

Поздравляем, теперь вы можете просматривать все запущенные процессы как в Windows, так и в Linux с помощью Get-Process!

Поиск конкретных атрибутов процесса

Get-Process возвращает множество разных свойств запущенных процессов, как вы уже видели ранее. Как и со всеми другими объектами PowerShell, вы можете выбирать свойства объектов.

Теперь давайте рассмотрим простой пример того, как вы можете извлечь конкретные свойства для определенного процесса:

  1. Запустите калькулятор Windows.

2. С открытой консолью PowerShell выполните команду Get-Process, используя параметр Name, чтобы показать только все запущенные процессы с именем Калькулятор. Вы увидите тот же вывод, что и ранее.

Get-Process -Name 'Calculator'

Get-Process возвращает много свойств, как и ожидалось. Возможно, вам нужно найти только использование процессора со значением в столбце CPU(s). Оберните команду Get-Process в круглые скобки и обратитесь к свойству CPU, как показано ниже. Вы увидите, что возвращается только значение для свойства CPU.

(Get-Process -Name 'Calculator').CPU

Обратите внимание, что Get-Process возвращает имя с именем CPU(s), а фрагмент кода выше использует только имя CPU. Иногда PowerShell не показывает реальное имя свойства в выводе. Этот концепт выполняется с использованием файла форматирования PS1XML.

Время ЦП выражается как общее количество секунд по всем ядрам. Чтобы сделать его более читаемым для человека, округлите его до десятых с использованием метода Math, как показано ниже.

$cpu = (Get-Process -Name 'Calculator').CPU
[math]::Round($cpu,2)
Calculator process is using less than 1 second of CPU time across all cores.

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

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

Получение использования памяти процесса

Исправление проблем с медленной работой систем может быть вызовом, причиной которой часто является ограниченная память. Продолжая с приложением Калькулятор, получите процесс Калькулятор и отобразите только свойство VM. Как видно ниже, использованная память отображается в мегабайтах (МБ).

(Get-Process -Name 'Calculator').VM
Displaying the Calculator process memory usage.

Для помощи в понимании использования памяти используйте встроенные множители преобразования PowerShell, чтобы перевести мегабайты (МБ) в гигабайты (ГБ). В приведенном ниже примере вы переведете использованную память в ГБ, а затем используете библиотеку математики .NET метод Round для округления значения, как показано на скриншоте ниже.

$ProcessMemoryGB = (Get-Process -Name 'Calculator').VM
$ProcessMemoryGB / 1GB

# Используйте метод Round типа Math .NET
[Math]::Round($ProcessMemoryGB / 1GB)

Использование встроенных утилит PowerShell для преобразования значений упрощает понимание вывода. Читайте далее, чтобы узнать, как найти идентификатор процесса.

Converting the calculator process memory usage to a rounded GB format.

Раскрытие малоизвестных свойств

Не все свойства включены или отображаются по умолчанию с помощью Get-Process. Читайте далее, чтобы узнать больше о свойствах Path и UserName и о том, как их использовать!

Определение, где находится исполняемый файл процесса

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

(Get-Process -Name 'Calculator').Path
Using Get-Process to display a process’s full file system path on Windows.

Как и в Windows, Get-Process в Linux также возвращает путь к файловой системе. В приведенном ниже примере процесс gnome-calculator запущен с отображением пути в выводе консоли.

(Get-Process -Name 'gnome-calculator').Path
Using Powershell Get-Process to display a process’s full file system path on Linux.

Искусные злоумышленники могут назвать процесс таким же или похожим образом, как доверенный. Поэтому возможность определить путь к файловой системе полезна в сценарии реагирования на инциденты безопасности (IR). Читайте далее, чтобы узнать, как найти владельца процесса, так как в стандартном выводе отсутствует UserName.

Поиск Владельца Процесса

Чтобы включить значение UserName в вывод, вам нужно использовать параметр IncludeUserName. Важно знать владельца процесса, особенно чтобы избежать непреднамеренного завершения процесса другого пользователя. Как показано ниже, свойство UserName теперь включено в вывод процесса.

Get-Process -Name 'Calculator' -IncludeUserName
Displaying the owner of Calculator process on Windows.

Наконец, читайте далее, чтобы узнать о использовании Get-Process на удаленном компьютере для получения информации о процессах!

Поиск Процессов на Удаленных Компьютерах

Хотя в Windows PowerShell Get-Process сам по себе не имеет возможностей для работы с удаленными компьютерами, всегда можно воспользоваться PowerShell Remoting и Invoke-Command для его запуска на удаленных компьютерах.

Связано: Как настроить PSRemoting с Windows и Linux

Однако, если вы используете Linux или выполняете PowerShell 6 в Windows, у вас теперь есть параметр ComputerName, который вы можете использовать для запроса процессов на удаленных компьютерах.

Get-Process -ComputerName 'remote_computer_name' -ProcessName 'process'

Параметр -ComputerName был удален в PowerShell 7.x, поскольку cmdlet не имеет непосредственного отношения к удаленному управлению. Для достижения того же результата вы можете обернуть его в Invoke-Command, например: Invoke-Command -ComputerName "ИмяКомпьютера" -ScriptBlock { Get-Process -ProcessName 'process' }

Когда эта команда выполняется на удаленном компьютере, вывод такой же, как если бы команда Get-Process была выполнена локально.

Ниже приведен пример удаленного управления другим компьютером и получения запущенных процессов:

Computer and Getting Running Processes

Вы можете выбирать несколько компьютеров, разделяя их запятой, например: Get-Process -ComputerName SRV1,SRV2.

Следующие шаги

В этой статье вы узнали, как использовать PowerShell Get-Process cmdlet для поиска запущенных процессов с помощью PowerShell на локальных и удаленных компьютерах как на Linux, так и на Windows.

Теперь, что вы сделаете с этим знанием? Попробуйте передать процесс, полученный с помощью Get-Process, команде Stop-Process на локальном или удаленном компьютере, чтобы завершить его!

Source:
https://adamtheautomator.com/powershell-get-process/