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

3343 字
17 分钟
Windows AD PowerShell(五):复制健康与 Repadmin

这是 Windows AD PowerShell 学习记录的第五节,主要整理 Active Directory 复制健康、repadmin 常用命令、复制方向、错误代码和安全同步方法。

本节通过 LDAP 对实验环境的复制拓扑进行了只读核对:QYNET-CORE01 与 QYNET-CORE02 位于同一站点,存在双向连接,并共同承载五个命名上下文。文中的时间、延迟和部分控制台输出用于展示健康输出格式;强制复制命令没有在 VM 上执行。

五、复制健康#

5.1 先理解复制方向与命名上下文#

当前实验环境中,两台 DC 都承载以下五个命名上下文(Naming Context,NC):

命名上下文作用
DC=qy,DC=net域分区,保存用户、组、计算机和 OU 等对象
CN=Configuration,DC=qy,DC=net配置分区,保存站点、服务和复制拓扑
CN=Schema,CN=Configuration,DC=qy,DC=net架构分区,定义对象类和属性
DC=DomainDnsZones,DC=qy,DC=net域范围的 AD 集成 DNS 分区
DC=ForestDnsZones,DC=qy,DC=net林范围的 AD 集成 DNS 分区

AD 复制主要采用拉取模型:目标 DC 主动从源 DC 获取变化。因此下面命令的顺序是:

repadmin /replicate <目标 DC> <源 DC> <命名上下文>

例如,让 QYNET-CORE01 从 QYNET-CORE02 拉取域分区:

Terminal window
repadmin /replicate QYNET-CORE01 QYNET-CORE02 "DC=qy,DC=net"

⚠️ 不要把源和目标写反:第一个 DC 是接收变化的目标,第二个 DC 才是提供变化的源。

查询 AD 中保存的复制连接对象:

Terminal window
Get-ADReplicationConnection -Filter * |
Select-Object Name,ReplicateFromDirectoryServer,
ReplicateToDirectoryServer,AutoGenerated
Name ReplicateFromDirectoryServer ReplicateToDirectoryServer AutoGenerated
---- ---------------------------- -------------------------- -------------
aead53d7-7693-4059-ad79-28d24f96f6ef QYNET-CORE02 QYNET-CORE01 True
5e711951-8cc1-4509-baf0-1dc8dd882474 QYNET-CORE01 QYNET-CORE02 True

AutoGenerated=True 表示连接通常由 KCC(Knowledge Consistency Checker)自动维护。除非正在处理经过验证的特殊拓扑问题,否则不应随意删除或手工替换 KCC 连接。

5.2 查看复制摘要#

Terminal window
repadmin /replsummary
Replication Summary Start Time: 2026-09-21 14:30:00
Beginning data collection for replication summary, this may take awhile:
.....
Source DSA largest delta fails/total %% error
QYNET-CORE01 04m:12s 0 / 5 0
QYNET-CORE02 03m:48s 0 / 5 0
Destination DSA largest delta fails/total %% error
QYNET-CORE01 03m:48s 0 / 5 0
QYNET-CORE02 04m:12s 0 / 5 0

关键列的含义:

列含义
Source DSA作为复制源时的 DC
Destination DSA作为复制目标时的 DC
largest delta距离最近一次成功复制最久的时间
fails/total失败次数与总尝试次数
%%失败比例
error最后阻塞复制的错误

健康环境最直观的特征是 fails/total 中失败数为 0。largest delta 则要结合站点链路复制计划判断:同站点通常较短,跨站点可能按计划间隔更长,不能只凭“几分钟”或“几十分钟”直接判定故障。

只显示存在错误的 DC:

Terminal window
repadmin /replsummary /errorsonly
Replication Summary Start Time: 2026-09-21 14:31:00
Beginning data collection for replication summary, this may take awhile:
.....
# 当前示例没有失败项,因此不会列出 Source DSA 或 Destination DSA

/errorsonly 适合快速巡检,但“没有输出”只表示摘要中没有发现失败,不代表 DNS、SYSVOL、时间或事件日志一定正常。

按失败百分比排序:

Terminal window
repadmin /replsummary /sort:percent

其他实用排序方式:

