Windows AD PowerShell(九):时间同步

4665 字
23 分钟
Windows AD PowerShell(九):时间同步

这是 Windows AD PowerShell 学习记录的第九节,主要整理 AD 的时间层级、PDC Emulator 的外部时间源配置、w32tm 常用命令,以及 Kerberos 时间偏差的排查方法。

2026 年 9 月 22 日,本节通过 VMware Tools 在 QYNET-CORE01 上进行了只读实机核验。结果确认它是林根域 PDC Emulator,但当前没有配置外部 NTP,实际时间源为 Local CMOS Clock;QYNET-CORE02 在 w32tm /monitor 中没有响应。

文中标注“实机输出”的内容来自本次 VM。配置外部 NTP、重启服务、强制同步和恢复域层级等会改变状态的命令只作教学展示,本次均未执行。

九、时间同步#

9.1 为什么 AD 对时间如此敏感#

Kerberos 使用时间戳抵御重放攻击,因此参与认证的客户端、KDC 和目标服务必须保持时间接近。默认域策略中,“计算机时钟同步的最大容差”通常为 5 分钟;超过有效策略允许的偏差时,Kerberos 认证可能被拒绝。

⚠️ “5 分钟”是默认策略值,不是写死在所有环境中的常量。 管理员可以通过域策略修改它,因此排障时应检查实际生效策略;但不建议通过放宽容差长期掩盖时间源故障。

时间异常可能表现为:

  • 域用户突然无法登录或访问共享。
  • Kerberos 出现 KRB_AP_ERR_SKEW。
  • klist get 申请服务票据失败。
  • GPO、计划任务、证书验证或安全日志时间异常。
  • 多台服务器的事件顺序无法对应,增加复制和认证排障难度。

检查当前 Kerberos 时间容差策略:

Terminal window
secedit /export /cfg "$env:TEMP\secpol.cfg" | Out-Null
Select-String `
-Path "$env:TEMP\secpol.cfg" `
-Pattern "MaxClockSkew"
C:\Users\qianyue\AppData\Local\Temp\secpol.cfg:42:MaxClockSkew = 5

也可以生成组策略结果报告,确认设置来自哪个 GPO:

Terminal window
gpresult /scope computer /h "$env:TEMP\gpresult-time.html"
INFO: The computer policy report was saved to C:\Users\qianyue\AppData\Local\Temp\gpresult-time.html

策略路径为:

计算机配置
└─ Windows 设置
└─ 安全设置
└─ 账户策略
└─ Kerberos 策略
└─ 计算机时钟同步的最大容差

9.2 域内时间同步层级#

Active Directory 默认使用域层级同步时间,而不是让每台计算机都直接访问公网 NTP。

可靠的外部 NTP / 内部硬件时钟
↓
林根域 PDC Emulator
↓
各子域 PDC Emulator / 其他域控制器
↓
成员服务器与客户端

更准确地说:

  1. 林根域的 PDC Emulator 位于整个林默认时间层级的顶端,应同步到可靠的外部或组织内部权威时间源。
  2. 子域 PDC Emulator 沿父域层级寻找时间源,不应各自随意配置公网 NTP。
  3. 其他 DC 按域层级选择合适的 DC 作为时间源。
  4. 成员服务器和客户端通常从其认证 DC 或域层级中的 DC 同步。
  5. 工作组计算机没有 AD 时间层级,需要单独配置时间源。

域成员常见的同步类型为 NT5DS,表示从 AD 域层级获取时间;手工指定 NTP 时通常为 NTP。

💡 只在林根域 PDC Emulator 上配置外部时间源。 如果 FSMO 角色发生正常转移或强制夺取,应及时检查新 PDC 的时间配置,避免旧 PDC 仍对外授时,而新 PDC 退回本地硬件时钟。

PDC Emulator 与 FSMO 的查询方法见第四篇:域控与 FSMO。

9.3 先确认林根域 PDC Emulator#

当前域的 PDC Emulator,以下为实机输出:

Terminal window
Get-ADDomain |
Select-Object DNSRoot,PDCEmulator
DNSRoot PDCEmulator
------- -----------
qy.net QYNET-CORE01.qy.net

