Windows AD PowerShell(六):DCDiag 域控健康检查

3017 字
15 分钟
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 运行。

查看语法和测试列表:

Terminal window
dcdiag /?

只运行 dcdiag 时,会先执行无法跳过的 Connectivity,然后运行一组默认测试。它不是“一个结果代表全部健康”的单项检测,应按失败测试名称继续定位。

6.2 先理解运行范围和输出参数#

参数含义
/s:<DC>指定一台 DC;不指定时通常检查本地 DC
/a检查当前 AD 站点内的所有 DC
/e检查整个企业中的所有 DC,会覆盖 /a
/test:<Test>只运行指定测试
/qQuiet,只输出错误
/vVerbose,输出详细过程
/cComprehensive,运行几乎所有测试
/skip:<Test>配合 /c 跳过指定测试
/f:<File>把文本输出写入文件
/x:<File>DNS 测试专用,输出 XML
/fix只影响 MachineAccount 测试,可修复部分 SPN;不是通用修复开关

常见范围示例:

Terminal window
# 当前 DC 的默认测试
dcdiag
# 指定一台 DC
dcdiag /s:QYNET-CORE01
# 当前站点内全部 DC
dcdiag /a
# 全企业全部 DC
dcdiag /e

⚠️ /e 在多站点、大型环境中会增加 RPC、LDAP、WMI、事件日志和 DNS 查询流量。与 /c 组合时还会运行非默认测试,不应在不了解拓扑和链路状况时频繁执行。

/q 与 /v 的用途相反:

Terminal window
# 日常巡检:只看错误
dcdiag /e /q
# 定位问题:查看指定测试的详细过程
dcdiag /s:QYNET-CORE01 /test:DNS /v

/q 没有输出通常表示本次测试没有报告错误,而不是命令没有运行。

6.3 第一步:Connectivity#

推荐先检查连通性:

Terminal window
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 Connectivity

Connectivity 会检查 DC 是否在 DNS 中注册,以及 LDAP、RPC 等基础通信是否可用。它是必需测试,即使运行其他 /test,初始化阶段也可能先执行 Connectivity。

如果失败,优先检查:

Terminal window
Resolve-DnsName QYNET-CORE01.qy.net
Resolve-DnsName -Type SRV "_ldap._tcp.dc._msdcs.qy.net"
Test-NetConnection QYNET-CORE01.qy.net -Port 389
Test-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 测试:

Terminal window
dcdiag /test:DNS /v

指定 DC 的基础 DNS 检查:

Terminal window
dcdiag /s:QYNET-CORE01 /test:DNS /DnsBasic /v

全企业 DNS 检查:

Terminal window
dcdiag /e /test:DNS /DnsAll /v

DNS 子测试:

参数检查内容
/DnsBasic网络、DNS 客户端配置、服务和区域
/DnsForwarders基础测试和转发器
/DnsDelegation基础测试和委派
/DnsDynamicUpdateAD 区域是否允许动态更新
/DnsRecordRegistrationA、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 排查命令:

Terminal window
# DC 定位
Resolve-DnsName -Type SRV "_ldap._tcp.dc._msdcs.qy.net"
# Kerberos
Resolve-DnsName -Type SRV "_kerberos._tcp.qy.net"
# GC
Resolve-DnsName -Type SRV "_gc._tcp.qy.net"
# 清理本机缓存并重新注册
Clear-DnsClientCache
ipconfig /registerdns
nltest /dsregdns

ipconfig /registerdns 和 nltest /dsregdns 会触发 DNS 注册,属于状态变更;应在确认记录缺失或陈旧后执行。

计算机对象、DNS 和端口的基础排查已经在第三篇的 3.7 节展开;SRV 记录、站点定位、SPN 和 Kerberos 排障参见第七篇:DNS、SPN 与 Kerberos 排障。本节只保留 DCDiag 的 DNS 测试入口。

6.5 检查 AD 复制#

Terminal window
dcdiag /s:QYNET-CORE01 /test:Replications
Testing server: QYNET-CORE\QYNET-CORE01
Starting test: Replications
......................... QYNET-CORE01 passed test Replications

对全部 DC 检查:

Terminal window
dcdiag /e /test:Replications

出现失败时,继续使用:

Terminal window
repadmin /replsummary
repadmin /showrepl QYNET-CORE01
repadmin /showrepl QYNET-CORE02
Get-ADReplicationFailure -Target * -Scope Forest

复制方向、命名上下文、错误码以及 repadmin /replicate 的安全用法已经在第五篇:复制健康与 Repadmin详细整理,本节只把 Replications 作为 DCDiag 的健康入口。