Terminal window
# 最久未成功复制的排在前面
repadmin /replsummary /sort:delta
# 按失败次数排序
repadmin /replsummary /sort:failures
# 同时显示源和目标摘要
repadmin /replsummary * /bysrc /bydest /sort:delta

5.3 查询某台 DC 的入站复制详情#

/showrepl 查看指定目标 DC 从哪些源 DC 接收复制,以及每个命名上下文最后一次复制结果。

Terminal window
repadmin /showrepl QYNET-CORE01
QYNET-CORE\QYNET-CORE01
DSA Options: IS_GC
Site Options: (none)
DSA object GUID: 86d68c88-4d39-4066-9bdb-5c3a59c3df03
==== INBOUND NEIGHBORS ======================================
DC=qy,DC=net
QYNET-CORE\QYNET-CORE02 via RPC
DSA object GUID: 2b0e1bb4-a1d5-4daa-9766-7c86d4c59dd3
Last attempt @ 2026-09-21 14:29:18 was successful.
CN=Configuration,DC=qy,DC=net
QYNET-CORE\QYNET-CORE02 via RPC
DSA object GUID: 2b0e1bb4-a1d5-4daa-9766-7c86d4c59dd3
Last attempt @ 2026-09-21 14:29:18 was successful.
CN=Schema,CN=Configuration,DC=qy,DC=net
QYNET-CORE\QYNET-CORE02 via RPC
DSA object GUID: 2b0e1bb4-a1d5-4daa-9766-7c86d4c59dd3
Last attempt @ 2026-09-21 14:29:18 was successful.
DC=DomainDnsZones,DC=qy,DC=net
QYNET-CORE\QYNET-CORE02 via RPC
Last attempt @ 2026-09-21 14:29:18 was successful.
DC=ForestDnsZones,DC=qy,DC=net
QYNET-CORE\QYNET-CORE02 via RPC
Last attempt @ 2026-09-21 14:29:18 was successful.

这里的标题是 INBOUND NEIGHBORS,所以查询 QYNET-CORE01 时看到的是“谁向 CORE01 提供变化”。当前源伙伴为 QYNET-CORE02。

反向检查另一台 DC:

Terminal window
repadmin /showrepl QYNET-CORE02

💡 DSA object GUID 标识 DC 的 NTDS Settings 对象;Invocation ID 标识该 DC 当前目录数据库实例。DC 从备份恢复等操作可能改变 Invocation ID,但 NTDS Settings 对象 GUID 通常保持不变。

5.4 详细模式与只看失败项#

Terminal window
repadmin /showrepl QYNET-CORE01 /verbose

/verbose 会额外显示地址、Invocation ID、USN、高水位线、复制标志和上次成功时间,适合进一步判断复制停在什么位置,但输出会明显变长。

只查看全林失败项:

Terminal window
repadmin /showrepl * /errorsonly
# 健康环境没有失败伙伴时,不会列出错误条目

同时显示连接对象和出站伙伴:

Terminal window
repadmin /showrepl QYNET-CORE01 /all

常用阅读顺序:

  1. 先看失败的是哪个命名上下文。
  2. 再看目标 DC 和源 DC 分别是谁。
  3. 查看 Last success 距今多久。
  4. 查看连续失败次数。
  5. 记录十进制和十六进制错误码。
  6. 根据错误码检查 DNS、RPC、Kerberos、时间或数据库状态。

5.5 导出 CSV 并筛选失败记录#

直接导出:

Terminal window
repadmin /showrepl * /csv > repl.csv
# 成功时默认无输出
Get-Item .\repl.csv |
Select-Object Name,Length,LastWriteTime
Name Length LastWriteTime
---- ------ -------------
repl.csv 3648 2026/9/21 14:40:22

在 Windows PowerShell 5.1 中,重定向符的默认编码可能不适合某些分析工具。希望明确使用 UTF-8 时可以写成:

Terminal window
repadmin /showrepl * /csv |
Set-Content -Path .\repl.csv -Encoding UTF8

导入 PowerShell 后先查看实际列名:

Terminal window
$repl = Import-Csv .\repl.csv
$repl[0].PSObject.Properties.Name
showrepl_COLUMNS
Destination DSA
Destination DSA Site
Source DSA
Source DSA Site
Naming Context
Number of Failures
Last Failure Status
Last Failure Time
Last Success Time

筛选失败记录:

Terminal window
$repl |
Where-Object {
[int]$_.'Number of Failures' -gt 0
} |
Select-Object 'Destination DSA',
'Source DSA',
'Naming Context',
'Number of Failures',
'Last Failure Status',
'Last Failure Time'

不同 Windows 语言和版本的 CSV 列名可能不同,因此不要在没查看表头时直接照抄字段名。

5.6 安全触发单个分区复制#

让 QYNET-CORE01 从 QYNET-CORE02 拉取域分区:

Terminal window
repadmin /replicate QYNET-CORE01 QYNET-CORE02 "DC=qy,DC=net"
Sync from QYNET-CORE02 to QYNET-CORE01 completed successfully.

反方向同步:

Terminal window
repadmin /replicate QYNET-CORE02 QYNET-CORE01 "DC=qy,DC=net"
Sync from QYNET-CORE01 to QYNET-CORE02 completed successfully.

再次强调参数顺序:

位置本例含义
第一个 DCQYNET-CORE02目标,接收变化
第二个 DCQYNET-CORE01源,提供变化
第三个参数DC=qy,DC=net要复制的命名上下文

如果源并不是目标在该命名上下文上的复制伙伴,可能返回错误 8452。遇到错误时先检查 repadmin /showrepl 和连接拓扑,不要立刻添加 /force。

⚠️ /force 会覆盖已禁用连接等保护,并允许对某些异常伙伴发起复制;怀疑 USN rollback、数据库损坏或复制分歧时尤其不能盲目使用。

5.7 同步全部命名上下文#

同步当前 DC 承载的所有命名上下文:

Terminal window
repadmin /syncall QYNET-CORE01 /AdP

跨站点同步:

Terminal window
repadmin /syncall QYNET-CORE01 /AdeP

参数必须区分大小写,尤其是 /A 与 /a:

参数含义
/A同步指定 DC 承载的所有命名上下文(All)
/a任意服务器不可用时中止操作(Abort)
/d在回调消息中用 DN 标识服务器
/e扩展到企业内所有站点,执行跨站点同步
/PPush 模式,把变化从指定 DC 向外推送
/q安静模式,减少回调消息
/Q极安静模式,仅显示严重错误

⚠️ 不要把小写 /a 当成“All”。同步所有命名上下文的是大写 /A;小写 /a 表示遇到不可用服务器就中止。

健康输出的关键部分类似:

CALLBACK MESSAGE: The following replication is in progress:
From: CN=NTDS Settings,CN=QYNET-CORE01,...
To : CN=NTDS Settings,CN=QYNET-CORE02,...
CALLBACK MESSAGE: The following replication completed successfully:
From: CN=NTDS Settings,CN=QYNET-CORE01,...
To : CN=NTDS Settings,CN=QYNET-CORE02,...
SyncAll terminated with no errors.

/e 会让复制跨站点传播。单站点环境影响有限,但多站点环境可能在短时间内占用大量 WAN 带宽。只想处理本站点时,去掉 /e。

/P 会将方向改为从当前 DC 向外推送。日常修复通常应先明确哪台 DC 拥有需要传播的变化,再决定是否需要 Push,而不是把 /AdeP 当作固定口诀无脑执行。

5.8 PowerShell 的复制查询命令#

查看复制伙伴元数据:

Terminal window
Get-ADReplicationPartnerMetadata -Target * -Scope Forest |
Select-Object Server,
Partner,
Partition,
LastReplicationAttempt,
LastReplicationSuccess,
LastReplicationResult |
Sort-Object Server,Partition
Server : QYNET-CORE01.qy.net
Partner : QYNET-CORE02.qy.net
Partition : DC=qy,DC=net
LastReplicationAttempt : 2026/9/21 14:29:18
LastReplicationSuccess : 2026/9/21 14:29:18
LastReplicationResult : 0

LastReplicationResult=0 表示最后一次复制成功。

只查看失败:

Terminal window
Get-ADReplicationFailure -Target * -Scope Forest |
Select-Object Server,
FirstFailureTime,
FailureCount,
LastError
# 当前没有失败对象时,无输出

