Для просмотра в Powershell открытых файлов через SMB (открытых по сети) мы можем использовать командлет Get-SmbOpenFile. Командлет доступен с версии Windows Server 2012. Эта команда выведет папку, сессии и идентификаторы подключения:
Get-SmbOpenFile
Если мы захотим посмотреть детальную информацию по подключению нужно сделать следующее:
Get-SmbOpenFile -FileId 257698038505 | fl *
Или аналогично для сессий:
Get-SmbOpenFile -SessionId 257698037765 | fl *
Как фильтровать через Powershell файлы открытые по сети
Мы можем получить данные только по определенному свойству. Т.е. это могут быть файлы открытые определенным пользователем, компьютером, с каким-то расширением и т.д. Для того что бы увидеть все свойства объекта нужно сделать следующее:
Get-SmbOpenFile | Get-Member
Все что выделено - это свойство, которое мы можем вывести или отфильтровать по нему. Например я хочу вывести все компьютеры с которых выполнено подключение:
Get-SmbOpenFile | fl -Property ClientComputerName
Меня могут не интересовать все компьютеры, а только файлы открытые с определенного адреса:
Get-SmbOpenFile -ClientComputerName "*.3.1"
Таким образом я вывел все сессии, где свойство ClientComputerName заканчивается на 3.1.
Аналогично мы можем найти всех пользователей:
Get-SmbOpenFile | fl -Property ClientUserName
Если нам нужно найти, например, конкретный файл или расширение, то мы можем воспользоваться свойством Path или ShareRelativePath:
Get-SmbOpenFile | Where-Object -Property Path -Like "*txt"
Таким образом я нашел все сессии, где открытый файл заканчивается на txt.
Как закрывать сессии открытых файлов в Powershell через Close-SmbOpenFile
Для закрытия сессий есть другой командлет. Мы можем закрыть существующую сессию так:
Close-SmbOpenFile -SessionId 257698037797
Среди других ключей, которые мы можем указывать как идентификатор для закрытия могут быть:
- FileId
- SessionId
- ClientComputerName
- ClientUserName
- ScopeName
Частым сценарием может быть закрытие сессии где открыт определенный файл. Я бы это сделал так:
$opened_file = "*.txt*"
Get-SmbOpenFile | Where-Object ShareRelativePath -Like $opened_file | Close-SmbOpenFile
Т.е. в случае выше я закрыл все сессии, где открыт файл содержащий .txt
Выполнение Get-SmbOpenFile на другом сервере
Этот командлет поддерживает удаленное выполнение через сессию CIM. Для того что бы это сделать нужно написать следующее:
$cimsess = New-CimSession -ComputerName 192.168.3.100 -Credential (Get-Credential)
Get-SmbOpenFile -CimSession $cimsess
Ключ -Credential необходим, если мы используем не привилегированную учетную запись и хотим исполнить команду под другой учеткой.
Мы можем использовать и командлеты PSRemoting - это команды двух типов:
- New-PSSession и Enter-PSSession - для подключения к удаленному компьютеру и работы на нем
- Invoke-Command - выполнение команды на удаленном компьютере
Если вы работаете в домене и являетесь администратором сервера, к которому пытаетесь подключиться, то у вас должны сработать команды:
New-PSSession -ComputerName AD -Credential (Get-Credential) | Enter-PSSession
Get-SmbOpenFile
#Или
Invoke-Command -ComputerName AD1 -Credential (Get-Credential) -ScriptBlock {Get-SmbOpenFile}
Если у вас будут какие-то сложности, то стоит прочитать эту статью.
Get-SmbOpenFile для Windows Server 2008
На Windows Server 2008 этого командлета нет, но у нас есть другие способы для просмотра сессий и их закрытия. Так мы увидим все открытые файлы и папки:
Openfiles /Query /fo csv | more
Есть аналогичные команды для просмотра файлов и установленных сессий:
net file
net session
Можно посмотреть сессии на другом сервере. В моем случае я смотрю на сервере AD1:
Openfiles /Query /s AD1 /fo csv
Для закрытия файлов мы можем использовать:
net file /close 13
Либо через утилиту Openfiles:
Openfiles /Disconnect /s AD1 /ID 24
Если нам нужно отфильтровать результат по расширению файла:
net file | ? {$_ -like "*Новый документ*"}
...
Подписывайтесь на наш Telegram канал
Теги: #powershell