Powershell какой процесс открыл файл

Обновлено: 04.07.2024

Люди командной строки

Джулия Тим / Shutterstock

Microsoft представила PowerShell в качестве сменной оболочки, но она обладает гораздо большей функциональностью, чем эта, и является сложным и функциональным языком. Давайте посмотрим в этой статье, как вы можете использовать PowerShell для работы с заблокированными файлами.

Проблема с заблокированным файлом

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

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

Тестирование на заблокированные файлы

В Windows вы можете проверить, не заблокирован ли отдельный файл. Используя следующий блок кода, вы можете проверить, не заблокирован ли данный файл. $Item Для переменной необходимо указать полный путь к файлу. Проверяя, можно ли открыть файл для записи, как видно из [System.IO.File]::Open($Item,'Open','Write') Команда, вы можете сказать, если файл заблокирован.

Get-SMBOpenFile

Я говорил, что в Windows нет встроенной функции, но есть один случай, когда функция существует. Если у вас есть удаленный ресурс или даже административный ресурс (например, c$ ), то вы можете использовать Get-SMBOpenFile Командлет для отчета об этих открытых файлах.

Недостатком является то, что это работает только для файлов, к которым имеется удаленный доступ. О любых заблокированных файлах, которые используются в вашей локальной системе, не будет сообщено, поэтому в большинстве случаев это не является жизнеспособным решением. Чтобы закрыть, вы можете передать открытые файлы, возвращенные в Close-SMBOpenFile команда.

Утилита OpenFiles

Windows имеет встроенную утилиту с именем openfiles это может помочь перечислить, какие файлы используются и отключить их. На первый взгляд выглядит идеально для ваших нужд! Вы можете даже обернуть это в функцию PowerShell, чтобы упростить запрос и отключение файлов.

В предыдущих примерах вы можете увидеть, как импортировать вывод CSV из openfiles в PowerShell. Используя эту информацию, вы можете disconnect файл, чтобы разблокировать его. Из-за снижения производительности вы можете столкнуться с включением maintain objects list возможность, это может не стоить для ваших нужд. Из-за этого могут потребоваться другие решения.

Ручка приложения

Sysinternals известен многими полезными и почти необходимыми ИТ-инструментами, которые они делают. Некоторое время назад Sysinternals была приобретена Microsoft, и вы можете загрузить и использовать эти хорошо поддерживаемые инструменты для себя. Удобно, есть приложение с именем handles это обеспечивает именно то, что вы ищете!

Во-первых, вам нужно скачать приложения, разархивируйте файлы и поместите исполняемые файлы в папку, в которую включена переменная среды Path. Таким образом, вы можете легко ссылаться на приложение там, где оно вам нужно. Используя простой запрос для открытых файлов, вы можете увидеть, что вы получите много результатов (усеченных для удобства чтения).

В конечном итоге вы получаете набор файлов, перечисленных в зависимости от процесса, которые, как вы знаете, используются и могут быть отфильтрованы. Если вы обнаружите, что вам нужно закрыть один из них, вы можете сделать следующее (как администратор):

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

Вывод

Работа с заблокированными файлами может быть сложной задачей, особенно когда это останавливает то, что вам нужно, чтобы сделать это быстро. Существует несколько способов найти и разблокировать эти файлы, но это требует небольшой работы, поскольку в Windows нет действительно всеобъемлющего встроенного метода работы с этими заблокированными файлами. Описанные решения должны быстро решить любую проблему и позволить вам перейти к более важным задачам!

date

27.07.2021

directory

PowerShell, Windows 10, Windows Server 2016

comments

комментариев 5

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

Список доступных командлетов управления процессами в Windows 10 можно вывести так:

Get-Command –Noun Process

командлеты управления процессами в powershell

  • Get-Process – получить список запущенных процессов;
  • Start-Process – запустить процесс/программу;
  • Stop-Process – принудительно остановить процесс;
  • Debug-Process – используется для отладки процессов;
  • Wait-Process – используется для ожидания окончания процесса.

