function Get-OpenFilesOnServers {
<#
.SYNOPSIS
Получает информацию об открытых файлах на SMB-шарах удалённых серверов,
включая количество блокировок (Locks) и режим открытия (Open Mode),
используя только командлеты PowerShell.
.DESCRIPTION
Для каждого сервера из списка $Servers функция выполняет Get-SmbOpenFile
через Invoke-Command. Свойство Open Mode формируется на основе значения
Permissions, возвращаемого Get-SmbOpenFile.
.PARAMETER Servers
Массив имён или IP-адресов серверов.
.EXAMPLE
Get-OpenFilesOnServers -Servers $Servers
#>
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)]
[string[]]$Servers
)
$allOpenFiles = @()
foreach ($server in $Servers) {
Write-Verbose "Опрос сервера: $server"
try {
$result = Invoke-Command -ComputerName $server -ScriptBlock {
# Получаем все открытые файлы на SMB-шарах
Get-SmbOpenFile -ErrorAction Stop | ForEach-Object {
# Определяем Open Mode по значению Permissions
$perm = $_.Permissions
$openMode = switch ($perm) {
1179785 { 'Read' } # 0x00120089 – Read
1180063 { 'Read/Write' } # 0x0012008F – Read + Write
1048854 { 'Write' } # 0x00100106 – Write
128 { 'No Access' } # 0x00000080 – только атрибуты
default { "Unknown ($perm)" }
}
[PSCustomObject]@{
Server = $env:COMPUTERNAME
FileId = $_.FileId
SessionId = $_.SessionId
ClientComputerName = $_.ClientComputerName
ClientUserName = $_.ClientUserName
Path = $_.Path
ShareRelativePath = $_.ShareRelativePath
Locks = $_.Locks
OpenMode = $openMode
}
}
} -ErrorAction Stop
$allOpenFiles += $result
}
catch {
Write-Warning "Не удалось получить данные с сервера $server : $_"
}
}
if ($allOpenFiles.Count -gt 0) {
$allOpenFiles | Format-Table -AutoSize
}
else {
Write-Host "На указанных серверах открытых файлов не обнаружено."
}
}