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


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