Как работать с процессами в Powershell используя Get и Start-Proccess
26 сентября 2019
Процессы — это один из основных компонентов Windows и чаще всего мы работаем с ними через Task Manager (диспетчер задач), но эта возможность становится весомее если мы используем команды по управлению процессами в Powershell. Основные команды по управлению запущенными задачами можно увидеть так:
Мы получим следующий вывод:
- Debug-Process — возможность мониторинга и отладки процессов. Для его работы нужно загрузить дополнительное ПО.
- Get-Process — получение в Powershell списка процессов.
- Start-Process — запуск процессов.
- Stop-Process — убивает (завершает) процесс.
- Wait-Process — ожидание окончания процесса.
Таких команд и вариантов их использования очень много. Например мы можем работать с процессами через WMI или использовать их в связке с мониторингом сетевых подключений через Get-NetTCPConnection.
Получив список процессов в Powershell можно увидеть что значения отображаются в Кб:
Изменить это можно через выражения:
В скрипте выше будут выводиться 5 свойств, но их намного больше. Посмотреть возможные свойства можно так:
Каждое это свойство можно вызвать так:
Можно вызвать все свойства всех процессов или по одному выбранному:
Кроме свойств есть еще методы .NET, которые выводятся без дополнительных ключей или с указанием:
Методы полезны тем, что ими можно воспользоваться не прибегая к дополнительным командам. Для примера так мы можем остановить процесс notepad (блокнот) тремя разными способами:
Методы .NET не всегда так очевидны, как командлеты поэтому к ним нужно прибегать с осторожностью.
При получении списка процессов есть параметр, который выводит путь откуда запущен процесс и версию файла:
В варианте выше у нас будет много не критичных ошибок:
- Get-Process : Не удалось перечислить информацию о версиях файла для процесса «svchost».
- Get-Process : Cannot enumerate the file version information of the «csrss» process.
Связано это с тем, что не все процессы в Powershell имеют версии и выполняется запрос несуществующего свойства. Этого можно избежать двумя путями, первый — это указать параметр, который будет игнорировать эти ошибки:
Или запросить информацию о конкретном процессе:
Ключ FileVersionInfo это три свойства: Product, FileVersion и Path каждый из которых можно вывести отдельно. Получим процессы в Powershell со свойством времени запуска и отсортируем их:
Если нужно выяснить когда и кто запустил процесс нужно добавить параметр IncludeUserName. В моем примере это два процесса:
Эти же команды можно выполнять удаленно. Во всех командах Powershell, где есть ключ ComputerName можно указать минимум один удаленный компьютер:
Выполняя удаленную команду вы можете получить две ошибки. Первую, если у вас не настроена возможность удаленного управления в Powershell. И вторая, если вы укажете ключ -IncludeUserName, почему-то он не работает совместно с ComputerName:
- Get-Process : Parameter set cannot be resolved using the specified named parameters.
Запуск процессов с Powershell Start-Process
На примере запуска блокнота команда выполняется так:
Если исполняемый файл находится в другом месте нужно указать путь:
Если в программа может принимать аргументы их так же можно добавить:
По умолчанию окно процесса разворачивается. Если хотите запустить свернутым, то добавьте ключ WindowStyle:
Ключ WindowStyle принимает 4 значения:
- minimized — свернутый вариант.
- hidden — скрытый режим.
- normal — обычный.
- maximized — полностью развернутый.
Добавив ключ NoNewWindow, в случае с tracert, команда выполнится в текущем окне:
Если мы запускаем процесс, который подразумевает вывод, но не хотим открывать окно программы, то нам понадобится перенаправить вывод команд. Для этого есть два ключа:
- RedirectStandardOutput — перенаправляет вывод
- RedirectStandardError — перенаправляет ошибки
- RedirectStandardInput — перенаправляет ввод
Воспользоваться этими ключами можно так:
Если нужно открыть файл в определенной программе, то это делается так:
Отмечу, что ни одна команда PS не позволяет запускать процессы в интерактивном сеансе пользователя (например открыть пользователю Excel). Если вы хотите использовать такой метод, то вам нужно использовать psexec от SysInternals либо помещать задачи в планировщик и выполнять оттуда.
Пример по работе с процессами в Powershell
Директории, откуда работает основная часть программ относятся к Windows и Program Files. Работа программ из Application Data, например, всегда подозрительна. Мы можем мониторить запуск процессов из этой директории. Нам нужно объявить переменные с путями, которые не будут вызывать подозрений и проверять путь процессов на вхождение:
Второй пример выполнения — это запуск всех файлов из папки. Обычно скрипты применяются через групповые политики в момент входа пользователя. Если таких скриптов 10, то мы можем поместить их в определенную папку и запускать из планировщика задач указывая только директорию и расширение запускаемого файла и перенаправлять ошибки в индивидуальный файл:
Обратите внимание, что все файлы с ошибками будут сохраняться с именем компьютеров на котором запущен скрипт. В каждом из скриптов я так же ставил знак *, это связано не с точным вхождением. Например в первом случае после пути C:\Users* мы ожидаем еще символы и установив звездочку мы это указали. В случае Get-ChildItem ситуация похожая, но более подробно мы обсуждали в статье поиск файлов в Powershell.
Мы можем использовать поиск процессов не относящихся к производителям ПО, которые мы устанавливали на ПК пользователей. Для этого есть свойство Company. Не все объекты имеют имя компании, они связаны с задачами операционной системы:
По умолчанию мы получаем данные по CPU в секундах, но следующий скрипт вернет процент использования:
Далее эту функцию можно запускать на удаленных компьютерах:
Управление процессами Windows из командной строки
Для управления процессами Windows существует много разных утилит и приложений. Как правило, для этих целей командная строка используется очень редко. Но в некоторых случаях, это единственная возможность и другие средства недоступны. Такое может возникнуть при блокировке стандартных диспетчеров различными вирусами и другими, нехорошими программами. Поэтому, будет очень полезно знать и уметь работать с процессами через командную строку.
Чтобы управлять процессами, при помощи возможностей командной строки, в системе предусмотрено два специальных приложения: tasklist и taskkill. Из их названия можно догадаться и об их предназначении — первое может отображать список всех запущенных процессов на данном компьютере, или на удаленной машине, а вторая умеет их останавливать. Давайте глянем, как это работает на практике.
Введите, в окне терминала, tasklist и командная строка выдаст весь список рабочих процессов на данном компьютере.
Все данные будут отображаться в табличной форме, но можно поменять вид данных в другой формат. Воспользуйтесь параметром /fo и все отобразится в виде списка (или как CSV), а если использовать параметр /v, то в этот список будут включены более подробные данные о каждом процессе. Введите команду taskliist /v /fo list (без кавычек естественно) и в окне должна появиться приблизительно такая картина.
Обычно список выходит немалых размеров, и чтобы не листать его слишком долго, выполним более точный запрос. Для этих целей существует параметр /fi, способный уточнить поиск процессов используя фильтры. Для примера, введем команду, которая отобразит все процессы, запущенные от имени пользователя user и занимающие до 40 мегабайт в памяти компьютера. Команда выглядит следующим образом: tasklist /fi »username eq user» /fi »memusage le 40000». А на рисунке ниже представлен результат работы команды.
Допустим, мы нашили процессы, которые хотим завершить. Теперь настал черед утилиты «taskkill». Для прекращения работы процесса можно использовать его имя, или идентификатор PID, а можно прекращать процессы используя разные фильтры. Для эксперимента, мы запустим несколько окон программы Блокнот (notepad.exe) и на них испытаем разные способы.
При помощи параметра /f процесс будет завершен в принудительном порядке, а если добавить еще ключ /t — завершатся все другие, которые были через него запущенны. Чтобы узнать больше возможностей, для команд tasklist и taskkill, добавьте к ним ключ /?. Он отобразит полную справку для этих утилит. Не будем забывать про такое мощное средство, как PowerShell. Мы можем им воспользоваться и прям в этом же окне командной строки. Чтобы просмотреть весь список процессов, запустите команду Get-Process.
Чтобы опять не рыться во всех найденных процессах, можно задать фильтр для получения отдельных, соответствующих критериям, процессов. Для этого существует команду Where-Object. Давайте получим табличку с процессами, загружающими процессор на данном компьютере и выстроим их в порядке возрастания нагрузки. Воспользуемся командой следующего вида: Get-Process | where <$_.cpu -gt 0>| sort cpu
Результат будет иметь приблизительно такой вид:
Здесь можно получить полную информацию о любом запущенном процессе. Сейчас мы узнаем список всех свойств процесса cmd. Это можно сделать при помощи такой команды:
Get-Process -Name cmd | Get-Member -Membertype property
Выведем только нужные свойства. Например, оставим только имя, идентификатор процесса, путь к его исполнительному файлу, подключенные модуле и время, когда процесс был запущен. Все это мы выводим списком, при помощи такой команды:
Get-Process -Name cmd | Format-List name, id, path, modules, starttime
Благодаря этому мы узнаем о том, кто запустил процесс, как сильно он грузит систему, где располагается его файл и еще кучу разной, полезной и не очень информации.
Чтобы остановить процесс через PowerShell используйте специальный командой Stop-Process. Для того, чтобы указать нужный процесс для завершения, используйте его имя или идентификатор. Например, можно по конвейеру прекратить работу блокнота:
Get-Process | where <$_.name -match ″notepad″>| Stop-Process
Для работы с процессами на другом, удаленном компьютере необходимо использовать совсем другой командой — Get-WmiObject. Сейчас посмотрим, какие процессы запущенны на компьютере с именем «PC»:
Get-WmiObject win32_process -computername PC | ft name, processid, description
Чтобы узнать больше информации и различных ключей, для работы с процессами через PowerShell, используйте встроенную справку. Запустите команду Get-Help «имя команды» и появится справка по указанному параметру. Есть еще две дополнительные утилиты, способные выполнять операции с процессами. Ими являются Pslist и Pskill. Изначально их в системе нет, они входят в пакет PSTools.
Сами по себе эти приложения не нуждаются в установке. Их достаточно скопировать в любое место на своем жестком диске. Чтобы запустить, зайдите в папку, где они хранятся, и активируйте нужной командой.
Соответственно, утилита Pslist способна вывести информацию о процессах, запущенных на компьютере. Можно выборочно находить отдельные процессы и выводить их на экран. Давайте продолжим издеваться над запущенным блокнотом и просмотрим о нем информацию командой pslist notepad -x.
Интересной функцией Pslist является возможность работы в режиме диспетчера процессов. Вся информация постоянно обновляется и можно задавать подходящий интервал получения актуальных данных. За этот режим ответствен ключ -s. Допустим, необходимо установить режим диспетчера с обновлением каждые десять секунд, эта команда будет выглядеть так: tasklist -s -r 10
Завершить любой процесс можно при помощи утилиты Pskill. Введите эту команду и идентификатор процесса, или его имя. На рисунке ниже можете посмотреть, как это будет выглядеть в случае с бедным блокнотом.
Дополнительную информацию, в виде справки, можно открыть дополнительным параметром /?
Самый главный момент — командная строка, во всех случаях, должна быть запущена от имени администратора, иначе ничего не получится. Но если столкнетесь с какими-либо сложными проблемами, или возникнут вопросы, то всегда можно этим поделиться в комментариях к данной статье, и мы вместе постараемся разобраться.