Администратор файлового сервера 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