Как смотреть в Powershell открытые файлы по протоколу SMB и их закрывать


21 июля 2019


Как смотреть в Powershell открытые файлы по сети

Для просмотра в Powershell открытых файлов через SMB (открытых по сети) мы можем использовать командлет Get-SmbOpenFile. Командлет доступен с версии Windows Server 2012. Эта команда выведет папку, сессии и идентификаторы подключения:

Get-SmbOpenFile

powershell открытые файлы Get-SMBOpenFile

Если мы захотим посмотреть детальную информацию по подключению нужно сделать следующее:

Get-SmbOpenFile -FileId 257698038505 | fl *

Get-SMBOpenFile powershell открытые файлы

Или аналогично для сессий:

Get-SmbOpenFile -SessionId 257698037765 | fl *

Как фильтровать через Powershell файлы открытые по сети

Мы можем получить данные только по определенному свойству. Т.е. это могут быть файлы открытые определенным пользователем, компьютером, с каким-то расширением и т.д. Для того что бы увидеть все свойства объекта нужно сделать следующее:

Get-SmbOpenFile | Get-Member

Get-SMBSession property

Все что выделено - это свойство, которое мы можем вывести или отфильтровать по нему. Например я хочу вывести все компьютеры с которых выполнено подключение:

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.

Get-SMBOpenFile

 

Как закрывать сессии открытых файлов в 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

Get-SMBOpenFile Windows Server 2008

Либо через утилиту Openfiles:

Openfiles /Disconnect /s AD1 /ID 24

Windows Server 2008 Close-SmbOpenFile

Если нам нужно отфильтровать результат по расширению файла:

net file | ? {$_ -like "*Новый документ*"}

Get-SMBOpenFile закрыть файл Windows Server 2008

...

Теги: #powershell


Популярные тэги
О блоге
Этот блог представляет собой конспекты выученного материала, преобретенного опыта и лучшие практики в системном администрировании и программировании.