从 AD 站点和服务查询给定 IP 的站点

从 AD 站点和服务查询给定 IP 的站点

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]}}
        }
    }
}

相关内容