同时确认当前域是否为林根域:

Terminal window
$domain = Get-ADDomain
$forest = Get-ADForest
[pscustomobject]@{
CurrentDomain = $domain.DNSRoot
ForestRoot = $forest.RootDomain
PDCEmulator = $domain.PDCEmulator
IsForestRoot = $domain.DNSRoot -eq $forest.RootDomain
}
CurrentDomain : qy.net
ForestRoot : qy.net
PDCEmulator : QYNET-CORE01.qy.net
IsForestRoot : True

只有 IsForestRoot 为 True,并且目标服务器正是该域的 PDCEmulator 时,才属于默认应配置外部时间源的服务器。

在本机确认是否持有 PDC Emulator:

Terminal window
$pdc = (Get-ADDomain).PDCEmulator
$localFqdn = "{0}.{1}" -f $env:COMPUTERNAME,(Get-ADDomain).DNSRoot
[pscustomobject]@{
LocalComputer = $localFqdn
PDCEmulator = $pdc
IsPDC = $localFqdn -ieq $pdc
}
LocalComputer : QYNET-CORE01.qy.net
PDCEmulator : QYNET-CORE01.qy.net
IsPDC : True

9.4 查询当前时间源与同步状态#

查看当前时间源,实机结果为本地硬件时钟:

Terminal window
w32tm /query /source
Local CMOS Clock

QYNET-CORE01 是林根域 PDC Emulator,此结果说明它尚未配置有效的外部时间源。成员机或非 PDC 域控通常应沿域层级显示某台 DC,例如下面的教学示例:

Terminal window
w32tm /query /source
QYNET-CORE01.qy.net

以下输出需要重点警惕:

输出常见含义
Local CMOS Clock当前使用本机硬件时钟,域成员或林根 PDC 通常需要继续检查
Free-running System Clock没有有效同步源,系统时钟自行运行
VM IC Time Synchronization Provider正从虚拟化宿主机同步,需要确认是否符合 DC 的时间设计
DC 的 FQDN正沿域层级同步,成员机和非根 PDC 通常正常
外部 NTP 名称林根域 PDC 上通常正常;普通域成员上应核对是否误配

查看详细状态:

Terminal window
w32tm /query /status
Leap 指示符: 0(无警告)
层次: 1 (主引用 - 与无线电时钟同步)
精度: -6 (每刻度 15.625ms)
根延迟: 0.0000000s
根分散: 10.0000000s
引用 ID: 0x4C4F434C (源名称: "LOCL")
上次成功同步时间: 2026/9/22 15:10:25
源: Local CMOS Clock
轮询间隔: 6 (64s)

这里的 Stratum: 1 不代表已经连接高精度外部时钟;ReferenceId 为 LOCL,再次证明当前使用的是本地时钟。

常用字段:

字段含义排查重点
Leap Indicator时间源告警状态3 通常表示未同步
Stratum当前时间源层级数值异常或为 0 时继续核查
Last Successful Sync Time最近成功同步时间是否长时间没有更新
Source当前实际时间源是否符合域时间设计
Poll Interval轮询间隔是否与策略和预期一致

w32tm /query /source 显示的是当前实际选择的源,/query /configuration 显示的是配置。两者都要看:配置了某个 NTP,不代表它当前一定同步成功。

9.5 查询完整配置与对等时间源#

Terminal window
w32tm /query /configuration
[配置]
EventLogFlags: 2 (本地)
AnnounceFlags: 10 (本地)
TimeJumpAuditOffset: 28800 (本地)
MinPollInterval: 6 (本地)
MaxPollInterval: 10 (本地)
MaxNegPhaseCorrection: 172800 (本地)
MaxPosPhaseCorrection: 172800 (本地)
MaxAllowedPhaseOffset: 300 (本地)
[TimeProviders]
NtpClient (本地)
DllName: C:\Windows\system32\w32time.dll (本地)
Enabled: 1 (本地)
InputProvider: 1 (本地)
SpecialPollInterval: 3600 (本地)
Type: NT5DS (本地)
NtpServer (本地)
DllName: C:\Windows\system32\w32time.dll (本地)
Enabled: 1 (本地)
InputProvider: 0 (本地)
VMICTimeProvider (本地)
DllName: C:\Windows\System32\vmictimeprovider.dll (本地)
Enabled: 1 (本地)
InputProvider: 1 (本地)

