Windows Active Directory поддерживает список назначений сайтов подсети (в «Active Directory - Сайты и службы» -> Сайты -> Подсети). Очевидно, что связи между подсетями и узлами используются рабочими станциями, чтобы выбрать подходящий DC для аутентификации. Но как эту информацию можно использовать программно для других целей? Например: учитывая IP, я хотел бы получить такие вещи, как имя сайта, как указано в свойствах в наиболее подходящей подсети. С помощью того, что было найдено, я мог бы перечислить все подсети и выполнить сопоставление подсетей со всеми ними самостоятельно, но поскольку эта задача так или иначе выполняется при каждой перезагрузке рабочей станции, я уверен, что для этого есть какой-то прямой метод ...
2 ответа
1
nltest /server:servername /dsgetsite
даст вам имя сайта, запросив AD.
Вы можете обернуть его в Powershell, чтобы использовать его программно проще:
function Get-SystemSite($SystemName)
{
$site = nltest /server:$SystemName /dsgetsite 2>$null
if($LASTEXITCODE -eq 0) { $site[0] }
}
-1
Я написал эту функцию, чтобы упростить использование nltest, как предложил Феб.
Function Get-AdSiteAndSubnetFromIP {
<#
.Synopsis
Get the matching AD Site and Subnet for a given IP Address
.DESCRIPTION
Get the matching AD Site and Subnet for a given IP Address. The results will be returned as a Hash.
.EXAMPLE
Get-AdSiteAndSubnetFromIP -ip 172.28.68.53
ADSite ADSubnet
------ --------
SiteA 10.1.0.0/16
.EXAMPLE
(Get-AdSiteAndSubnetFromIP -ip 172.28.68.53).ADSite
SiteA
#>
param([string]$ip
)
$site = nltest /DSADDRESSTOSITE:$ip /dsgetsite 2>$null
if ($LASTEXITCODE -eq 0) {
$split = $site[3] -split "\s+"
# validate result is for an IPv4 address before continuing
if ($split[1] -match [regex]"^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$") {
"" | select @{l="ADSite";e={$split[2]}}, @{l="ADSubnet";e={$split[3]}}
}
}
}