关于Get-ADDomainController、$env:LOGONSERVER与nltest返回不同域控制器名称的疑问
关于Get-ADDomainController、$env:LOGONSERVER与nltest返回不同域控制器名称的疑问
嗨,这个问题其实很好理解——这三个获取域控制器的方式,背后的逻辑完全不一样,咱们拆开来说:
1. $env:LOGONSERVER 是什么?
这个环境变量记录的是你登录当前机器时,用来验证你身份的那个域控制器,也就是和你的登录会话绑定的DC。只要你不重新登录机器,这个值基本不会变,它代表的是你登录那一刻AD给你分配的验证DC(比如你的例子里的PAR-DC03)。
2. Get-ADDomainController 的逻辑
默认情况下,这个命令会优先查找当前PowerShell会话所在AD站点内的可用域控制器,即便是加了-Discover参数,它的核心逻辑还是优先当前站点的DC。AD会根据站点内DC的负载、可用性等因素,返回其中一个给你,所以如果当前站点有多个DC,每次运行可能返回不同的结果(你的例子里返回了PAR-DC02)。
3. nltest /dsgetdc 的查找逻辑
这个工具的查找范围是整个AD森林,它会根据AD的全局定位规则来挑选DC——比如当当前站点的DC不可用、或者AD配置了跨站点的DC优先级时,它就会返回其他站点的DC(你的例子里返回了ANG-DC02)。它的判断因素更多,包括DC的角色(比如是否是PDC模拟器)、站点链接成本、DC的健康状态等等。
你的命令执行输出如下:
PS C:\> (Get-ADDomainController).Name PAR-DC02 PS C:\> $env:LOGONSERVER.Substring(2) PAR-DC03 PS C:\> nltest /dsgetdc:$ENV:USERDNSDOMAIN | sls DC: | % { ( $_ -split('\s+|\.') )[2].substring(2) } ANG-DC02
即使给Get-ADDomainController加上-Discover参数,它还是遵循当前站点优先的逻辑,所以结果和默认一致:
PS C:\> (Get-ADDomainController -Discover).Name PAR-DC02
总结一下:这三个方法的“目标”完全不同,返回不同的DC是正常现象:
- $env:LOGONSERVER → 绑定你登录会话的DC
- Get-ADDomainController → 当前站点内的可用DC
- nltest → 全局范围内符合AD定位规则的DC
备注:内容来源于stack exchange,提问作者SebMa
相关产品推荐
相关产品推荐