实机配置中的 Type: NT5DS 表示它仍尝试沿域层级找时间源。然而它本身就是林根域 PDC,域层级上方没有其他服务器,因此最终使用 Local CMOS Clock。

关注配置值右侧的来源;不同系统语言会显示为 (Local) / (Policy) 或 (本地) / (策略):

  • (Local) / (本地):来自本地配置。
  • (Policy) / (策略):来自组策略,手工修改后可能再次被 GPO 覆盖。

查看已配置的时间对等点及状态:

Terminal window
w32tm /query /peers
#对等数: 1
对等:
状态: 挂起
剩余时间: 792.4958760s
模式: 0 (保留)
层次: 0 (未指定)
对等机轮询间隔: 0 (未指定)
主机轮询间隔: 0 (未指定)

这里虽然显示“对等数 1”,却没有对等服务器名称,状态也是“挂起”,不能据此认为已配置可用 NTP。

0x8 表示以 NTP Client 模式向目标发起请求,适合大多数外部 NTP 服务。

常见标志可以组合:

标志含义
0x1使用 SpecialPollInterval 指定的特殊轮询间隔
0x2只作为备用时间源
0x4Symmetric Active 模式
0x8Client 模式

例如 0x9 等于 0x8 + 0x1,表示 Client 模式并使用特殊轮询间隔。

9.6 测量时间偏差#

使用 stripchart 连续比较本机与目标时间源。本次实机无法解析 ntp.aliyun.com:

Terminal window
w32tm /stripchart /computer:ntp.aliyun.com /samples:5 /dataonly
发生下列错误: 这是在主机名解析时通常出现的暂时错误,
它意味着本地服务器没有从权威服务器上收到响应。 (0x80072AFA)

结合前面的配置查询,可以确认当前没有外部 NTP;而这次失败还说明,在正式配置前必须先处理外部 DNS 解析,或改用组织内部可解析的权威时间源。

正值或负值表示两台计算机时钟的相对偏差方向,重点关注绝对值是否持续增大或接近策略容差。

比较客户端与域控:

Terminal window
w32tm /stripchart /computer:QYNET-CORE01.qy.net /samples:5 /dataonly
正在跟踪 QYNET-CORE01.qy.net [[fe80::dd1b:2adc:aa3b:ad0c%4]:123]。
正在收集 5 示例。
当前时间是 2026/9/22 15:12:27。
15:12:27, +00.0000259s
15:12:29, +00.0002162s
15:12:31, +00.0002297s
15:12:33, +00.0000817s
15:12:35, +00.0000961s

这是 PDC 与自身的比较,只能证明本机 NTP 服务能够响应,不能证明它已经同步到外部权威源。

检查域内所有 DC:

Terminal window
w32tm /monitor /domain:qy.net
QYNET-CORE01.qy.net *** PDC *** [[fe80::dd1b:2adc:aa3b:ad0c%4]:123]:
ICMP: 0ms 延迟
NTP: +0.0000000s 偏移起点 QYNET-CORE01.qy.net
RefID: 'LOCL' [0x4C434F4C]
层次: 1
QYNET-CORE02.qy.net [192.168.254.11:123]:
ICMP: 错误 IP_REQ_TIMED_OUT - 没有响应 1000ms
NTP: 错误 ERROR_TIMEOUT - 1000ms 内服务器没有响应

实机结果记录了两个现象:QYNET-CORE01 的 RefID 是 LOCL,与尚未配置外部 NTP 的现状一致;QYNET-CORE02 的 ICMP 和 NTP 均超时。后者应在 CORE02 开机并可达时,再判断是否需要检查 W32Time 服务、防火墙和 UDP 123。

/monitor 不会自动以颜色标出故障,需要管理员自己检查错误文字、偏差、Stratum 和 RefID。

9.7 触发重新同步#

