Администратор файлового сервера Windows может вывести список открытых файлов в общей сетевой папке и принудительно закрыть заблокированные файлы, открытые пользователями в монопольном режиме. Если пользователь открыт файл в общей сетевой SMB папке на сервере на чтение и запись и забыл его закрыть (ушел домой, в отпуск), другие пользователи не смогут внести изменения в файл.
В этой статье мы рассмотрим, как получить список открытых файлов на файловом сервере Windows и пользователей, которые их используют, а также способы сброса файловых сессий для разблокировки открытых файлов.
Вывод списка открытых файлов в сетевой папке Windows
Список открытых по сети файлов в Windows можно получить с помощью графической консоли Computer Management (Управление компьютером).
- Откройте консоль
compmgmt.msc
и перейдите в раздел System Tools -> Shared Folders -> Open files (Служебные программы -> Общие папки -> Открыты файлы); - В правой части окна отображается список открытых файлов. Здесь указаны локальный путь к файлу, имя учетной записи пользователя, количество блокировок и режим, в котором открыт файл (Read или Write+Read).
Также вы можете вывести список открытых на сервере файлов из командной строки:
Openfiles /Query /fo csv
Команда возвращает номер сессии, имя пользователя, количество блокировок и полный путь к файлу.
Cо списком открытых файлов на сервере удобнее работать с помощью PowerShell командлета Get-SmbOpenFile:
Get-SmbOpenFile|select ClientUserName,ClientComputerName,Path,SessionID
В выводе команда содержится имя пользователя, имя (IP адрес) удаленного компьютера, с которого открыт файл), имя файла и ID файловой сессии.
Кто открыл файл в общей сетевой папке на сервере Windows?
Чтобы удаленно определить пользователя, который открыл (заблокировал) файл cons.adm в сетевой папке на сервере mskfs01, выполните команду:
Openfiles /Query /s mskfs01 /fo csv | find /i "cons.adm"
Можно указать только часть имени файла. Например, чтобы узнать, кто открыл xlsx файл, в имени которого есть строка farm, воспользуйтесь таким конвейером:
Openfiles /Query /s mskfs01 /fo csv | find /i "farm"| find /i "xlsx"
С помощью PowerShell также можно получить информацию о пользователе, который открыл файл. Например:
Вывести все открытые по сети exe файлы:
Get-SmbOpenFile | Where-Object {$_.Path -Like "*.exe*"}
Найти открытые файлы по части имени:
Get-SmbOpenFile | Where-Object {$_.Path -Like "*защита*"}
Вывести все файлы, открытые определенным пользователем:
Get-SMBOpenFile –ClientUserName "corp\aaivanov" |select ClientComputerName,Path
Найти файлы, которые открыли с указанного компьютера:
Get-SMBOpenFile –ClientComputerName 192.168.12.170| select ClientUserName,Path
Принудительно закрыть открытый файл на сервере Windows
Можно закрыть открытый файл через консоль Computer Management. Найдите файл в списке секции Open Files, выберите в контекстном меню пункт “Close Open File”.
Если на сервере по сети открыты сотни файлов, то найти нужный файл в графической консоли довольно сложно. Лучше использовать инструменты командной строки.
Закрыть файл можно, указав ID его SMB сессии. Получить ID сессии файла:
Openfiles /Query /fo csv | find /i "report2023.xlsx"
Теперь можно принудительно отключить пользователя по полученному идентификатору SMB сессии:
Openfiles /Disconnect /ID 3489847304
SUCCESS: The connection to the open file "D:\path\REPORT2023.XLSX" has been terminated.
Вы разблокировали открытый файл и теперь его могут открыть другие пользователи.
Можно принудительно сбросить все сессии и освободить все файлы, открытые определённым пользователем:
openfiles /disconnect /s mskfs01 /u corp\aivanova /id *
Можно закрыть открытый файл по ID сессии с помощью PowerShell командлета Close-SmbOpenFile.
Close-SmbOpenFile - SessionId 3489847304
Найти и закрыть открытый файл одной командой:
Get-SmbOpenFile | where {$_.Path –like "*report2023.xlsx"} | Close-SmbOpenFile
Для подтверждения сброса сессии и освобождения отрытого файла нажмите
Y
->
Enter
.
Чтобы закрыть файл без предупреждения, добавьте параметр
-Force
в последнюю команду.
С помощью Out-GridView можно сделать простую графическую форму для поиска и закрытия файлов. Следующий скрипт выведет список открытых файлов. Администратору нужно с помощью фильтров в таблице Out-GridView найти и выделить нужные файлы, а затем нажать ОК. В результате выбранные файлы будут принудительно закрыты.
Get-SmbOpenFile|select ClientUserName,ClientComputerName,Path,SessionID| Out-GridView -PassThru –title “Select Open Files”|Close-SmbOpenFile -Confirm:$false -Verbose
Close-SMBOpenFile
нужно использовать с осторожностью.Как удаленно закрыть открытые по сети файлы с помощью PowerShell?
Командлеты Get-SMBOpenFile и Close-SmbOpenFile можно использовать чтобы удаленно найти и закрыть открытые файлы. Сначала нужно подключиться к удаленному SMB серверу Windows через CIM сессию:
$sessn = New-CIMSession –Computername mskfs01
Следующая команда найдет сессию для открытого файла
*pubs.docx
и завершит ее.
Get-SMBOpenFile -CIMSession $sessn | where {$_.Path –like "*pubs.docx"} | Close-SMBOpenFile -CIMSession $sessn
Подтвердите закрытие файла, нажав
Y
. В результате вы разблокировали открытый файл. Теперь его могут открыть другие пользователи.
С помощью PowerShell вы можете закрыть и осведомить на файловом сервере все файлы, открытые определенным пользователем (пользователь ушел домой и не освободил файлы). Например, чтобы сбросить все файловые сессии для пользователя ipivanov, выполните:
Get-SMBOpenFile -CIMSession $sessn | where {$_.ClientUserName –like "*ipivanov*"}|Close-SMBOpenFile -CIMSession $sessn
После того как через конвейер передали файлы на Close-SmbOpenFile необязательно снова указывать параметр -CimSession. Это лишнее. И в самой последней команде у вас два конвейера. Такая команда вообще не отработает.
Спасибо, поправил ошибку! Лишний символ.
Спасибо, полезный материал!
А как сделать наоборот? Отобразить список папок с открытым доступом для конкретного пользователя?
У Sysinternals есть утилитка AccessChk. Думаю с помощью нее проще всего получить список результирующих прав на каталоги для конкретного пользователя.
На вход подаем имя пользователя и имя папки. Запускаем на сервере. В результате получаем список обьектов и результирующие права доступа (R/Rw …).
accesschk corp\vasyauser d:\share
Попробуйте.
Добрый день. В чём может быт проблема в случае, когда файл принудительно закрытый через консоль не закрывается на удаленном сервере?
Кто-то использует этот файл. Возможно локально. Либо сразу после закрытия открывает… Идентфикатор сесии тот-же?
Файл точно не открывается, поскольку после закрытия через консоль не закрывается на удаленном сервере, проверил, подключившись под другим пользователем и открыв файл на сервере.
Я что-то запутался… Опишите проблему точнее, какой-то сумбур получился 🙂
Да, запутанно написал, извините. Файл находится на сервере A (файловый сервер), я захожу на сервер Б с правами пользователя и открывают файл лежащий на сервере А. Затем захожу на сервер А с правами администратора и закрываю файл открытый с правами обычного пользователя с сервера Б, используя консоль. Но файл не закрывается.
Михаил
А что за файл? Какая-то специфическая программа? Или обычный офисный документ?
Документ ms word
Проверьте идентификатор сессии открытого файла. Он меняется, когда вы его отключали через консоль?
Да, идентификатор меняется. Ещё есть нюанс, должен ли файл закрываться у пользователя как приложение? Поскольку я не вижу новой сессии, до тех пора пользователь не произведет манипуляций с файлом. Например, сохранит документ. Т.е. я закрываю через консоль файл, он не закрывается у пользователя, но исчезает сессия в консоли. Пользователь пересохраняет открытый файл тем самым открывая новую сессию.
Тут все верно. Путь к файлу остался в приложении. Когда приложение сохраняет файл (через то же автосохранение), создается новая SMB сессия к файлу.
В вашем случае надо после отключения файла нужно пристрелить приложение на удаленном компьютере.
Понял, спасибо.
Почему в списке файлов, путь на один и тот же файл, пишется в разном регистре ?
Например у одного пользователя на один и тот же файл путь указан в верхнем регистре у другого в том регистре в котором создано все на самом деле.
И даже регистр может меняться у одного и того же пользователя к одному и тому же файлу, почему так происходит ?
Как сделать так, чтобы этими командлетами (get-smbopenfile в частности) могли пользоваться пользователи определенной группы безопасности ?
Скорее всего никак. У выполняющего команду должны быть права администратора роли File Server. Либо как вариант сделать задание в планировщике, которое запускается автоматом или по требованию и сохраняет в текстовый список открытых файлов. Нужным пользователям можно дать права на текстовый файл или запуск задания.
Здравствуйте. Есть шара на сервере и пользователи часто обращаются узнать кто открыл определенный файл на шаре. Как и чем сделать так чтобы юзер сам мог посмотреть кем открыт файл?
Без предоставления прав админа на сервере не знаю как это сделать.
Как вариант — поднять на этом же сервере IIS из одной страницы, которую формирует планировщик запуская раз в 5 минут команду выгрузки списка текущих открытых файлов в html.
Хотя бы так:
del /q c:\inetpub\site1\index.html
Openfiles /Query >> c:\inetpub\site1\index.html
Пользователи, если хотят понят кем открыт их любымый отчет, просто открывают этот сайт, ищут в списке свой файл и определяют злодей, который держит файл открытым на RW.
оригинально, спасибо )
Здравствуйте, подскажите пожалуйста. Файловые сервер Windows Serve 2012r2
в расшаренном каталоге лежат папки с приложениями .exe ; .dll.
Пользователь удаленно запускает .exe на своем компьютере (открыв его по сети с сервера).
Задача — закрыть все сессии к файлам чтобы обновить приложение. Локально на сервере через gui это работает, но через консоль (powerShell) Get-SMBOpenFile | where {$_.Path –like «d:\apps\newApp»} | Close-SMBOpenFile -Force выполняется, но сессия сохраняется, хотя повторно get-smbOpenFile возвращает — пустоту.
Вообщем удается сбросить только через gui на сервере. Это какая-то особенность? есть ли варианты? Спасибо
Вот прям процессы убиваются на компьютерах, где эти исполняемый файлы запушены с сетевой папке? Мне почему-то кажется, что так не получится.
По логике, если exe запустилось, она уже будет работать в памяти на компьютере, где запушено. Если ему понадобится обратится к exe файлу на шаре, он к нему сходит.
Может проще шару временно отключить на время обновления?
Здравствуйте, проясните такой вопрос: на файловом сервере 2012R2, пользователи работаю с файлами dwg(через AutoCAD). User1открывает файл с сервера и начинает в нем работать, если в это время User2 откроет этот файл то получит уведомление что файл можно открыть только для чтения. Но бывают случаи когда User2 открывает файл в котором точно работает User1 но не получает уведомления и получает права на редактирование файла. Чаще такое наблюдается когда User1 отходит на некоторое время от компьютера, обострилась ситуация когда натравили GPO «Включение заставки через 600с».
Доброго дня коллеги, подскажите как реализовать задачу?Как правильно настроить доступ доменному пользователю что бы он мог подключиться через PS и закрыть файлы?
Я бы посмотрел в сторону powershell just enough administration (правильный путь) или некого задания в планировщике, которое берет инфу о файлах, которые нужно закрыть из текстового файла (задания запускается из-под админа)
Возможно ли применить данную команду к определённой шаре сервера. Допустим есть Шары D:\Share1 d:\share2. так вот вывести список открытых только по одной, определённой ?
В общем, дочитал комментарии и увидел ответ.
Get-SmbOpenFile | where {$_.Path –like «D:\SomeShares\SomethingElse\*» }
Выручайте знатоки, целый день бьюсь))), можно ли закрыть все фалы и папки находящиеся в глубь директории?
Например есть «K:\Корневая» , все что в глубь, папки и фалы в них, нужно закрыть , например
Закрыть сессию для K:\Корневая\Лист Microsoft Excel.xlsx
Закрыть сессию для K:\Корневая\тест1\Лист Microsoft Excel.xlsx
Закрыть сессию для K:\Корневая\тест2\Лист Microsoft Excel.xlsx
Закрыть сессию для K:\Корневая\тест2\Вася\Вася Excel.xlsx
Закрыть сессию для K:\Корневая\тест2\Люда\Люда Excel.xlsx
Get-SmbOpenFile | Where-Object {$_.Path -Like «K:\Корневая\*»} | Close-SmbOpenFile -Force
не работает,ошибок нет при исполнении команды, но и результата тоже нет.
Спасибо за статью. А кто-нибудь сталкивался с таким?
Пользователь работает с документами (pdf, word, excel) на сетевом диске (файловый сервер), закрывает их, а другой пытается удалить/перенести файл или папку (в которой были эти документы) и не может, т.к «этот файл открыт в другой программе» и т.д. При этом, на файловом сервере, я по открытым файлам общих папок вижу, что первый пользователь продолжает держать папку, в которой он работал с документами. Иногда помогает перезагрузка ПК (первого пользователя), а иногда папка сама себя отпускает. Я пытался разобраться с самим ПК пользователя, в частности с офисным софтом и самой Windows, но у меня много пользователей и у всех так или иначе возникает проблема с «заблокированными» папками. Может ли так быть, что групповая политика, что подключает диски файлового сервера пользователю, каким-то образом не давать отпускать папки, с которым он работал? Или есть какая-то настройка сброса сессии к папкам? Даже не знаю…
Нужно искать процесс на компьютере пользователя, которые держит открытой сетевую папку. Может быть это антивирус или какой-то сканер, а может и офисное по работает некорректно.
У меня похожая ситуация, но более интересная. На сетевом хранилище (QNAP) пользователи работают по сети с файлами word, excel, pdf. Так вот, иногда такая ситуация: пользователь1 работает с файлом. Закрывает. Тотже файл потом открывает пользователь2. И вот винда ему ругается что файл занят пользователем1. Ладно, пользователь1 сам пытается еще раз его открыть. Система ругается что файл занят им же)). Для пущего эффекта, пользователь1 выключает свой пк. Пользователю2 всеровно система ругается что файл занят.
Не часто такое бывает, но очень бесит и не могу понять в чем дело. Помогает пересохранением файла под другим именем и удаление старого файла из под вебморды qnap-а из под администратора.
То же самое. Только я не сохраняю копию файла, а принудительно закрываю сессию с файлом «неработающего» пользователя, так и не нашел причину подобного
Я бы посмотрел на QNAP, может там есть что-то типа кэширования и файлы освобождаются не сразу.
Спасибо за статью. А как посмотреть, кто открыл файлы на терминальном сервере?
(файловый сервер, с переходом на удаленку становится мало актуальным.. даже странно, что кто-то сейчас открывает файлы не в терминальной сесии )
Остался вопрос. Как выдать отдельному человеку права, чтобы он мог подключиться через mmc консоль и закрыть чужую сессию. И чтобы больше ничего сделать не мог.
Подскажите, пожалуйста, куда можно покопать, что и чем помониторить при такой проблеме, которая возникла после перехода на Windows 2012R2:
1. С одного компьютера запускается приложение, которое открывает ряд файлов на шаре.
2. На другом компьютере при копировании файлов с этой шары, копирование резко замедляется на открытых файлах. Ждет на открытом файле может несколько минут, потом копирование идет дальше быстро, но когда попадает на следующий открытый файл, опять неимоверная задержка. Ошибки нет, просто копирование может затянуться на 30 минут, например. Пробовал на Windows 7, Windows 10 и даже Windows 2003. Везде этот эффект одинаковый.
Если на первом компьютере приложение не запущено, т.е. файлы не открыты, то копирование идет быстро, как обычно.
Проблема решилась (по крайней мере файлы копируются быстро в тех условиях, при которых раньше копировались долго) тем что обновили Windows 7 (клиента) с Wsus и установкой пакета «удобств». Windows 7 c первоначальной установки с какого-то дистрибутива не обновлялась.
Доброго! Помогите, пожалуйста.
С Win8.1 пытаюсь сделать запрос открытых файлов на Win2012
Openfiles /Query /s 192.168.0.20 /U "RSRV\user3" /P /fo csv | find /i "Eng.mdb"
Ввожу пароль.
Ошибка: Отказано в доступе.
user3 — админ на двух хостах, пароли одинаковые.
user3 на хосте 192.168.0.20 может открывать шары с Win8.1.
На хосте 192.168.0.20 журнал SMBserver пустой.
В журнале Безопасности, Аудит успеха: 4672 Специальный вход, 4624 Вход в систему, 4634 Выход из системы.
Уже даже не знаю, какой журнал посмотреть, чтобы определить причину отказа.
Как вариант попробовать: в запросе не указывать имя. Windows 2012 и так поймет, какое имя пользователя и сравнит со своим именем. А если указано имя (c компьютером rsrv), то оно, поди, ищет такого пользователя у себя, естественно его нет (так как компьютер другой).
Пользователь одинаковый на двух хостах, с одинаковыми паролями. Пробовал без указания пользователя, без указания сервера, с указанием имени или ипа сервера. Пробовал под другим админом, которого нет на сервере. Пробовал с другого Вин2012 сервера. Всегда один и тот же ответ: «Ошибка: Отказано в доступе.»
И как это проанализировать, через какой журнал, совершенно не понятно….
Подскажите пожалуйста в чём может быть проблема, когда хочу зайти в «сеансы» так оснастка fsmgmt.msc подвисает и потом когда получается зайти в сеансы там у некоторых пользователей открыто более 1000 файлов, что не соответствует действительности и могу предположить что из за этого происходят жуткие тормоза в шаре. Не пойму что с этим делать.
Что за файлы открыты пользователями? Попробуйте сделать выгрузку открытых файлов с помощью PowerShell.
что хранится на шаре, не профили случайно?
нет не профили, на шаре офисные файлы, картинки, и файлы программы для черчения. Я просто не пойму почему такие тормоза когда обращаюсь к сеансам. Кстати проблема возникла совсем недавно, буквально позавчера было всё гладко и работало отлично. Вчера поставился update KB5008223, но я думаю врятли из за него были бы такие тормоза.
И выгрузка открытых файлов с помощью PowerShell что она мне даст? Я и так в консоли вижу открытые файлы. У одного пользователя в сеансах было написано — открыто 960 файлов, как такое может быть?
На вирусы проверяли?
Ну вообще на файл сервере установлен официальный ESET FileServer
А на клиенте?
Ой блин сказала монашка, натягивая презерватив на морковку…
— официальный ESET FileServer — и он отчего-то кроме добавления тормозов и геморроя помогает?
Ну вот вы не слышите о чём речь, ESET FileServer работает на файл сервере на другом с Server 2008R2 и никаких проблем и тормозов к общедоступным папкам не возникает. Тут проблема в чём то другом. Причём началось совсем недавно. Кеширование диска включено в политике, по ресурсам ВМ не затыкается, загрузки нет такой, а вот медленно по сети работает.
Добрый день. Подскажите по настройке прав доступа? Например, создаю группу, пользователи которой могут читать и изменять/редактировать/сохранять текущие файлы(txt, word, excel…) но не удалять. Так вот, даю почти полный доступ и убираю галочки напротив «Удаление подпапок и файлов» и «Удаление», в таком случае пользователи уже не могут редактировать, например документ word, и тут же его сохранить. Что только не перепробовал, но желаемого результата добиться не смог…
Тут проблема в том, как приложения office обрабатывают файл. Они постоянно приработе создают и удаляют временные файлы в папке, поэтому у вас так не заработает.
Попробуйте что ваши NTFS разрешения работают с простыми txt файлами.
Как решить проблему — не знаю. Возможно можно как-то перенеастроить через GPO параметры приложений Office, чтобы они не писали ничего лишнего в сетевые папки. Но есть ли такая возможность — не знаю, не копался.
Добрый день. Проблема в следующем: есть терминальный сервер, на котором крутится 1с и на нем работает ряд пользователей. Периодически в 1с подвисают некоторые файлы баз, которые нужно вручную закрывать, но буквально недавно у одного сеанса пропала возможность просматривать открытые файлы. Остальные сеансы и их открытые файлы отображаются корректно. В сеансах так же он отображается, но система пишет, что открытых файлов 0. Все логи перекопал, но ошибку так и не нашел
здравствуйте. как закрыть открытые файлы по сети, только не каждый файл, а например все файлы в конкретной папке, очень нужно.
Get-SmbOpenFile|select ClientUserName,ClientComputerName,Path,SessionID | where {$_.path -like "*c:\info*"}
я очень глупый и у меня только выдет кто этой папкой пользуется. а можно всю команду чтобы кикнуть всех от использования эти файлов внутри папки?
Get-SmbOpenFile|select ClientUserName,ClientComputerName,Path,SessionID | where {$_.path -like "*c:\info*"}| Close-SmbOpenFile
Добрый день.
Есть ли какие-нибудь сторонние программы для просмотра какие файлы открыты на файловом сервере, через MMC не очень удобно.
с powershell проблем нет, но хочется красивый GUI )))
В статье есть пример с Out-GridView. Чем не графика?? 🙂 да еще с фильтрами
А как установить авторазрыв сессий? К примеру по заданному времени: использование больше часа, 2,3,,