You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 03:30:54