以下命令会触发时间同步,本次仅保留操作格式,没有在 VM 上执行:

标准的立即重新同步命令:

Terminal window
w32tm /resync
Sending resync command to local computer
The command completed successfully.

如果怀疑网络或时间源发现缓存异常,可以重新发现时间源后再同步:

Terminal window
w32tm /resync /rediscover
Sending resync command to local computer
The command completed successfully.

⚠️ w32tm /resync /force 不是 Windows w32tm 文档中的标准语法。 常用有效参数包括 /nowait、/rediscover 和 /soft。想重新发现域时间源时使用 /rediscover,不要把其他工具的 force 参数套到 w32tm 上。

“命令成功”只表示 W32Time 接受并完成了同步请求,仍应再次验证:

Terminal window
w32tm /query /source
w32tm /query /status

常见失败:

Terminal window
w32tm /resync /rediscover
Sending resync command to local computer
The computer did not resync because no time data was available.

此时反复执行 /resync 没有意义,应检查:

  1. DNS 是否能解析时间源。
  2. UDP 123 是否可达。
  3. Windows Time 服务是否正在运行。
  4. Type、NtpServer 和组策略配置是否正确。
  5. 时间源本身是否响应 NTP。
  6. 当前偏差是否超过允许自动修正的范围。

9.8 在林根域 PDC 配置外部 NTP#

本节是后续配置方案,本次没有执行。当前实机仍使用 Local CMOS Clock。

先确认角色和原配置,并记录变更前状态:

Terminal window
Get-ADDomain | Select-Object DNSRoot,PDCEmulator
w32tm /query /source
w32tm /query /configuration
w32tm /query /peers

确认当前服务器是林根域 PDC Emulator 后,以管理员身份执行:

Terminal window
w32tm /config `
/syncfromflags:manual `
/manualpeerlist:"ntp.aliyun.com,0x8" `
/reliable:yes `
/update
The command completed successfully.
Restart-Service W32Time
w32tm /resync /rediscover
Sending resync command to local computer
The command completed successfully.

/reliable:yes 将本机标记为域内可靠时间源,只应在承担该职责的服务器上使用。公网 NTP 数据本身通常不经过 AD 身份验证;生产环境应依据组织安全要求选择内部权威时钟、硬件源或可信的多个上游。

为避免单点依赖,可以配置多个经过验证的时间源:

Terminal window
w32tm /config `
/syncfromflags:manual `
/manualpeerlist:"ntp1.example.net,0x8 ntp2.example.net,0x8" `
/reliable:yes `
/update
Restart-Service W32Time
w32tm /resync /rediscover

上面的 example.net 仅表示格式,不能直接作为生产时间源。应替换为组织批准且可从 PDC 访问的服务器。

配置完成后的预期验证格式如下;这不是当前 VM 的实机结果:

Terminal window
w32tm /query /source
ntp.aliyun.com,0x8
w32tm /query /peers
#Peers: 1
Peer: ntp.aliyun.com,0x8
State: Active
w32tm /query /status
Leap Indicator: 0(no warning)
Last Successful Sync Time: 9/22/2026 14:31:02
Source: ntp.aliyun.com,0x8

为什么不使用 net stop w32time && net start w32time#

&& 是传统 CMD 和 PowerShell 7 支持的条件连接符,但 Windows Server 2016 默认的 Windows PowerShell 5.1 不支持该语法。笔记中的命令应能直接在 Windows PowerShell 5.1 执行:

Terminal window
Restart-Service W32Time

如果在 CMD 中执行,也可以分两行:

net stop w32time
net start w32time

9.9 让普通域成员恢复域层级同步#

以下为恢复配置示例,本次没有在任何 DC 或成员机上执行:

如果成员机或非林根 PDC 曾被手工配置为公网 NTP,应恢复 NT5DS 域层级:

