使用WMI获取林中所有域控制器的相关技术问询
问题解答
原查询的局限性
你当前的WMI查询无法返回多域林中所有域的域控制器。原因是root\directory\ldap命名空间下的ds_computer类仅会检索当前DC所属域的Active Directory对象,跨域的域控制器不会被纳入查询结果。
可行替代方案
方案1:使用Active Directory PowerShell模块(推荐)
这是最简洁高效的方式,前提是已安装RSAT工具的AD模块:
# 获取林中所有域控制器的完整信息 Get-ADDomainController -Filter * -Server (Get-ADForest).RootDomain # 仅提取DNS主机名 Get-ADDomainController -Filter * -Server (Get-ADForest).RootDomain | Select-Object HostName
指定林根域作为查询服务器,确保能遍历整个林的DC信息。
方案2:使用WMI/CIM查询(无需AD模块)
如果无法安装AD模块,可以使用root\MicrosoftActiveDirectory命名空间的MSAD_DomainController类,这个类专门用于检索整个林的域控制器:
# 用Get-WmiObject(旧版) Get-WmiObject -Namespace root\MicrosoftActiveDirectory -Class MSAD_DomainController | Select-Object DNSHostName # 推荐用Get-CimInstance(WMI的现代化替代) Get-CimInstance -Namespace root\MicrosoftActiveDirectory -Class MSAD_DomainController | Select-Object DNSHostName
方案3:直接LDAP查询(底层实现)
如果需要完全依赖.NET类实现,可通过全局编录(GC)执行LDAP查询,全局编录存储了整个林的目录数据:
# 替换为你的林根域DNS名 $rootDomain = "your-root-domain.com" $searcher = New-Object System.DirectoryServices.DirectorySearcher $searcher.SearchRoot = New-Object System.DirectoryServices.DirectoryEntry("GC://$rootDomain") # 使用位匹配过滤器,避免因userAccountControl其他位被设置导致漏查 $searcher.Filter = "(objectCategory=computer)(userAccountControl:1.2.840.113556.1.4.803:=532480)" $searcher.PropertiesToLoad.Add("dNSHostName") | Out-Null foreach ($result in $searcher.FindAll()) { $result.Properties["dnshostname"][0] }
这里的1.2.840.113556.1.4.803是LDAP的位比较运算符,用于匹配userAccountControl中包含域控制器标识(532480)的对象,比直接等值匹配更可靠。
内容的提问来源于stack exchange,提问作者cloud devil
相关产品推荐
相关产品推荐

