Windows AD PowerShell(六):DCDiag 域控健康检查
这是 Windows AD PowerShell 学习记录的第六节,主要整理 dcdiag 的运行范围、常用测试、输出判断和域控制器分层排障方法。
当前实验域有 QYNET-CORE01 和 QYNET-CORE02 两台 DC。LDAP 中可以确认两台 DC 都存在 DFSR SYSVOL Subscription,并承载 DomainDnsZones 与 ForestDnsZones 分区;但这些配置对象存在,不等于 DNS、SYSVOL 共享或 DFSR 运行状态一定健康,仍需通过 dcdiag、事件日志和共享访问测试验证。
六、DCDiag 健康检查
6.1 DCDiag 用来检查什么
dcdiag.exe 会针对域控制器运行一组诊断测试,包括:
- DNS 注册和基础连通性。
- LDAP、RPC、SMB 以及相关服务。
- AD 复制和 KCC 拓扑。
- SYSVOL、NETLOGON 与 DFSR 事件。
- DC 是否正确 Advertising。
- 计算机账户、SPN 和命名上下文权限。
- FSMO 角色定位。
- 系统日志和关键服务。
在 DC 上默认可直接使用;在管理工作站上需要安装 RSAT,并以提升权限的 PowerShell 或 CMD 运行。
查看语法和测试列表:
dcdiag /?只运行 dcdiag 时,会先执行无法跳过的 Connectivity,然后运行一组默认测试。它不是“一个结果代表全部健康”的单项检测,应按失败测试名称继续定位。
6.2 先理解运行范围和输出参数
| 参数 | 含义 |
|---|---|
/s:<DC> | 指定一台 DC;不指定时通常检查本地 DC |
/a | 检查当前 AD 站点内的所有 DC |
/e | 检查整个企业中的所有 DC,会覆盖 /a |
/test:<Test> | 只运行指定测试 |
/q | Quiet,只输出错误 |
/v | Verbose,输出详细过程 |
/c | Comprehensive,运行几乎所有测试 |
/skip:<Test> | 配合 /c 跳过指定测试 |
/f:<File> | 把文本输出写入文件 |
/x:<File> | DNS 测试专用,输出 XML |
/fix | 只影响 MachineAccount 测试,可修复部分 SPN;不是通用修复开关 |
常见范围示例:
# 当前 DC 的默认测试dcdiag
# 指定一台 DCdcdiag /s:QYNET-CORE01
# 当前站点内全部 DCdcdiag /a
# 全企业全部 DCdcdiag /e⚠️
/e在多站点、大型环境中会增加 RPC、LDAP、WMI、事件日志和 DNS 查询流量。与/c组合时还会运行非默认测试,不应在不了解拓扑和链路状况时频繁执行。
/q 与 /v 的用途相反:
# 日常巡检:只看错误dcdiag /e /q
# 定位问题:查看指定测试的详细过程dcdiag /s:QYNET-CORE01 /test:DNS /v/q 没有输出通常表示本次测试没有报告错误,而不是命令没有运行。
6.3 第一步:Connectivity
推荐先检查连通性:
dcdiag /s:QYNET-CORE01 /test:Connectivity /v
Directory Server Diagnosis
Performing initial setup: Trying to find home server... Home Server = QYNET-CORE01 * Identified AD Forest. Done gathering initial info.
Doing initial required tests
Testing server: QYNET-CORE\QYNET-CORE01 Starting test: Connectivity ......................... QYNET-CORE01 passed test ConnectivityConnectivity 会检查 DC 是否在 DNS 中注册,以及 LDAP、RPC 等基础通信是否可用。它是必需测试,即使运行其他 /test,初始化阶段也可能先执行 Connectivity。
如果失败,优先检查:
Resolve-DnsName QYNET-CORE01.qy.net
Resolve-DnsName -Type SRV "_ldap._tcp.dc._msdcs.qy.net"
Test-NetConnection QYNET-CORE01.qy.net -Port 389Test-NetConnection QYNET-CORE01.qy.net -Port 135
Get-Service NTDS,Netlogon,DNS,KDC | Select-Object Name,Status,StartType不要在 Connectivity 失败时直接追查 GPO、FSMO 或 SYSVOL;基础 DNS、LDAP 或 RPC 不通,会让后续大量测试产生连锁错误。
6.4 第二步:DNS
运行当前 DC 的完整 DNS 测试:
dcdiag /test:DNS /v指定 DC 的基础 DNS 检查:
dcdiag /s:QYNET-CORE01 /test:DNS /DnsBasic /v全企业 DNS 检查:
dcdiag /e /test:DNS /DnsAll /vDNS 子测试:
| 参数 | 检查内容 |
|---|---|
/DnsBasic | 网络、DNS 客户端配置、服务和区域 |
/DnsForwarders | 基础测试和转发器 |
/DnsDelegation | 基础测试和委派 |
/DnsDynamicUpdate | AD 区域是否允许动态更新 |
/DnsRecordRegistration | A、CNAME 和关键 SRV 记录 |
/DnsResolveExtName | 外部名称解析 |
/DnsAll | 除外部名称解析外的全部 DNS 子测试 |
不指定 DNS 子测试时,/test:DNS 默认执行 /DnsAll,但不包含 /DnsResolveExtName。
健康摘要格式类似:
Summary of DNS test results:
Auth Basc Forw Del Dyn RReg Ext____________________________________________________________________________Domain: qy.net QYNET-CORE01 PASS PASS PASS PASS PASS PASS n/a QYNET-CORE02 PASS PASS PASS PASS PASS PASS n/a
......................... qy.net passed test DNS常见 DNS 排查命令:
# DC 定位Resolve-DnsName -Type SRV "_ldap._tcp.dc._msdcs.qy.net"
# KerberosResolve-DnsName -Type SRV "_kerberos._tcp.qy.net"
# GCResolve-DnsName -Type SRV "_gc._tcp.qy.net"
# 清理本机缓存并重新注册Clear-DnsClientCacheipconfig /registerdnsnltest /dsregdnsipconfig /registerdns 和 nltest /dsregdns 会触发 DNS 注册,属于状态变更;应在确认记录缺失或陈旧后执行。
计算机对象、DNS 和端口的基础排查已经在第三篇的 3.7 节展开;SRV 记录、站点定位、SPN 和 Kerberos 排障参见第七篇:DNS、SPN 与 Kerberos 排障。本节只保留 DCDiag 的 DNS 测试入口。
6.5 检查 AD 复制
dcdiag /s:QYNET-CORE01 /test:Replications
Testing server: QYNET-CORE\QYNET-CORE01 Starting test: Replications ......................... QYNET-CORE01 passed test Replications对全部 DC 检查:
dcdiag /e /test:Replications出现失败时,继续使用:
repadmin /replsummaryrepadmin /showrepl QYNET-CORE01repadmin /showrepl QYNET-CORE02Get-ADReplicationFailure -Target * -Scope Forest复制方向、命名上下文、错误码以及 repadmin /replicate 的安全用法已经在第五篇:复制健康与 Repadmin详细整理,本节只把 Replications 作为 DCDiag 的健康入口。
💡 Replications 负责发现“复制是否及时、是否报错”;Repadmin 更适合查看源、目标、命名上下文、最后成功时间和错误码。两者应配合使用。
6.6 检查 SYSVOL、NETLOGON 和 Advertising
dcdiag /s:QYNET-CORE01 /test:SysVolCheck /test:Advertising
Testing server: QYNET-CORE\QYNET-CORE01 Starting test: Advertising ......................... QYNET-CORE01 passed test Advertising Starting test: SysVolCheck ......................... QYNET-CORE01 passed test SysVolCheck对全部 DC 检查:
dcdiag /e /test:SysVolCheck /test:Advertising| 测试 | 实际检查内容 |
|---|---|
SysVolCheck | 读取 Netlogon 的 SysVolReady 注册表值,确认其为 1 |
Advertising | 通过 DC Locator 检查 DC 是否声明自己具备应有角色 |
NetLogons | 检查当前用户能否读取 SYSVOL、NETLOGON 共享及相关网络权限 |
DFSREvent | 检查过去 24 小时 DFSR 日志中的警告和错误 |
⚠️ SysVolCheck 通过不代表 SYSVOL 内容在两台 DC 上完全一致,也不代表共享一定能访问。共享访问由 NetLogons 等测试补充检查。
继续验证共享:
dcdiag /s:QYNET-CORE01 /test:NetLogons /test:DFSREvent
Test-Path "\\QYNET-CORE01\SYSVOL"True
Test-Path "\\QYNET-CORE01\NETLOGON"True
Get-SmbShare -CimSession QYNET-CORE01 | Where-Object Name -in "SYSVOL","NETLOGON" | Select-Object Name,Path
Name Path---- ----NETLOGON C:\Windows\SYSVOL\sysvol\qy.net\SCRIPTSSYSVOL C:\Windows\SYSVOL\sysvol检查本机注册表:
$sysvolParams = @{ Path = "HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters" Name = "SysVolReady"}
Get-ItemProperty @sysvolParams
SysVolReady : 1查看 DFSR 日志:
Get-WinEvent -FilterHashtable @{ LogName = "DFS Replication" Level = 2,3 StartTime = (Get-Date).AddHours(-24)} | Select-Object TimeCreated,Id,LevelDisplayName,Message当前 LDAP 元数据中,两台 DC 的 SYSVOL Subscription 都启用,并指向同一个 Domain System Volume 复制组。这个结果只能证明 DFSR 配置对象存在,仍需以 DFSREvent、共享和实际文件同步为准。
Advertising 失败时优先检查:
Get-Service Netlogon,KDC,NTDS,DNS | Select-Object Name,Status,StartType
nltest /dsgetdc:qy.net /force
Resolve-DnsName -Type SRV "_ldap._tcp.dc._msdcs.qy.net"Resolve-DnsName -Type SRV "_kerberos._tcp.qy.net"Netlogon 停止会导致 Advertising 失败;KDC 停止也会导致返回的 DC Locator 标志不完整。不过 Advertising 通过并不能证明 Kerberos 端口 88 一定能被客户端访问,还要检查防火墙和端口。
6.7 检查 FSMO 角色定位
dcdiag /test:FSMOCheck
Starting test: FsmoCheck ......................... QYNET-CORE01 passed test FsmoCheck从另一台 DC 发起:
dcdiag /s:QYNET-CORE02 /test:FSMOCheckFSMOCheck 关注角色定位和可达性。角色职责、持有者查询、转移与夺取已经在第四篇:域控与 FSMO详细说明。
如果失败,先确认记录,再检查 DNS、RPC 和复制:
netdom query fsmo
Get-ADForest | Select-Object SchemaMaster,DomainNamingMaster
Get-ADDomain | Select-Object PDCEmulator,RIDMaster,InfrastructureMaster
repadmin /replsummary6.8 全林综合检查
只输出全林综合检查中的错误:
dcdiag /e /q /c| 参数 | 含义 |
|---|---|
/e | 检查企业中的全部 DC |
/q | 只输出错误 |
/c | Comprehensive,运行几乎所有测试 |
/c 会包含默认不运行的 Topology、CutoffServers 和 OutboundSecureChannels。CutoffServers 会使用复制相关调用检查被隔离的 DC;在多站点、低带宽或存在离线 DC 的环境中,/e /c 可能运行很久并增加流量。
保留完整证据:
$reportDirectory = "C:\Temp"New-Item -Path $reportDirectory -ItemType Directory -Force | Out-Null
$reportPath = Join-Path $reportDirectory ( "dcdiag-{0}.txt" -f (Get-Date -Format "yyyyMMdd-HHmmss"))
dcdiag /e /c /v /f:$reportPath
Get-Item $reportPath | Select-Object FullName,Length,LastWriteTime
FullName Length LastWriteTime-------- ------ -------------C:\Temp\dcdiag-20260921-153500.txt 68342 2026/9/21 15:36:18链路敏感环境可以跳过 CutoffServers:
dcdiag /e /c /skip:CutoffServers /q这样会降低主动拓扑检查带来的影响,但报告不再覆盖被隔离服务器测试,必须明确记录跳过项。
6.9 常见失败测试怎么理解
| 失败测试 | 常见方向 | 下一步 |
|---|---|---|
| Connectivity | DNS、LDAP、RPC、路由、防火墙 | 先修基础通信 |
| Advertising | Netlogon、KDC、DC Locator、SRV | 检查服务和 DC 注册 |
| Replications | DNS、RPC、Kerberos、复制拓扑 | 转到 Repadmin 定位 |
| DFSREvent | SYSVOL 的 DFSR 警告或错误 | 查 DFS Replication 日志 |
| SysVolCheck | SysVolReady 不为 1 | 检查 DFSR 初始化和 SYSVOL |
| NetLogons | SYSVOL/NETLOGON 共享或网络权限 | 测试 UNC、SMB 和权限 |
| KccEvent | KCC 最近 15 分钟产生错误 | 检查站点、连接对象和复制 |
| Services | NTDS、KDC、Netlogon、W32Time 等服务 | 检查服务和依赖项 |
| SystemLog | 最近 60 分钟系统日志错误或警告 | 判断事件是否与 AD 相关 |
| MachineAccount | DC 账户、UAC 标志、SPN 或引用 | 检查计算机对象和 SPN |
| NCSecDesc | 命名上下文头部权限异常 | 检查复制权限和 ACL |
| KnowsOfRoleHolders | DC 对 FSMO 持有者的认知异常 | 检查复制和角色记录 |
失败测试前面的具体信息比最后一行更重要:
Starting test: Advertising Warning: DsGetDcName returned information for \\QYNET-CORE02.qy.net, when we were trying to reach QYNET-CORE01. SERVER IS NOT RESPONDING or IS NOT CONSIDERED SUITABLE. ......................... QYNET-CORE01 failed test Advertisingfailed test Advertising 只是分类结果;真正有价值的是前面的 DC Locator、服务或错误码信息。
/fix 不是“一键修复 DCDiag”:
# 先诊断,不要直接修dcdiag /s:QYNET-CORE01 /test:MachineAccount /v
# 核对 DC 的 SPNsetspn -L QYNET-CORE01只有确认 MachineAccount 测试发现可由 DCDiag 处理的 SPN 问题后,才评估 /fix。它不会修复 DNS、复制、SYSVOL、数据库或防火墙问题。
6.10 三个排障案例
案例一:用户可以登录,但 GPO 没有应用
# 1. 基础连通dcdiag /e /test:Connectivity
# 2. DNS 与 DC 定位dcdiag /e /test:DNS /DnsBasic /v
# 3. DC 是否正常发布dcdiag /e /test:Advertising
# 4. SYSVOL、共享和 DFSRdcdiag /e /test:SysVolCheck /test:NetLogons /test:DFSREvent
# 5. AD 复制dcdiag /e /test:Replicationsrepadmin /replsummary然后在客户端检查:
gpupdate /forcegpresult /Scope Computer /Rgpresult /Scope User /R能够登录只说明至少有 DC 提供认证,不代表客户端访问到的 SYSVOL、GPO 版本和复制状态都正常。
案例二:同时出现多个看似无关的错误
如果 Connectivity、Advertising、Replications、FSMOCheck 同时失败,先检查 DNS:
Get-DnsClientServerAddress -AddressFamily IPv4 | Where-Object ServerAddresses | Select-Object InterfaceAlias,ServerAddresses
Resolve-DnsName -Type SRV "_ldap._tcp.dc._msdcs.qy.net"
dcdiag /s:QYNET-CORE01 /test:DNS /DnsBasic /v如果 DC 错误地使用公共 DNS,后续测试会出现大量连锁错误。修正 DNS 后重新测试:
Clear-DnsClientCache
dcdiag /s:QYNET-CORE01 /test:Connectivitydcdiag /s:QYNET-CORE01 /test:DNS /DnsBasic /vdcdiag /s:QYNET-CORE01 /test:Advertising不要一次修改多个组件;按 Connectivity → DNS → Advertising 的顺序复测,更容易确认根因。
案例三:新 DC 已提升,但还不能稳定提供服务
dcdiag /s:QYNET-CORE02 /test:Connectivity /vdcdiag /s:QYNET-CORE02 /test:Advertising /vdcdiag /s:QYNET-CORE02 /test:SysVolCheck /test:NetLogonsdcdiag /s:QYNET-CORE02 /test:Replications
repadmin /showrepl QYNET-CORE02重点确认:
- DC 计算机对象和 NTDS Settings 对象已经复制。
- DNS 中存在 A、CNAME 和关键 SRV 记录。
- SYSVOL 初始化完成且
SysVolReady=1。 - SYSVOL 和 NETLOGON 共享可访问。
- Netlogon、KDC、NTDS、DNS 和 DFSR 服务正常。
- 新 DC 能与伙伴完成五个命名上下文的复制。
6.11 保存和筛选检查结果
生成带时间戳的报告:
$reportDirectory = "C:\Temp\DCDiag"New-Item $reportDirectory -ItemType Directory -Force | Out-Null
$timestamp = Get-Date -Format "yyyyMMdd-HHmmss"$reportPath = Join-Path $reportDirectory "dcdiag-$timestamp.txt"
dcdiag /e /c /v 2>&1 | Set-Content -Path $reportPath -Encoding UTF8
$reportPath
C:\Temp\DCDiag\dcdiag-20260921-160215.txt快速提取问题:
Get-Content $reportPath | Select-String -Pattern "failed test","error","warning" | Select-Object LineNumber,Line
LineNumber Line---------- ---- 184 ......................... QYNET-CORE02 failed test Advertising英文关键字筛选依赖系统输出语言,只适合辅助定位。最终仍应阅读失败测试前后的完整上下文。
比较修复前后的报告:
$before = Get-Content "C:\Temp\DCDiag\before.txt"$after = Get-Content "C:\Temp\DCDiag\after.txt"
Compare-Object $before $after日常检查可以先运行:
dcdiag /e /q
repadmin /replsummary
Get-ADReplicationFailure -Target * -Scope Forest6.12 推荐检查顺序
dcdiag /test:Connectivity:确认 DNS、LDAP 和 RPC。dcdiag /test:DNS /DnsBasic /v:确认 DNS 客户端、区域和服务。dcdiag /test:Advertising:确认 DC Locator 能找到合适 DC。dcdiag /test:Replications:确认 AD 复制及时且无错误。dcdiag /test:SysVolCheck /test:NetLogons /test:DFSREvent:检查 SYSVOL。dcdiag /test:FSMOCheck:确认角色定位和可达性。- 根据症状增加 Services、KccEvent、MachineAccount、NCSecDesc。
- 最后运行
dcdiag /e /q /c做全局收尾。 - 修复后重复同一组测试,并保存前后报告。
先 Connectivity,再 DNS,然后 Advertising、Replication、SYSVOL,最后才是综合检查。DNS 挂了,后面的报错很可能只是连锁反应。
参考资料
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!













