Get process owner. Как узнать имя владельца процесса в Powershell.
Небольшая статья о том как с помощью Powershell получить список процессов и особенно как получить владельца процесса на локальном и удаленном компьютере разными способами.
На написание данной статьи меня натолкнула проблема с периодическим повышенным потреблением оперативной памяти на некоторых серверах. Доходило до того, что к ним невозможно было даже подключиться по RDP. Но с помощью Powershell можно было вычислить «пожирателей» ресурсов. В процессе изучения возможности получения информации о владельце процессов выяснилось, что получить ее можно несколькими способами: Get-Process, Get-WmiObject и Get-CimInstance. Поскольку меня интересовали процессы, потребляющие больше всего памяти, в статье будут примеры с сортировкой по этому параметру. Все действия, описанные в статье, выполнялись в оболочке, запущенной от имени Администратора.
Первый способ как получить владельца процесса. Get-Process.
Получение списка процессов и их владельцев на локальном компьютере не представляет сложности, особенно с пятой(если не ошибаюсь) версии Powershell. Для того чтобы получить список всех процессов используем командлет Get-Process с параметром IncludeUsername.
1 |
Get-Process -IncludeUserName |
Для получения 10 процессов с наибольшим потреблением памяти команда будет выглядеть так:
1 |
Get-Process -IncludeUserName | sort -Property ws -Descending | select -First 10 |
Ну и отформатированный вывод только с нужными свойствами:
1 |
Get-Process -IncludeUserName | sort -Property ws -Descending | select -First 10 | ft -AutoSize -Property Id, ProcessName, @{Label='WS(MB)'; E={$('{0:N2}' -f ($_.WS / 1MB))}}, UserName, PSComputerName |
Для получения списка процессов на удаленном компьютере нужно прибегнуть к помощи командлета Invoke-Command:
1 |
Invoke-Command -ComputerName srv1 -Command {Get-Process -IncludeUserName | sort -Property ws -Descending | select -First 10} | ft -AutoSize -Property Id, ProcessName, @{Label='WS(MB)'; E={$('{0:N2}' -f ($_.WS / 1MB))}}, UserName, PSComputerName |
При необходимости укажите учетные данные при помощи параметра -Credential.
Второй способ. Get-WmiObject.
При использовании данного способа для локального компьютера команда выглядит так:
1 |
Get-WmiObject Win32_Process | sort -Property WS -Descending | select -First 10 | ft -Property 'ProcessId', 'ProcessName', @{Label='WS'; E={$('{0:N2}' -f ($_.WS / 1MB))}}, @{Label='Owner'; E={($_.GetOwner().User)}} |
а для удаленного так:
1 |
Get-WmiObject Win32_Process -ComputerName srv1 | sort -Property WS -Descending | select -First 10 | ft -Property ProcessId, ProcessName, @{Label='WS(MB)'; E={$('{0:N2}' -f ($_.WS / 1MB))}}, @{Label='Owner'; E={($_.GetOwner().User)}}, PSComputerName |
Третий способ. Get-CIMInstance.
Ну и по третьему методу совсем коротенько. Укажу код только для получения информации с удаленного компьютера. Вся разница между удаленным и локальным выполнением команд заключается только в параметрах -ComputerName и -Credential при необходимости. Итак код:
1 2 |
$processes = Get-CimInstance -ComputerName srv1 -Class Win32_Process | sort -Property 'WorkingSetSize' -Descending | select -First 10 $processes | ft ProcessId, Name, @{Label='WS(MB)'; E={$('{0:N2}' -f ($_.WorkingSetSize / 1MB))}}, @{n='Owner';e={(Invoke-CimMethod -InputObject $_ -MethodName GetOwner).User}}, PSComputerName |
Переменную $processes можно не объявлять, а просто продолжить конвейер команд.
На этом всё, надеюсь статья поможет кому-то в получении списка процессов и особенно их владельцев. Естественно вы можете сортировать процессы по другим параметрам, выбирать другое количество процессов и т.д.