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


function Get-OpenFilesOnServers {
    <#
    .SYNOPSIS
        Получает информацию об открытых файлах на SMB-шарах указанных серверов.

    .DESCRIPTION
        Функция последовательно опрашивает каждый сервер из списка $Servers
        с помощью Invoke-Command и командлета Get-SmbOpenFile.
        Для работы требуется, чтобы на удалённых серверах был включён WinRM
        и у учётной записи были права администратора.

    .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 |
                    Select-Object @{Name='Server';Expression={$env:COMPUTERNAME}},
                                  FileId,
                                  SessionId,
                                  ClientComputerName,
                                  ClientUserName,
                                  Path,
                                  ShareRelativePath
            } -ErrorAction Stop

            $allOpenFiles += $result
        }
        catch {
            Write-Warning "Не удалось получить данные с сервера $server : $_"
        }
    }

    # Возвращаем результат в виде таблицы
    if ($allOpenFiles.Count -gt 0) {
        $allOpenFiles | Format-Table -AutoSize
    }
    else {
        Write-Host "На указанных серверах открытых файлов не обнаружено."
    }
}