Openfiles - какие файлы открыты в Windows

Метки:  , , ,

Время от времени некоторые файлы имеют свойство блокироваться различными приложениями, работающими в системе. Многие из нас сталкивались с подобной ситуацией, и нам не терпелось взглянуть получить ответ, взглянуть на то, какие же именно процессы блокируют так нас интересующие ресурсы. Да и попросту посмотреть на то, какие же файлы открыты в данный момент в системе. Работать с дескрипторами файлов в системе имеют возможность практически все без исключения процессы, являющиеся как частью ядра системы, так и частью пользовательского режима. Согласитесь, что сама по себе информация об открытых в системе файла была бы весьма неполной без возможности узнать имя виновного процесса, использующего интересующий нас файл. Начиная с Windows XP Microsoft предоставила в распоряжение пользователей довольно удобное средство по работе с информацией об открытых в системе файлах - это системная утилита openfiles. Утилита openfiles является консольной, то есть позволяет получить на консоль информацию об открытых в данный момент файлах. Вероятно, многим будет удобнее использовать различные утилиты сторонних разработчиков с графическим интерфейсом, как более наглядное и удобное средство анализа, однако преимущество openfiles заключается в возможности использования её вывода в скриптах автоматизации различного назначения. Исполняемый файл утилиты располагается в системной директории %SystemRoot%\System32. Помимо списка файлов, открытых локальными процессами, утилита позволяет вывести список файлов, открытых с использованием удаленного доступа. Для работы с утилитой пользователю требуются права локального администратора, то есть вхождение в группу Администраторы на станции.

При попытке запуска от пользователя с ограниченными правами, мы получаем сообщение вида:

Утилита openfiles имеет три основных команды: local, disconnect и query, которые мы с Вами сейчас и рассмотрим подробнее.

Параметр /local

Включает/выключает глобальный системный флаг под названием "Построение списка объектов" (Maintain Objects List).

Использование всех перечисленных ниже команд утилиты openfiles возможно только после того, как вы включите системный глобальный флаг "Построение списка объектов". После изменения состояния флага потребуется перезагрузка!

Если команда используется без указания параметров, то есть в виде openfiles /local, то в этом случае отображается текущий статус глобального системного флага "Построение списка объектов". Помните, что включение данного системного флага может отрицательно сказаться на быстродействии системы в целом, то есть, проще говоря - сделать её медленнее. Поэтому, рекомендуется включать флаг только на время диагностики.
Системные глобальные флаги Windows хранятся в системе в глобальной переменной NtGlobalFlags, и отвечают за включение различных отладочных, следящих и проверочных механизмов в операционной системе. Переменная NtGlobalFlags инициализируется на этапе загрузки системы на основе значения ключа GlobalFlag, расположенного в ветке реестра HKLM\SYSTEM\CurrentControlSet\Control\Session Manager. В комплекте Debugging Tools for Windows имеется средство под названием gflags.exe, которое представляет из себя конфигуратор глобальных флагов Windows с графическим интерфейсом, однако, что касается флага "Построение списка объектов", то есть Вы там не найдете, поскольку это флаг режима загрузки и значение его не может быть изменено утилитой.

Синтаксис:

openfiles /local [on | off]

Параметры:

Параметр Описание
[on | off] Включает или выключается системный глобальный флаг "Maintain Objects List", который отслеживает локальные файловые дескрипторы.
/? Выводит подсказку по синтаксису опций, используемых в команде /local.

Примеры:

Для получения текущего состояния системного флага:

openfiles /local

Например в ситуации, когда флаг включен, вы увидите следующий вывод:

Для включения глобального системного флага используйте следующую команду:

openfiles /local on

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

Для отключения глобального системного флага:

openfiles /local off

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

Параметр /disconnect

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

Синтаксис:

openfiles /disconnect [/s [/u [\] [/p []]]] {[/id ] | [/a ] | [/o {read | write | read/write}]} [/op ]

Параметры:

Параметр Описание

/s <имя_станции>

Задает станцию для удаленного подключения (имя или IP-адрес). Если эта опция не задана явно, команда выполняется на локальном компьютере. Задание этой опции позволяет подключаться к удаленным станциям.

/u [<Домен>\]<Имя_пользователя>

