Windows Active Directory 维护子网到站点分配的列表(在“Active Directory - 站点和服务”-> 站点 -> 子网中)。子网到站点关联显然由工作站使用,以便选择合适的 DC 进行身份验证。但是如何以编程方式将这些信息用于其他目的?例如:给定一个 IP,我想获取在最佳匹配子网的属性中找到的站点名称之类的信息。根据到目前为止发现的内容,我可以列出所有子网并自己对所有子网进行子网匹配 - 但由于此任务在每次工作站重新启动时都会以某种方式执行,因此我确信有一些直接的方法可以实现此目的...
答案1
nltest /server:servername /dsgetsite
将通过查询 AD 为您提供站点名称。
您可以将其包装在 Powershell 中,以便更轻松地以编程方式使用它:
function Get-SystemSite($SystemName)
{
$site = nltest /server:$SystemName /dsgetsite 2>$null
if($LASTEXITCODE -eq 0) { $site[0] }
}
答案2
我编写了这个函数来简化我对 nltest 的使用,正如 phoebus 所建议的那样。
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]}}
}
}
}