查看 Up-to-Dateness Vector:

Terminal window
Get-ADReplicationUpToDatenessVectorTable -Target QYNET-CORE01 |
Sort-Object Partner |
Select-Object Partner,UsnFilter,LastReplicationSuccess

UTD Vector 记录目标 DC 已经从各源 DC 看到的最高更新序列,用于避免重复应用更新。它适合深入分析复制进度,但日常巡检仍应先看 replsummary、showrepl 和错误日志。

只同步一个对象,而不是整个分区:

Terminal window
$user = Get-ADUser -Identity qianyue -Server QYNET-CORE01
Sync-ADObject -Object $user.DistinguishedName -Source QYNET-CORE01 -Destination QYNET-CORE02
# 成功时默认无输出
Get-ADUser -Identity qianyue -Server QYNET-CORE02 |
Select-Object Name,DistinguishedName
Name DistinguishedName
---- -----------------
浅月 CN=浅月,OU=User,OU=Admin,OU=Organization,DC=qy,DC=net

Sync-ADObject 适合明确知道单个对象需要立即传播的场景,不能替代复制健康修复。

5.9 常见复制错误码#

错误常见含义优先检查
1722 / 0x6baRPC Server UnavailableDNS、135 端口、动态 RPC、防火墙、服务
1256 / 0x4e8远程系统不可用通常是前一个连接错误带出的次级错误
8452 / 0x2104命名上下文正在删除或源不是有效伙伴拓扑、分区状态、命令方向
8453 / 0x2105Replication Access Was Denied安全通道、权限、DC 账户
8524 / 0x214cDNS lookup failureAD DNS、SRV、A/AAAA、CNAME 记录
-2146893022 / 0x80090322The target principal name is incorrectSPN、机器账户密码、Kerberos、安全通道
8606 / 0x219e对象属性不足,常与 lingering object 有关事件 1988、对象一致性、墓碑
8614 / 0x21a6超过 tombstone lifetime 未复制长期离线 DC、严格复制一致性

不要只根据错误码直接执行修复命令。正确顺序通常是:

  1. 确认源、目标、命名上下文和复制方向。
  2. 检查两边时间与 DNS。
  3. 测试 RPC Endpoint Mapper 与必要动态 RPC 端口。
  4. 查看 repadmin /showrepl 的首次错误,而不是只看 1256。
  5. 检查 Directory Service、DNS Server、System 和 DFS Replication 日志。
  6. 修复根因后,再用单分区 /replicate 验证。
  7. 最后才考虑 /syncall,不要用全量同步掩盖故障。

查询近期目录服务错误:

Terminal window
Get-WinEvent -FilterHashtable @{
LogName = "Directory Service"
Level = 2
StartTime = (Get-Date).AddHours(-24)
} |
Select-Object TimeCreated,Id,LevelDisplayName,Message |
Format-List

查看常见复制事件:

Terminal window
$eventIds = 1311,1566,1865,1925,1988,2042,2087,2088
Get-WinEvent -FilterHashtable @{
LogName = "Directory Service"
Id = $eventIds
} -MaxEvents 30 |
Select-Object TimeCreated,Id,Message

5.10 排障案例#

案例一:CORE01 创建用户后,CORE02 查询不到#

先分别指定 DC 查询:

Terminal window
Get-ADUser -Identity qianyue -Server QYNET-CORE01
DistinguishedName : CN=浅月,OU=User,OU=Admin,OU=Organization,DC=qy,DC=net
Enabled : True
Name : 浅月
SamAccountName : qianyue
Get-ADUser -Identity qianyue -Server QYNET-CORE02
Get-ADUser : Cannot find an object with identity: 'qianyue'

查看目标 DC 的入站复制。因为对象需要到达 CORE02,所以目标是 CORE02:

Terminal window
repadmin /showrepl QYNET-CORE02 /errorsonly

修复 DNS、RPC 或安全通道等根因后,让 CORE02 从 CORE01 拉取域分区:

Terminal window
repadmin /replicate QYNET-CORE02 QYNET-CORE01 "DC=qy,DC=net"
Sync from QYNET-CORE01 to QYNET-CORE02 completed successfully.

最后重新指定 CORE02 验证:

Terminal window
Get-ADUser -Identity qianyue -Server QYNET-CORE02 |
Select-Object Name,SamAccountName,DistinguishedName
Name SamAccountName DistinguishedName
---- -------------- -----------------
浅月 qianyue CN=浅月,OU=User,OU=Admin,OU=Organization,DC=qy,DC=net

案例二:复制摘要正常,但怀疑仍有积压#

查看等待执行的入站复制队列:

Terminal window
repadmin /queue QYNET-CORE01
Queue contains 0 items.

查看目标 DC 对伙伴更新的认知:

Terminal window
repadmin /showutdvec QYNET-CORE01 "DC=qy,DC=net" /latency

比较两台 DC 的对象属性和复制元数据:

Terminal window
repadmin /showobjmeta QYNET-CORE01 "CN=浅月,OU=User,OU=Admin,OU=Organization,DC=qy,DC=net"
repadmin /showobjmeta QYNET-CORE02 "CN=浅月,OU=User,OU=Admin,OU=Organization,DC=qy,DC=net"

/showobjmeta 可以看到每个属性的版本号、原始写入 DC、时间戳和 USN,适合判断“对象存在,但某个属性为什么不一致”。

案例三:DNS 故障修复后验证复制#

Terminal window
# 检查 DC 定位记录
Resolve-DnsName -Type SRV "_ldap._tcp.dc._msdcs.qy.net"
# 检查两台 DC 的主机名
Resolve-DnsName QYNET-CORE01.qy.net
Resolve-DnsName QYNET-CORE02.qy.net
# 检查 RPC 和 LDAP
Test-NetConnection QYNET-CORE02.qy.net -Port 135
Test-NetConnection QYNET-CORE02.qy.net -Port 389
# 先验证一个分区
repadmin /replicate QYNET-CORE01 QYNET-CORE02 "DC=qy,DC=net"
# 再重新查看摘要
repadmin /replsummary

这种“修复根因 → 单分区验证 → 全局复查”的顺序,比一上来运行 /syncall /AdeP 更容易判断问题是否真的解决。

5.11 安全使用强制同步#

以下情况下可以考虑手动同步:

  • 修复 DNS、RPC、时间或防火墙后验证结果。
  • 变更窗口中需要立即传播一个明确的对象。
  • 新增 DC 后验证某个命名上下文。
  • 计划维护前确认两台 DC 已同步。

以下情况下不应直接强推:

  • 怀疑 USN rollback。
  • 发现 lingering object 或事件 1988、2042。
  • 某台 DC 离线超过 tombstone lifetime。
  • 目录数据库损坏。
  • 尚未确定正确源 DC。
  • 多站点 WAN 链路处于拥塞状态。

执行前最少应收集:

Terminal window
repadmin /replsummary
repadmin /showrepl * /errorsonly
dcdiag /e /test:Connectivity /test:Replications
w32tm /monitor /domain:qy.net

执行后验证:

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

5.12 本节巡检顺序#

  1. repadmin /replsummary:判断全局是否存在失败和最大延迟。
  2. repadmin /replsummary /errorsonly:快速聚焦失败 DC。
  3. repadmin /showrepl <目标 DC>:定位失败的源、目标和命名上下文。
  4. 记录第一条真正错误和错误码,不要只追次级错误 1256。
  5. 检查 DNS、时间、RPC、Kerberos、安全通道和事件日志。
  6. 修复根因后,用 /replicate 验证单个分区。
  7. 只有明确理解影响后,才使用 /syncall。
  8. 再次运行摘要、详情和 PowerShell 复制失败查询。
  9. 将结果导出 CSV,保留故障前后证据。

复制排障最重要的三个概念是:目标从源拉取、每个命名上下文独立复制、强制同步不能替代根因修复。

参考资料#


上一篇:Windows AD PowerShell(四):域控与 FSMO

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

支持与分享

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

打赏
Windows AD PowerShell(五):复制健康与 Repadmin
https://springtsuki.xucjno.com/posts/springtsuki/notes/windowsad/powershell/921-repadmin/
作者
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

文章目录