Загрузка данных
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
)
# Вспомогательная функция для интерпретации маски Permissions
function Convert-PermissionsToOpenMode {
param(
[Parameter(Mandatory = $true)]
[int]$Permissions
)
# Битовые маски прав доступа к данным файла
$READ_DATA = 0x00000001
$WRITE_DATA = 0x00000002
$APPEND_DATA = 0x00000004
$canRead = ($Permissions -band $READ_DATA) -eq $READ_DATA
$canWrite = (($Permissions -band $WRITE_DATA) -eq $WRITE_DATA) -or `
(($Permissions -band $APPEND_DATA) -eq $APPEND_DATA)
if ($canRead -and $canWrite) { return 'Read/Write' }
if ($canRead) { return 'Read' }
if ($canWrite) { return 'Write' }
return 'No Access'
}
$allOpenFiles = @()
foreach ($server in $Servers) {
Write-Verbose "Опрос сервера: $server"
try {
$result = Invoke-Command -ComputerName $server -ScriptBlock {
# Определяем функцию внутри удалённого сеанса
function Convert-PermissionsToOpenMode {
param([int]$Permissions)
$READ_DATA = 0x00000001
$WRITE_DATA = 0x00000002
$APPEND_DATA = 0x00000004
$canRead = ($Permissions -band $READ_DATA) -eq $READ_DATA
$canWrite = (($Permissions -band $WRITE_DATA) -eq $WRITE_DATA) -or `
(($Permissions -band $APPEND_DATA) -eq $APPEND_DATA)
if ($canRead -and $canWrite) { return 'Read/Write' }
if ($canRead) { return 'Read' }
if ($canWrite) { return 'Write' }
return 'No Access'
}
Get-SmbOpenFile -ErrorAction Stop | ForEach-Object {
[PSCustomObject]@{
Server = $env:COMPUTERNAME
FileId = $_.FileId
SessionId = $_.SessionId
ClientComputerName = $_.ClientComputerName
ClientUserName = $_.ClientUserName
Path = $_.Path
ShareRelativePath = $_.ShareRelativePath
Locks = $_.Locks
OpenMode = Convert-PermissionsToOpenMode -Permissions $_.Permissions
}
}
} -ErrorAction Stop
$allOpenFiles += $result
}
catch {
Write-Warning "Не удалось получить данные с сервера $server : $_"
}
}
if ($allOpenFiles.Count -gt 0) {
$allOpenFiles | Format-Table -AutoSize
}
else {
Write-Host "На указанных серверах открытых файлов не обнаружено."
}
}