Выполняет команду openfiles с правами заданного аккаунта пользователя. Если опция /u не используется, то команда выполняется с правами текущего пользователя. Позволяет использовать права доступа конкретного пользователя.

/p [<пароль>]

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

/id <OpenFileID>

Позволяет отключить (закрыть) открытые файлы по заданному дескриптору файла (file ID). У каждого файла имеется дескриптор, относящийся к файловой системе. Иногда при известном дескрипторе, но неизвестном имени команда может быть удобна! С параметром могут быть использованы маски (*).

/a <AccessedBy> Отключает все открытые файлы, открытые открыл пользователь, специфицированный в параметре AccessedBy. Маски файлов (*) могут быть использованы.
/o {read | write | read/write} Отключает все открытые файлы, которые открыты с использованием указанного режима доступа. Доступные параметры: Чтение (Read) , Запись (Write), Чтение/Запись (Read/Write). Маски файлов (*) могут использоваться.
/op <OpenFile> Отключает все открытые файловые дескрипторы, которые подходят под указанный шаблон. Маски (*) могут быть использованы.
/? Выводит подсказку по синтаксису опций, используемых в команде /disconnect.

Примеры:
Для того, чтобы отключить директорию с именем "C:\TestShare\" и все вложенные файлы и папки:
openfiles /disconnect /a * /op "c:\testshare\"

Для того, чтобы закрыть все открытые файловые дескрипторы на удаленной станции "dc01", которые открыты пользователем домена "LUK\vasilyevgk", вне зависимости от номеров дескрипторов (то есть все файлы):

openfiles /disconnect /s dc01 /u LUK\vasilyevgk /id *

Параметр /query

Запрашивает и выводит на консоль список всех открытых файлов. Именно эта команда утилиты openfiles позволяет посмотреть, какие файлы открыты в Windows.

Синтаксис:
openfiles /query [/s [/u [\] [/p []]]] [/fo {TABLE | LIST | CSV}] [/nh] [/v]

Параметры:

Параметр Описание
/s <System> Задает станцию для удаленного подключения (имя или IP-адрес). Если эта опция не задана явно, команда выполняется на локальном компьютере. Задание этой опции позволяет подключаться к удаленным станциям.

/u [<Домен>\]<Имя_пользователя>

Выполняет команду openfiles с правами заданного аккаунта пользователя. Если опция /u не используется, то команда выполняется с правами текущего пользователя. Позволяет использовать права доступа конкретного пользователя.
/p [<Password>] Конкретизирует пароль аккаунта пользователя, который может быть задан в опции /u. Если опция /p не используется, в процессе выполнения команды будет выдан запрос на ввод пароля в консоли.
[/fo {TABLE | LIST | CSV}] Форматирует вывод в специальном формате. Доступные параметры для опции Format:
TABLE: Форматирует вывод в табличном виде. Более компактен и удобен для изучения.
LIST: Форматирует вывод в виде списка.
CSV: Форматирует вывод в виде данных, разделенных запятыми.
/nh Заголовки столбцов (шапка со значениями полей) не отображаются. Используется только когда параметр /fo задан в значение TABLE или CSV.
/v Позволяет выводить детальную (расширенную, подробную) информацию.
/? Выводит подсказку по синтаксису опций, используемых в команде /query.

Примеры:

Для получения информации обо всех открытых локальных и сетевых файлах в системе с выводом подробной информации можно использовать команду:

openfiles /query /fo table /v

после которой мы получаем в консоли детализированный список файлов, фрагмент которого выглядит примерно вот так:

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

openfiles /query /fo table /v > c:\temp\openfiles.txt

И в этом случае мы получив весь вывод в файл openfiles.txt, который можно будет затем открыть с помощью блокнота и изучить.

Для получения информации обо всех открытых файлах на удаленной системе с именем хоста "dc01" с использованием учетных данных пользователя "LUK\vasilyevgk" можно использовать команду:

openfiles /query /s dc01 /u LUK\vasilyevgk /p p@ssWord

Для того, чтобы не выводить пароль в явном виде в консоли или скрипте, можно оставить лишь опцию "/p" и в этом случае команда выведет приглашение на ввод пароля в ручном режиме.

На этом мы заканчиваем описание системной утилиты openfiles, которая позволяет понять, какие файлы открыты в Windows, а так же произвести манипуляции ними.

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

  1. Николай

    Спасибо. Очень полезная статья.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *