在域内任意一台已加入域的电脑上,打开命令提示符输入 nltest /dclist:你的域名,或者使用 PowerShell 的 Get-ADDomainController -Discover 命令,几秒钟就能列出当前可用的所有域控。
很多刚接触域环境的朋友,接手一台服务器或电脑时,第一件事就是想搞清楚“这公司的‘大管家’到底有几台,都藏在哪里”,这个问题看似简单,但在实际运维中,不同网络环境、不同权限下,能看到的结果差别很大,下面我把这几年摸爬滚打总结出来的查看方法,按照从易到难的顺序,一次性给你讲透。
用图形界面直接“看”见域控
对于不习惯敲命令的朋友,Server 管理器里的“Active Directory 用户和计算机”是最直观的入口,但这只能看到当前连接的这台域控,并不是完整列表,想看到全部,得换个地方。
在“Active Directory 站点和服务”里找
这是最经典的图形界面查看法,也是我平时首选的排查方式。
- 在域控服务器上,打开“服务器管理器”,点击右上角“工具”菜单,选择“Active Directory 站点和服务”。
- 在左侧导航栏展开“Sites”双击打开你的站点名称(默认是 Default-First-Site-Name)。
- 点开“Servers”文件夹,你会看到所有服务器计算机名,点开任意一台,右键点击“NTDS Settings”,选择“属性”。
- 在弹出的窗口中,找到“服务器”那一栏,显示的即是这台服务器作为域控的完整计算机名。
这个方法能看到域控的逻辑拓扑结构,但有个小缺点:它列的是“服务器对象”,不区分这台机器到底是域控还是普通的成员服务器,如果服务器角色装得多,列表会有点杂。
快速判断某台机器是不是域控
还有一个很实用的图形技巧,在域内任意一台电脑上,按 Win + R 输入 dsa.msc,打开“Active Directory 用户和计算机”,在左侧域名上右键,选择“域控制器”,右侧列出的对象,全部都是域控服务器,这个方法最干净,只显示域控,不含成员服务器。
命令行:运维老手的核心武器
图形界面虽然直观,但在排查故障、脚本自动化时,命令行永远是效率之王,尤其是当你管理的服务器没有图形界面(Server Core 模式)时,下面这几个命令就是救命稻草。
nltest 查询主域控和所有域控
nltest 是 Windows 自带的域诊断工具,地位极高,它能看到域控的动态发现结果,也就是客户端实际能联系上的那些。
打开命令提示符(建议以管理员身份运行),输入:
nltest /dclist:contoso.com
把 contoso.com 换成你的真实域名,执行后,每一行会列出一台域控的计算机名,并标注它是否是 PDC(主域控制器),注意,如果列出了多台,说明你的环境有多台域控在做负载均衡和故障转移,如果只在域控本机查询,可能只显示自己,这是正常的。
如果想看当前这台电脑“认准”的域控是哪台(登录验证用的),用这个:
nltest /dsgetdc:contoso.com
这个命令很有意思,它返回的“DC”字段,代表着当前会话的认证域控,当你觉得登录速度慢,想确认是不是某一台域控响应异常时,这个命令能帮你快速定位。
netdom query 查询域控清单
另一个神器是 netdom,在命令行输入:
netdom query dc
这个命令不需要带域名参数,它会自动从当前信任域查询,并列出所有域控的计算机名,它的输出格式非常干净,一个名字占一行,方便直接复制到脚本里。
业内专家指出,netdom query dc 在排查域控复制故障时,比图形界面更可靠,因为它直接查询域数据库记录,绕开了本地缓存。
systeminfo 查系统信息里的域角色
这个命令稍微“绕”一点,但适合远程排查,在目标服务器上执行:
systeminfo | findstr /i "域"
在输出结果里找到“域控制器”这一行,如果显示“是”,说明这台机器是域控,如果显示“否”,则是成员服务器,这个方法适合批量验证哪些机器是域控,配合 psexec 可以远程循环。
PowerShell:批量处理与精细过滤
现在微软主推 PowerShell,查域控的命令也更结构化,PowerShell 能返回对象,你可以直接筛选、排序、导出,这是传统命令行做不到的。
Get-ADDomainController 获取详细参数
这是查询域控的终极命令,在域控或安装了 RSAT 工具的电脑上,打开 PowerShell 输入:
Get-ADDomainController -Filter | Select-Object Name, Domain, IPv4Address, Site, OperationMasterRole
这个命令会列出所有域控,并告诉你每台域控的 IP 地址、所在的站点、是否持有灵活单主机操作角色(FSMO,即五大角色),这里要注意,OperationMasterRole 字段如果不为空,说明这台域控承担着特定角色,RID 主机或 PDC 模拟器。
如果只想看当前的登录域控:
Get-ADDomainController -Discover -Service PrimaryDC
这会直接告诉你在当前网络环境下,客户端获取到的 PDC 模拟器是哪台,假如你有多个站点,这个命令能看出某个站点里网络情况不好的域控。
比较:PowerShell 和 CMD 哪个更快
很多朋友纠结学哪个,我的建议是,看你手头有什么工具,如果是 Windows Server 2016 以上版本,PowerShell 优先,因为输出是对象化的。
假设你想找“除了上海站点之外的所有域控”,PowerShell 只需要加一个 Where-Object 过滤:
Get-ADDomainController -Filter {Site -ne 'Shanghai'} | Format-Table Name
而 CMD 的 for /f 循环实现同样功能,代码要写十几行,但反过来,如果你的系统是 Windows Server 2008 老环境,或者没有安装 AD 管理工具,nltest 和 netdom 的兼容性更好,几乎不会报错。
通过 DNS 和网络解析反查域控
域控的发现机制依赖 DNS(域名系统,Domain Name System),所有域控都会在 DNS 里注册 SRV 记录,如果你想从网络层面“硬核”查询,可以用 nslookup。
在命令行输入:
nslookup -type=SRV _ldap._tcp.dc._msdcs.contoso.com
这里的 contoso.com 换成你的域名,DNS 配置正常,你应该会看到返回的 target 字段,里面列出了所有域控的完整主机名。
这个方法有个独到之处:不依赖 AD 权限,哪怕你只有一台能解析内网 DNS 的电脑(甚至没加域),也能查出域控清单,我遇到过很多次域内账号被锁、无法登录域控的情况,就是用这个方法先摸清家底,再通过物理手段或本地管理员权限处理。
查到了之后,如何判断哪台是“老大”
列表里的域控有多台,但它们地位不同。
PDC 模拟器是唯一的,属于域控里的“班长”,想知道谁是 PDC,可以用 PowerShell:
Get-ADDomain | Select-Object PDCEmulator
这个结果大概率是第一台部署的域控,如果这台机器宕机了,域内密码更改、组策略同步都会出问题,所以查完列表后,顺手查一下 PDC 是哪台,能帮你更清晰地了解自己环境的脆弱点。
你也可以用 netdom query fsmo 直接查询所有五大角色分别在哪台服务器上,这个方法很直观,输出结果一行一个角色名称加对应服务器名,方便核对。
常用查看方法对比
下面这张表是我在日常工作中总结的,能帮你快速选对方法:
| 方法 | 命令/路径 | 特点 | 适用场景 |
|---|---|---|---|
| 图形界面 | AD站点和服务 | 直观,能看到拓扑 | 日常巡检 |
| 命令行 | nltest /dclist:域名 |
客户端视角,查动态发现 | 排查登录慢、网络故障 |
| 命令行 | netdom query dc |
输出干净,适合脚本 | 批量导出清单 |
| PowerShell | Get-ADDomainController |
信息最全,可筛选 | 精细化管理、自动化 |
| DNS解析 | nslookup -type=SRV |
无需域权限 | 账号被锁时的应急排查 |
Q&A:关于查看域控的常见问题
怎么查看域控服务器有哪些且不是当前登录的那台?
用 Get-ADDomainController -Filter 列出全部,然后排除“HostName”属性等于当前计算机名的那台,同理,nltest /dclist 列出的所有名字里,当前电脑上执行 hostname 就能区分出哪台是本地,如果想看其他站点或离线状态的域控,PowerShell 的 -Filter 配合 OperatingSystem 属性筛选更准确。
在没加域的电脑上能查看域里的域控吗?
可以,只要这台电脑能访问内网 DNS,使用 nslookup -type=SRV _ldap._tcp.dc._msdcs.域名 即可解析出所有域控的 DNS 名称,但注意,这只显示 DNS 里注册的 SRV 记录,不能显示已停用或 DNS 注册异常的域控。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/719691.html





