Как просмотреть и закрыть открытые файлы в общем ресурсе SMB Windows Server?
Администраторам файловых серверов Windows часто приходится принудительно закрывать общие файлы, открытые одновременно несколькими пользователями. Обычно это происходит, если настольное программное обеспечение не работает должным образом, пользователь неправильно выходит из системы или когда пользователь открыл файл и забыл его закрыть (ушел домой, в отпуск и т. д.). Во всех этих случаях файл в общей сетевой папке по-прежнему открыт (и заблокирован) и не может быть изменен другими пользователями. Другие пользователи могут увидеть такое сообщение при попытке открыть заблокированный файл (в зависимости от используемого приложения):
The document filename is locked for editing by another user. To open a read-only copy of his document, click…В этой статье мы покажем вам, как получить список открытых файлов на файловом сервере Windows, узнать, какой пользователь заблокировал файл в общей папке и как закрыть (сбросить) файловые сессии, чтобы разблокировать открытые файлы.
Просмотр открытых файлов в общей сетевой папке на Windows Server
Получить список файлов, открытых пользователями на файловом сервере Windows, можно с помощью встроенного Управления компьютером(
compmgmt.msc) графическая оснастка.
Откройте консоль управления компьютером на файловом сервере (или подключитесь к серверу удаленно с консоли управления, работающей на вашем компьютере) и перейдите в раздел Системные инструменты -> Общие папки -> Открыть файлы. Список открытых файлов на текущем SMB-сервере отображается в правой части окна. Список содержит локальный путь к файлу, имя учетной записи пользователя, открывающего файл, количество блокировок и режим открытия файла (Чтение или Запись+Чтение).
Получить тот же список открытых файлов можно с помощью встроенного
openfiles.exeконсольный инструмент. Например, используя следующую команду, вы можете получить идентификатор сеанса, имя пользователя и полный локальный путь к открытому файлу:
openfiles /Query /fo csv |moreКогда пользователь удаленно получает доступ к папке или файлу в общей сетевой папке на сервере, создается новый сеанс SMB. Вы можете управлять открытыми файлами, используя эти идентификаторы сеансов.
Вы можете отобразить список открытых файлов на удаленном сервере. Например, вам нужно вывести список всех открытых файлов в общих папках на хосте lon-fs01:
openfiles /Query /s lon-fs01 /fo csvЭтот
openfilesКоманда также позволяет просмотреть список локально открытых файлов. Чтобы использовать его, включите опцию «Сохранить список объектов» с помощью команды:
openfiles /local onи перезагрузите сервер. После этого
openfilesкоманда будет отображать файлы, открытые локальными процессами (этот режим рекомендуется использовать только в целях отладки, поскольку он может негативно повлиять на производительность сервера).
Как узнать, кто блокирует файл в общей папке?
Чтобы идентифицировать пользователя, открывшего (заблокировавшего) файл filename.docx в общей сетевой папке на удаленном сервере lon-fs01, выполните следующую команду:
openfiles /Query /s lon-fs01 /fo csv | find /i "filename.docx"Этот
/iКлюч используется для поиска файлов без учета регистра.
Вы можете указать только часть имени файла. Например, вам нужно выяснить, кто открыл файл XLSX, содержащий в имени «sale_report». Используйте следующую трубу:
openfiles /Query /s lon-fs01 /fo csv | find /i "sale_report"| find /i "xlsx"Конечно, вы можете найти этот файл в графическом интерфейсе управления компьютером, но это менее удобно (в этой консоли нет функции поиска).
Как принудительно закрыть открытый файл на общем ресурсе SMB?
Чтобы закрыть открытый файл, найдите его в списке файлов в разделе Открыть файл и выберите Закрыть открытый файл в контекстном меню.
Если на вашем файловом сервере есть сотни открытых файлов, найти конкретный файл в консоли будет непросто. Удобнее использовать инструмент командной строки Openfiles. Как мы уже сказали, он возвращает идентификатор сессии открытого файла. Используя этот идентификатор сеанса, вы можете принудительно закрыть файл, сбросив соединение SMB.
Сначала вам нужно найти идентификатор сеанса открытого файла:
openfiles /Query /s lon-fs01 /fo csv | find /i "farm"| find /i ".xlsx"Отключите пользователя от файла, используя полученный идентификатор сеанса SMB:
openfiles /Disconnect /s lon-fs01 /ID 617909089
Вы можете принудительно сбросить все сеансы и разблокировать все файлы, открытые конкретным пользователем:
openfiles /disconnect /s lon-fs01/u corp\mjenny /id *Примечание. Принудительное закрытие файла, открытого клиентом на SMB-сервере, может привести к потере несохраненных данных. Поэтому используйте
openfiles /disconnectкоманда или
Close-SMBOpenFileкомандлет (обсуждается ниже) очень осторожно.
Get-SMBOpenFile: поиск и закрытие обработчиков открытых файлов с помощью PowerShell
В версии PowerShell для Windows Server 2012/Windows 8 появились новые командлеты для управления общими ресурсами и файлами на SMB-сервере. Эти командлеты можно использовать для удаленного закрытия сетевых подключений к открытому файлу.
Получить список открытых файлов можно с помощью командлета Get-SMBOpenFile. Close-SmbOpenFile используется для закрытия/сброса подключения к удаленному файлу.
Чтобы отобразить список открытых файлов на SMB-сервере Windows, выполните команду:
Get-SMBOpenFileКоманда возвращает идентификатор файла, идентификатор сеанса и полное имя файла (путь).
Вы можете отобразить список открытых файлов с именами пользователей и компьютеров (IP-адресами):
Get-SmbOpenFile|select ClientUserName,ClientComputerName,Path,SessionIDВы можете перечислить все файлы, открытые конкретным пользователем:
Get-SMBOpenFile -ClientUserName "corp\mjenny"|select ClientComputerName,Pathили с конкретного компьютера/сервера:
Get-SMBOpenFile -ClientComputerName 192.168.1.190| select ClientUserName,PathВы можете отобразить список открытых файлов по шаблону. Например, чтобы вывести список всех файлов exe, открытых из общей папки:
Get-SmbOpenFile | Where-Object {$_.Path -Like "*.exe*"}или откройте файлы с определенным именем:
Get-SmbOpenFile | Where-Object {$_.Path -Like "*reports*"}Командлет Close-SmbOpenFile используется для закрытия обработчика открытого файла. Закрыть файл по ID можно:
Close-SmbOpenFile -FileId 4123426323239Но обычно удобнее закрыть файл по имени:
Get-SmbOpenFile | where {$_.Path -like "*annual2020.xlsx"} | Close-SmbOpenFile -ForceС
Out-GridViewcmdlet, вы можете создать простую форму графического интерфейса для поиска и закрытия открытых файлов. Следующий скрипт выведет список открытых файлов. Вам следует использовать встроенные фильтры в таблице Out-GridView, чтобы найти открытые файлы, для которых вы хотите сбросить сеансы SMB. Затем вам нужно выбрать необходимые файлы и нажать ОК. В результате выбранные файлы будут принудительно закрыты.
Get-SmbOpenFile|select ClientUserName,ClientComputerName,Path,SessionID| Out-GridView -PassThru -title “Select Open Files”|Close-SmbOpenFile -Confirm:$false -VerboseКак закрыть открытые файлы на удаленном компьютере с помощью PowerShell?
Этот
Get-SMBOpenFileи
Close-SmbOpenFileКомандлеты можно использовать для удаленного поиска и закрытия открытых (заблокированных) файлов. Сначала вам необходимо подключиться к удаленному SMB-серверу Windows через сеанс CIM:
$sessn = New-CIMSession -Computername lon-fs01Вы также можете подключиться к удаленному серверу для запуска команд PowerShell с помощью командлетов PSRemoting:
Enter-PSSessionили
Invoke-CommandСледующая команда найдет сеанс SMB для открытого файла pubs.docx и закроет сеанс файла.
Get-SMBOpenFile -CIMSession $sessn | where {$_.Path -like "*pubs.docx"} | Close-SMBOpenFile -CIMSession $sessnПодтвердите закрытие файла, нажав
Y. В результате вы разблокировали файл. Теперь его смогут открыть другие пользователи.
Чтобы убрать подтверждение принудительного закрытия файла на SMB-сервере, используйте команду
-Forceключ.
С помощью PowerShell вы можете закрыть сеансы SMB и разблокировать все файлы, которые открыл конкретный пользователь (пользователь ушел домой и не выпустил открытые файлы). Например, чтобы сбросить все файловые сессии пользователя mjenny, выполните следующую команду:
Get-SMBOpenFile -CIMSession $sessn | where {$_.ClientUserName -like "*mjenny*"}|Close-SMBOpenFile -CIMSession $sessn






