Администратор файлового сервера Windows может вывести список открытых файлов в общей сетевой папке и принудительно закрыть заблокированные файлы, открытые пользователями в монопольном режиме. Если пользователь открыт файл в общей сетевой SMB папке на сервере на чтение и запись и забыл его закрыть (ушел домой, в отпуск), другие пользователи не смогут внести изменения в файл.
В этой статье мы рассмотрим, как получить список открытых файлов на файловом сервере Windows и пользователей, которые их используют, а также способы сброса файловых сессий для разблокировки открытых файлов.
Список открытых по сети файлов в Windows можно получить с помощью графической консоли Computer Management (Управление компьютером).
compmgmt.msc
и перейдите в раздел System Tools -> Shared Folders -> Open files (Служебные программы -> Общие папки -> Открыты файлы); Также вы можете вывести список открытых на сервере файлов из командной строки:
Openfiles /Query /fo csv
Команда возвращает номер сессии, имя пользователя, количество блокировок и полный путь к файлу.
Cо списком открытых файлов на сервере удобнее работать с помощью PowerShell командлета Get-SmbOpenFile :
Get-SmbOpenFile|select ClientUserName,ClientComputerName,Path,SessionID
В выводе команда содержится имя пользователя, имя (IP адрес) удаленного компьютера, с которого открыт файл), имя файла и ID файловой сессии.
Чтобы удаленно определить пользователя, который открыл (заблокировал) файл 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 "corpaaivanov" |select ClientComputerName,Path
Найти файлы, которые открыли с указанного компьютера:
Get-SMBOpenFile –ClientComputerName 192.168.12.170| select ClientUserName,Path
Можно закрыть открытый файл через консоль 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:pathREPORT2023.XLSX" has been terminated.
Вы разблокировали открытый файл и теперь его могут открыть другие пользователи.
Можно принудительно сбросить все сессии и освободить все файлы, открытые определённым пользователем:
openfiles /disconnect /s mskfs01 /u corpaivanova /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
нужно использовать с осторожностью. Командлеты 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
Клиент удаленного рабочего стола (rdp) предоставляет нам возможность войти на сервер терминалов через консоль. Что…
В VMware Workstation есть несколько способов настройки сети гостевой машины: 1) Bridged networking 2) Network…
Встроенный брандмауэр Windows может не только остановить нежелательный трафик на вашем пороге, но и может…
Вопреки распространенному мнению, отключить IPv6 в Windows Vista и Server 2008 это не просто снять…
Параметры экранной заставки для текущего пользователя можно править из системного реестра, для чего: Запустите редактор…
В этой статье расскажу про возможность просмотра журналов событий из командной строки. Эти возможности можно…