💡 Replications 负责发现“复制是否及时、是否报错”;Repadmin 更适合查看源、目标、命名上下文、最后成功时间和错误码。两者应配合使用。

6.6 检查 SYSVOL、NETLOGON 和 Advertising#

Terminal window
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 检查:

Terminal window
dcdiag /e /test:SysVolCheck /test:Advertising
测试实际检查内容
SysVolCheck读取 Netlogon 的 SysVolReady 注册表值,确认其为 1
Advertising通过 DC Locator 检查 DC 是否声明自己具备应有角色
NetLogons检查当前用户能否读取 SYSVOL、NETLOGON 共享及相关网络权限
DFSREvent检查过去 24 小时 DFSR 日志中的警告和错误

⚠️ SysVolCheck 通过不代表 SYSVOL 内容在两台 DC 上完全一致,也不代表共享一定能访问。共享访问由 NetLogons 等测试补充检查。

继续验证共享:

Terminal window
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\SCRIPTS
SYSVOL C:\Windows\SYSVOL\sysvol

检查本机注册表:

Terminal window
$sysvolParams = @{
Path = "HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters"
Name = "SysVolReady"
}
Get-ItemProperty @sysvolParams
SysVolReady : 1

查看 DFSR 日志:

Terminal window
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 失败时优先检查:

Terminal window
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 角色定位#

Terminal window
dcdiag /test:FSMOCheck
Starting test: FsmoCheck
......................... QYNET-CORE01 passed test FsmoCheck

从另一台 DC 发起:

Terminal window
dcdiag /s:QYNET-CORE02 /test:FSMOCheck

FSMOCheck 关注角色定位和可达性。角色职责、持有者查询、转移与夺取已经在第四篇:域控与 FSMO详细说明。

如果失败,先确认记录,再检查 DNS、RPC 和复制:

Terminal window
netdom query fsmo
Get-ADForest |
Select-Object SchemaMaster,DomainNamingMaster
Get-ADDomain |
Select-Object PDCEmulator,RIDMaster,InfrastructureMaster
repadmin /replsummary

6.8 全林综合检查#

只输出全林综合检查中的错误:

Terminal window
dcdiag /e /q /c
参数含义
/e检查企业中的全部 DC
/q只输出错误
/cComprehensive,运行几乎所有测试

/c 会包含默认不运行的 Topology、CutoffServers 和 OutboundSecureChannels。CutoffServers 会使用复制相关调用检查被隔离的 DC;在多站点、低带宽或存在离线 DC 的环境中,/e /c 可能运行很久并增加流量。

保留完整证据:

Terminal window
$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:

Terminal window
dcdiag /e /c /skip:CutoffServers /q

这样会降低主动拓扑检查带来的影响,但报告不再覆盖被隔离服务器测试,必须明确记录跳过项。

6.9 常见失败测试怎么理解#

失败测试常见方向下一步
ConnectivityDNS、LDAP、RPC、路由、防火墙先修基础通信
AdvertisingNetlogon、KDC、DC Locator、SRV检查服务和 DC 注册
ReplicationsDNS、RPC、Kerberos、复制拓扑转到 Repadmin 定位
DFSREventSYSVOL 的 DFSR 警告或错误查 DFS Replication 日志
SysVolCheckSysVolReady 不为 1检查 DFSR 初始化和 SYSVOL
NetLogonsSYSVOL/NETLOGON 共享或网络权限测试 UNC、SMB 和权限
KccEventKCC 最近 15 分钟产生错误检查站点、连接对象和复制
ServicesNTDS、KDC、Netlogon、W32Time 等服务检查服务和依赖项
SystemLog最近 60 分钟系统日志错误或警告判断事件是否与 AD 相关
MachineAccountDC 账户、UAC 标志、SPN 或引用检查计算机对象和 SPN
NCSecDesc命名上下文头部权限异常检查复制权限和 ACL
KnowsOfRoleHoldersDC 对 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 Advertising

failed test Advertising 只是分类结果;真正有价值的是前面的 DC Locator、服务或错误码信息。

/fix 不是“一键修复 DCDiag”:

Terminal window
# 先诊断,不要直接修
dcdiag /s:QYNET-CORE01 /test:MachineAccount /v
# 核对 DC 的 SPN
setspn -L QYNET-CORE01

只有确认 MachineAccount 测试发现可由 DCDiag 处理的 SPN 问题后,才评估 /fix。它不会修复 DNS、复制、SYSVOL、数据库或防火墙问题。

6.10 三个排障案例#

案例一:用户可以登录,但 GPO 没有应用#