Get-Process – получение списка запущенных процессов

Командлет Get-Process позволяет вывести список запущенных процессов на локальном компьютере.

Get-Process список запушенных процессов

По-умолчанию выводятся следующие свойства запущенных процессов:

Чтобы получить все свойства нескольких процессов:

Get-Process winword, notep* | Format-List *

Можно вывести только определенный свойства процессов. Например, имя (ProcessName) время запуска (StartTime), заголовок окна процесса (MainWindowTitle), имя исполняемого файла (Path) и наименование разработчика (Company):

Get-Process winword, notep* | Select-Object ProcessName, StartTime, MainWindowTitle, Path, Company|ft

вывести подроюную информацию о запущенных процессах

Вывести список запущенных процессов пользователя с графическими окнами (в список не попадут фоновые и системные процессы):

Get-Process | Where-Object | Format-Table Id, Name, mainWindowtitle

Get-Process | Where-Object <<img class=

.mainWindowTitle - процессы с графическими окнами" width="" />
.mainWindowTitle - процессы с графическими окнами" width="" />

С помощью параметра IncludeUserName можно вывести имя пользователя (владельца), который запустил процесс:

Get-Process -Name winword -IncludeUserName

С помощью Where-Object можно выбрать процессы в соответствии с заданными критериями. Например, выведем все процессы, которые используются более 200 Мб оперативной памяти, отсортируем процессы в порядке убывания используемого объема RAM, размер памяти из Кб преобразуем в Мб:

Get-Process найти процессы, которые занимают более 200 Мб оперативной памяти

Как мы уже говорили ранее командлет Get-Process в параметре CPU содержит время использования процессора конкретным процессом в секундах. Чтобы отобразить процент использования CPU процессами (по аналогии с Task Manager), используйте такую функцию:

function Get-CPUPercent
$CPUPercent = @Name = 'CPUPercent'
Expression = $TotalSec = (New-TimeSpan -Start $_.StartTime).TotalSeconds
[Math]::Round( ($_.CPU * 100 / $TotalSec), 2)
>
>
Get-Process | Select-Object -Property Name, $CPUPercent, Description | Sort-Object -Property CPUPercent -Descending | Select-Object -First 20
>

PowerShellс скрипт с Get-Process выводит процент использования CPU процессами

Чтобы найти зависшие процессы (которые не отвечают), выполните команду:

Start-Process, Stop-Process: запуск и остановка процессов из PowerShell

Чтобы запустить новый процесс с помощью PowerShell используется команда:

Start-Process -FilePath notepad

Если каталог с исполняемым файлом отсутствует в переменной окружения $env:path, нужно указать полный путь к файлу:

Start-Process -FilePath 'C:\distr\app.exe'

Можно запустить программу и передать ей аргументы:

Start-Process -FilePath ping -ArgumentList "-n 10 192.168.1.11"

С помощью параметра WindowStyle вы можете задать режим запуска окна процесса (normal, minimized, maximized, hidden). Например, чтобы запустить программу в максимально развернуом окне и дождаться завершения процесса, выполните команду:

Start-Process -FilePath tracert -ArgumentList "192.168.1.11" –wait -windowstyle Maximized

С помощью командлета Stop-Process можно завершить любой процесс. Например, чтобы закрыть все запущенные процессы notepad:

Stop-Process -Name notepad

По-умолчанию не запрашивается подтверждение завершения процесса. Закрываются все процессы, которые соответствуют указанным критериям. Чтобы запросить подтверждение завершения для каждого процесса, добавьте –Confirm.

Stop-Process -Name notepad.exe -Confirm

Stop-Process завершить процесс powershell

(Get-Process -Name notepad).Kill()

Из PowerShell можно принудительно завершить все приложения, которые не отвечают диспетчеру процессов Windows:

Get-Process | where-object | Stop-Process

PowerShell: управление процессами на удаленном компьютере

С помощью аргумента ComputerName командлет Get-Process позволяет управлять процессами на удаленных компьютерах (должен быть включен и настроен WinRM).

