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
}