Terminal window
# 1. 基础连通
dcdiag /e /test:Connectivity
# 2. DNS 与 DC 定位
dcdiag /e /test:DNS /DnsBasic /v
# 3. DC 是否正常发布
dcdiag /e /test:Advertising
# 4. SYSVOL、共享和 DFSR
dcdiag /e /test:SysVolCheck /test:NetLogons /test:DFSREvent
# 5. AD 复制
dcdiag /e /test:Replications
repadmin /replsummary

然后在客户端检查:

Terminal window
gpupdate /force
gpresult /Scope Computer /R
gpresult /Scope User /R

能够登录只说明至少有 DC 提供认证,不代表客户端访问到的 SYSVOL、GPO 版本和复制状态都正常。

案例二:同时出现多个看似无关的错误#

如果 Connectivity、Advertising、Replications、FSMOCheck 同时失败,先检查 DNS:

Terminal window
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 后重新测试:

Terminal window
Clear-DnsClientCache
dcdiag /s:QYNET-CORE01 /test:Connectivity
dcdiag /s:QYNET-CORE01 /test:DNS /DnsBasic /v
dcdiag /s:QYNET-CORE01 /test:Advertising

不要一次修改多个组件;按 Connectivity → DNS → Advertising 的顺序复测,更容易确认根因。

案例三:新 DC 已提升,但还不能稳定提供服务#

Terminal window
dcdiag /s:QYNET-CORE02 /test:Connectivity /v
dcdiag /s:QYNET-CORE02 /test:Advertising /v
dcdiag /s:QYNET-CORE02 /test:SysVolCheck /test:NetLogons
dcdiag /s:QYNET-CORE02 /test:Replications
repadmin /showrepl QYNET-CORE02

重点确认:

  1. DC 计算机对象和 NTDS Settings 对象已经复制。
  2. DNS 中存在 A、CNAME 和关键 SRV 记录。
  3. SYSVOL 初始化完成且 SysVolReady=1。
  4. SYSVOL 和 NETLOGON 共享可访问。
  5. Netlogon、KDC、NTDS、DNS 和 DFSR 服务正常。
  6. 新 DC 能与伙伴完成五个命名上下文的复制。

6.11 保存和筛选检查结果#

生成带时间戳的报告:

Terminal window
$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

快速提取问题:

Terminal window
Get-Content $reportPath |
Select-String -Pattern "failed test","error","warning" |
Select-Object LineNumber,Line
LineNumber Line
---------- ----
184 ......................... QYNET-CORE02 failed test Advertising

英文关键字筛选依赖系统输出语言,只适合辅助定位。最终仍应阅读失败测试前后的完整上下文。

比较修复前后的报告:

Terminal window
$before = Get-Content "C:\Temp\DCDiag\before.txt"
$after = Get-Content "C:\Temp\DCDiag\after.txt"
Compare-Object $before $after

日常检查可以先运行:

Terminal window
dcdiag /e /q
repadmin /replsummary
Get-ADReplicationFailure -Target * -Scope Forest

6.12 推荐检查顺序#

  1. dcdiag /test:Connectivity:确认 DNS、LDAP 和 RPC。
  2. dcdiag /test:DNS /DnsBasic /v:确认 DNS 客户端、区域和服务。
  3. dcdiag /test:Advertising:确认 DC Locator 能找到合适 DC。
  4. dcdiag /test:Replications:确认 AD 复制及时且无错误。
  5. dcdiag /test:SysVolCheck /test:NetLogons /test:DFSREvent:检查 SYSVOL。
  6. dcdiag /test:FSMOCheck:确认角色定位和可达性。
  7. 根据症状增加 Services、KccEvent、MachineAccount、NCSecDesc。
  8. 最后运行 dcdiag /e /q /c 做全局收尾。
  9. 修复后重复同一组测试,并保存前后报告。

先 Connectivity,再 DNS,然后 Advertising、Replication、SYSVOL,最后才是综合检查。DNS 挂了,后面的报错很可能只是连锁反应。

参考资料#


上一篇:Windows AD PowerShell(五):复制健康与 Repadmin

下一篇:Windows AD PowerShell(七):DNS、SPN 与 Kerberos 排障

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
Windows AD PowerShell(六):DCDiag 域控健康检查
https://springtsuki.xucjno.com/posts/springtsuki/notes/windowsad/powershell/921-dcdiag/
作者
SpringTsuki
发布于
2026-09-21
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
SpringTsuki
你好,我是浅月。
公告
浅月的开发小窝!欢迎你来到这里!
音乐
封面

音乐

暂未播放

0:000:00
暂无歌词
分类
标签
站点统计
文章
56
分类
9
标签
42
总字数
188,888
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.13.5
文章许可
CC BY-NC-SA 4.0

文章目录