Время от времени некоторые файлы имеют свойство блокироваться различными приложениями, работающими в системе. Многие из нас сталкивались с подобной ситуацией, и нам не терпелось взглянуть получить ответ, взглянуть на то, какие же именно процессы блокируют так нас интересующие ресурсы. Да и попросту посмотреть на то, какие же файлы открыты в данный момент в системе. Работать с дескрипторами файлов в системе имеют возможность практически все без исключения процессы, являющиеся как частью ядра системы, так и частью пользовательского режима. Согласитесь, что сама по себе информация об открытых в системе файла была бы весьма неполной без возможности узнать имя виновного процесса, использующего интересующий нас файл. Начиная с Windows XP Microsoft предоставила в распоряжение пользователей довольно удобное средство по работе с информацией об открытых в системе файлах - это системная утилита openfiles. Утилита openfiles является консольной, то есть позволяет получить на консоль информацию об открытых в данный момент файлах. Вероятно, многим будет удобнее использовать различные утилиты сторонних разработчиков с графическим интерфейсом, как более наглядное и удобное средство анализа, однако преимущество openfiles
заключается в возможности использования её вывода в скриптах автоматизации различного назначения. Исполняемый файл утилиты располагается в системной директории %SystemRoot%\System32. Помимо списка файлов, открытых локальными процессами, утилита позволяет вывести список файлов, открытых с использованием удаленного доступа. Для работы с утилитой пользователю требуются права локального администратора, то есть вхождение в группу Администраторы на станции.
При попытке запуска от пользователя с ограниченными правами, мы получаем сообщение вида:
1 2 3 4 5 |
Microsoft Windows [Version 6.1.7601] (c) Корпорация Майкрософт (Microsoft Corp.), 2009. Все права защищены. C:\Users\admin>openfiles ОШИБКА. Вошедший пользователь не имеет прав администратора. |
Утилита openfiles имеет три основных команды: local, disconnect и query, которые мы с Вами сейчас и рассмотрим подробнее.
Параметр /local
Включает/выключает глобальный системный флаг под названием "Построение списка объектов" (Maintain Objects List).
Если команда используется без указания параметров, то есть в виде 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 Как уже говорилось ранее, при изменении значения флага потребуется перезагрузка. Позволяет пользователю с административными правами отключать файлы и папки, которые открыты удаленно через общие ресурсы. Синтаксис: openfiles /disconnect [/s Параметры: /s <имя_станции> /u [<Домен>\]<Имя_пользователя> /p [<пароль>] /id <OpenFileID> Позволяет отключить (закрыть) открытые файлы по заданному дескриптору файла (file ID). У каждого файла имеется дескриптор, относящийся к файловой системе. Иногда при известном дескрипторе, но неизвестном имени команда может быть удобна! С параметром могут быть использованы маски (*). Примеры: Для того, чтобы закрыть все открытые файловые дескрипторы на удаленной станции "dc01", которые открыты пользователем домена "LUK\vasilyevgk", вне зависимости от номеров дескрипторов (то есть все файлы): openfiles /disconnect /s dc01 /u LUK\vasilyevgk /id * Запрашивает и выводит на консоль список всех открытых файлов. Именно эта команда утилиты openfiles позволяет посмотреть, какие файлы открыты в Windows. Синтаксис: Параметры: /u [<Домен>\]<Имя_пользователя> Примеры: Для получения информации обо всех открытых локальных и сетевых файлах в системе с выводом подробной информации можно использовать команду: 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, а так же произвести манипуляции ними.
Параметр /disconnect
Параметр
Описание
Задает станцию для удаленного подключения (имя или IP-адрес). Если эта опция не задана явно, команда выполняется на локальном компьютере. Задание этой опции позволяет подключаться к удаленным станциям.
Выполняет команду openfiles с правами заданного аккаунта пользователя. Если опция /u не используется, то команда выполняется с правами текущего пользователя. Позволяет использовать права доступа конкретного пользователя.
Конкретизирует пароль аккаунта пользователя, который может быть задан в опции /u. Если опция /p не используется, в процессе выполнения команды будет выдан запрос на ввод пароля в консоли.
/a <AccessedBy>
Отключает все открытые файлы, открытые открыл пользователь, специфицированный в параметре AccessedBy. Маски файлов (*) могут быть использованы.
/o {read | write | read/write}
Отключает все открытые файлы, которые открыты с использованием указанного режима доступа. Доступные параметры: Чтение (Read) , Запись (Write), Чтение/Запись (Read/Write). Маски файлов (*) могут использоваться.
/op <OpenFile>
Отключает все открытые файловые дескрипторы, которые подходят под указанный шаблон. Маски (*) могут быть использованы.
/?
Выводит подсказку по синтаксису опций, используемых в команде /disconnect.
Для того, чтобы отключить директорию с именем "C:\TestShare\" и все вложенные файлы и папки:
openfiles /disconnect /a * /op "c:\testshare\"Параметр /query
openfiles /query [/s
Параметр
Описание
/s <System>
Задает станцию для удаленного подключения (имя или IP-адрес). Если эта опция не задана явно, команда выполняется на локальном компьютере. Задание этой опции позволяет подключаться к удаленным станциям.
Выполняет команду openfiles с правами заданного аккаунта пользователя. Если опция /u не используется, то команда выполняется с правами текущего пользователя. Позволяет использовать права доступа конкретного пользователя.
/p [<Password>]
Конкретизирует пароль аккаунта пользователя, который может быть задан в опции /u. Если опция /p не используется, в процессе выполнения команды будет выдан запрос на ввод пароля в консоли.
[/fo {TABLE | LIST | CSV}]
Форматирует вывод в специальном формате. Доступные параметры для опции Format:
TABLE: Форматирует вывод в табличном виде. Более компактен и удобен для изучения.
LIST: Форматирует вывод в виде списка.
CSV: Форматирует вывод в виде данных, разделенных запятыми.
/nh
Заголовки столбцов (шапка со значениями полей) не отображаются. Используется только когда параметр /fo задан в значение TABLE или CSV.
/v
Позволяет выводить детальную (расширенную, подробную) информацию.
/?
Выводит подсказку по синтаксису опций, используемых в команде /query.
Спасибо. Очень полезная статья.