Terminal window
w32tm /config `
/syncfromflags:domhier `
/reliable:no `
/update
The command completed successfully.
Restart-Service W32Time
w32tm /resync /rediscover
Sending resync command to local computer
The command completed successfully.

验证配置与当前源:

Terminal window
w32tm /query /configuration | Select-String "Type:"
Type: NT5DS (Local)
w32tm /query /source
QYNET-CORE01.qy.net

如果输出仍显示原来的公网 NTP,应检查是否有 GPO 持续下发配置:

Terminal window
w32tm /query /configuration | Select-String "Type:|NtpServer:"
Type: NTP (Policy)
NtpServer: ntp.example.net,0x8 (Policy)

出现 (Policy) 时,应修改对应 GPO,而不是反复修改本地设置。

9.10 检查 Windows Time 服务与事件日志#

Terminal window
Get-Service W32Time
Status Name DisplayName
------ ---- -----------
Running W32Time Windows Time

以上为 QYNET-CORE01 的实机结果,服务启动类型为 Automatic。

如果服务停止:

Terminal window
Start-Service W32Time
Get-Service W32Time
Status Name DisplayName
------ ---- -----------
Running W32Time Windows Time

查看最近 24 小时的 Time-Service 警告和错误:

Terminal window
$startTime = (Get-Date).AddDays(-1)
Get-WinEvent -FilterHashtable @{
LogName = "System"
ProviderName = "Microsoft-Windows-Time-Service"
StartTime = $startTime
} |
Where-Object LevelDisplayName -In "Warning","Error" |
Select-Object TimeCreated,Id,LevelDisplayName,Message
TimeCreated Id LevelDisplayName Message
----------- -- ---------------- -------
2026/9/22 15:10:34 12 Warning 时间提供程序 NtpClient: 此机器配置为用域层级确定它的时间源,
但它已经是在林的根目录域的 AD PDC 仿真,因此在域层级
没有机器在它上面以用作时间源……

这是实机日志。相同的 Event ID 12 在 9 月 20 日、21 日和 22 日均有记录,说明这不是一次性启动抖动,而是当前持续存在的“林根域 PDC 尚未配置外部上游”状态。

实机还记录了时间服务开始播发的信息事件:

Terminal window
Get-WinEvent -FilterHashtable @{
LogName = "System"
ProviderName = "Microsoft-Windows-Time-Service"
StartTime = $startTime
} |
Select-Object -First 20 TimeCreated,Id,LevelDisplayName,Message
TimeCreated Id LevelDisplayName Message
----------- -- ---------------- -------
2026/9/22 15:10:25 143 Information 时间服务已开始作为良好的时间源播发。
2026/9/22 15:10:25 139 Information 时间服务已开始作为时间源播发。

“正在播发时间”不等于“已经同步外部权威时间”。当前 PDC 正把自己的本地 CMOS 时间作为域内来源发布,因此必须把事件日志与 /query /source、RefID 一起判断。

事件 ID 在不同版本和场景中含义可能不同,应结合完整消息、当前配置与状态判断,不要只凭编号下结论。

9.11 网络与虚拟化注意事项#

本节为排障说明,没有修改 VM 的虚拟化时间集成设置或防火墙。

Windows Time 使用 NTP,通常需要 UDP 123。Test-NetConnection -Port 测试的是 TCP,不能用下面这种命令证明 NTP 可用:

Terminal window
# 这只能测试 TCP 123,不等于 NTP 的 UDP 123
Test-NetConnection ntp.aliyun.com -Port 123

更直接的应用层验证是观察:

Terminal window
w32tm /stripchart /computer:ntp.aliyun.com /samples:5 /dataonly
w32tm /query /peers
w32tm /resync

如果这些命令没有时间数据,再检查主机防火墙、出口 ACL、NAT 和上游 NTP 服务。

虚拟化 DC 还要防止宿主机时间与 AD 时间层级相互竞争:

Terminal window
w32tm /query /source
VM IC Time Synchronization Provider

若 DC 长期显示虚拟化时间提供程序,应核对 Hyper-V、VMware 或其他平台的来宾时间同步策略。尤其是林根域 PDC,应按设计从权威上游获取时间,避免宿主机错误时间传播到整个域。调整虚拟化集成服务前,应确认平台版本、备份恢复机制和厂商建议。

9.12 三个典型故障案例#

除特别注明外,以下是教学案例,不代表此次 VM 的实际状态。

案例一:所有域用户突然出现认证失败#

先比较客户端与 DC:

Terminal window
Get-Date
Tuesday, September 22, 2026 3:08:42 PM
w32tm /stripchart /computer:QYNET-CORE01.qy.net /samples:3 /dataonly
Tracking QYNET-CORE01.qy.net [10.0.0.10:123].
15:08:43, +00:07:12.4210874s
15:08:45, +00:07:12.4209221s
15:08:47, +00:07:12.4211058s

偏差已超过默认五分钟容差,应先查客户端与 DC 的时间源。如果多台设备同时异常,继续向上检查 PDC 与其外部源,而不是逐台重置用户密码。

Terminal window
w32tm /query /source
w32tm /query /status
$pdc = (Get-ADDomain).PDCEmulator
Invoke-Command -ComputerName $pdc -ScriptBlock {
w32tm /query /source
w32tm /query /status
}

案例二:成员机总是改回错误的公网 NTP#

Terminal window
w32tm /query /configuration | Select-String "Type:|NtpServer:"
Type: NTP (Policy)
NtpServer: old-ntp.example.net,0x8 (Policy)

(Policy) 说明设置由组策略控制。应使用 gpresult 找到来源 GPO,并在策略中修复;本地执行 /config /syncfromflags:domhier 只会暂时改变状态或直接被策略覆盖。

案例三:迁移 PDC 后新 PDC 使用本地硬件时钟#

Terminal window
Get-ADDomain | Select-Object PDCEmulator
PDCEmulator
-----------
QYNET-CORE02.qy.net
Invoke-Command -ComputerName QYNET-CORE02 -ScriptBlock {
w32tm /query /source
}
Local CMOS Clock

FSMO 角色已经迁移,但新 PDC 没有可靠上游。应在新 PDC 上配置经过批准的时间源并验证,再把旧 PDC 恢复为域层级同步,避免形成两个“权威”源。

9.13 推荐排查顺序#

  1. Get-Date:确认肉眼可见的日期、时区和时间是否异常。
  2. Get-ADDomain / Get-ADForest:确认林根域与当前 PDC Emulator。
  3. w32tm /query /source:确认当前实际时间源。
  4. w32tm /query /status:确认最近成功同步时间和状态。
  5. w32tm /query /configuration:区分本地配置与组策略。
  6. w32tm /query /peers:确认配置的上游是否 Active。
  7. w32tm /stripchart:测量与 DC 或上游源的实际偏差。
  8. w32tm /monitor /domain:<域>:比较所有 DC 的偏差和 RefID。
  9. 检查 W32Time 服务、System 日志、DNS 与 UDP 123。
  10. 修复根因后使用 w32tm /resync /rediscover,再重复查询验证。
  11. 如果修改了林根 PDC 配置,再从非 PDC DC 和普通客户端逐层验证。

域时间排障应沿着“客户端 → 本域 DC → 域 PDC → 父域 → 林根域 PDC → 权威上游”逐层追踪。只有林根域 PDC 应默认直接配置外部时间源。

9.14 常用命令速查#

命令作用
w32tm /query /source查看当前实际时间源
w32tm /query /status查看当前同步状态
w32tm /query /configuration查看完整配置及配置来源
w32tm /query /peers查看手工配置的时间对等点
w32tm /stripchart /computer:<目标>连续测量与目标的时间偏差
w32tm /monitor /domain:<域>查看域内 DC 的时间状态
w32tm /resync请求立即重新同步
w32tm /resync /rediscover重新发现时间源并同步
w32tm /config /syncfromflags:domhier /update恢复 AD 域层级同步
Restart-Service W32Time在 PowerShell 中重启 Windows Time 服务

参考资料#


上一篇:Windows AD PowerShell(八):Kerberos 与票据

下一篇:Windows AD PowerShell(十):事件日志

支持与分享

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

打赏
Windows AD PowerShell(九):时间同步
https://springtsuki.xucjno.com/posts/springtsuki/notes/windowsad/powershell/922-time/
作者
SpringTsuki
发布于
2026-09-22
许可协议
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

文章目录