Загрузка данных


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 "На указанных серверах открытых файлов не обнаружено."
    }
}