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


function Get-DFSServers {
    <#
    .SYNOPSIS
        Получает список имён серверов, на которых размещены папки (targets) в DFS-пространствах имён.
    .DESCRIPTION
        Функция подключается к указанному DFS-серверу (или к домену), перечисляет все пространства имён,
        затем для каждой папки внутри каждого пространства получает список целей и извлекает из них имена серверов.
    .PARAMETER DFSServer
        Имя или FQDN сервера, на котором размещены пространства имён DFS. Если не указан, используется локальный компьютер.
    .EXAMPLE
        Get-DFSServers -DFSServer "dc01.corporate.ru"
    #>
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $false)]
        [string]$DFSServer = $env:COMPUTERNAME
    )

    # Импортируем модуль DFSN, если он ещё не загружен
    if (-not (Get-Module -Name DFSN)) {
        Import-Module DFSN -ErrorAction Stop
    }

    # Получаем все пространства имён DFS на указанном сервере
    try {
        $namespaces = Get-DfsnRoot -CimSession $DFSServer -ErrorAction Stop
    }
    catch {
        Write-Error "Не удалось получить список пространств имён с сервера '$DFSServer': $_"
        return
    }

    $serverNames = [System.Collections.Generic.HashSet[string]]::new()

    foreach ($ns in $namespaces) {
        # Получаем все папки (ссылки) в текущем пространстве имён
        try {
            $folders = Get-DfsnFolder -Path $ns.Path -CimSession $DFSServer -ErrorAction Stop
        }
        catch {
            Write-Warning "Не удалось получить папки для пространства имён '$($ns.Path)': $_"
            continue
        }

        foreach ($folder in $folders) {
            # Получаем все цели (targets) для текущей папки
            try {
                $targets = Get-DfsnFolderTarget -Path $folder.Path -CimSession $DFSServer -ErrorAction Stop
            }
            catch {
                Write-Warning "Не удалось получить цели для папки '$($folder.Path)': $_"
                continue
            }

            foreach ($target in $targets) {
                # Извлекаем имя сервера из UNC-пути цели (например, \\server\share -> server)
                if ($target.TargetPath -match '^\\\\([^\\]+)\\') {
                    $serverName = $matches[1]
                    [void]$serverNames.Add($serverName)
                }
            }
        }
    }

    # Возвращаем уникальные имена серверов
    return $serverNames
}