Get-Process -ComputerName dc01, dc02| Format-Table -Property ProcessName, ID, MachineName

Мы рассматриваем встроенные возможности комнадлета Get-Process для управления процессами на удаленных компьютерах. Здесь не учитываются возможности PowerShell Remoting, которые доступны в командлетах Invoke-Command и Enter-PSSession.

Если вы хотите завершить процесс на удаленном компьютере, имейте в виду, что у командлета Stop-Process отсутствует параметр –ComputerName. Для завершения процесса на удаленном компьютере можно использовать такой PowerShell код:

$RProc = Get-Process -Name notepad -ComputerName dc01
Stop-Process -InputObject $RProc

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


Содержание

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

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


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

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

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


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


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

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


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

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

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



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

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

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

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


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

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


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

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


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


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

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


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

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

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

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


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


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

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

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


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


Вывод Взаимосвязанных Модулей

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


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

Работа с процессами через Powershell Get-Process

Командлет Powershell Get-Process возвращает все процессы запущенные на локальном компьютере. Команда пишется так:

Мы так же можем посмотреть так же процессы, запущенные на удаленном компьютере:

Но для того, что бы мы смогли это сделать удаленно у нас минимум должен быть включен WinRM. Если вы впервые слышите об этом, то вы можете прочитать об этом в этой статье. Так же добавлю, что ключ -ComputerName частый признак того, что мы можем выполнить команду удаленно.

Навигация по посту

Скорее всего мы хотим получить более детальную информацию или отфильтровать её. Если мы хотим получить информацию об экземплярах, достаточно заполнить ключ -Name:

Где:
-IncludeUserName - выведет имя того, кто запустил экземпляр.

Если мы не знаем имени, можно добавить * :

Получение процессов через Powershell Get-Process

При этом если у вас запущено несколько процессов с этим именем, вернуться все.

Расшифрую заголовки:

  • Handles - Дескриптор процесса, кто-то может знать под HWND. Уникальное число потока ввода - вывода.
  • NPM(K) - Non-paged memory. Данные, которые не выгружаются на диск в килобайтах.
  • PM(K) - Pageable memory. Данные, которые могут быть выгружены на диск в килобайтах.
  • WS(K) - Process working set. Рабочий набор процесса или сумма всех страниц, которые на данный момент находятся в памяти в килобайтах.
  • CPU(s) - время использованное процессом на всех процессорах в секундах.
  • ID - идентификатор процесса, мы по нему можем фильтровать.
  • SI - Session ID. Идентификатор сеанса где 0 - запущен для всех сессий, 1 - запущен для первого залогиненного пользователя, 2 - для следующего.

Попробуем преобразовать значение из килобайтов в мегабайты:

Get-Process из килобайтов в мегабайты

Где:
-Select-Object обозначаем столбцы, которые хотим вывести.

Как вывести детальную информацию через Powershell Get-Process

Что бы вывести всю возможную информацию два варианта. Это либо вывести объект в виде листа:

Либо можно объявить в переменную, получить все имена свойств и вызывать их по отдельности:

Свойства Powershell Get-Process

Под такой командой powershell я могу узнать имя, которое пишется в окошке:

Get-Process Powershell Title

Свойств, которые хранит объект процесса (то что мы видим при $result | Get-Member) очень много и это главное, к чему нужно обращаться когда мы хотим узнать подробнее об объекте.

Так мы выведем все запущенные процессы, у которых есть GUI:

Все процессы с GUI через Powershell Get-Process

Как отфильтровать процессы по утилизации в Powershell

Так мы увидим процессы, которые используют больше 67 Мб в памяти с дополнительной информацией о приоритете:

Powershell Get-Process Priority и фильтрация

Таким командлетом мы получи информацию по одному процессу, у которого самое высокое значение CPU. Из свойств этого объекта выбран ID, Имя, CPU и время запуска.

Запуск и остановка процессов через Powershell

Мы можем остановить любой процесс. Например таким образом мы остановим все процессы, которые не отвечают (зависли):

Читайте также: