在 Active Directory 中,Windows 时间服务非常重要。默认情况下,Kerberos 身份验证要求在纠正时区差异和夏令时时,域中所有机器上的时钟同步到彼此五分钟的差距内。时钟超出此范围的计算机无法进行身份验证,也无法访问域资源。
在 AD 域中,具有 PDC Emulator FSMO 角色的域控制器 (DC) 是整个域的主时间服务器。但是,这并不意味着域中的每个机器都直接与 PDC Emulator 同步其时钟。其他 DC 与 PDC Emulator 同步,而成员服务器和客户端可以与任何 DC 同步。在此层次结构中,PDC Emulator 应该是配置为与外部时间源(例如公用 NTP 服务器)同步的唯一机器。应将域中的其他一切配置为与 AD 同步。任何其他配置都可能导致时钟同步丢失。
有关 Windows 时间服务工作原理的详细信息,请参阅 此 TechNet 站点 。
确定问题范围
解决 Windows Time service 问题的第一步是确定受影响机器的数量。如果仅一台机器上的时间不正确,则修复问题的步骤与修复整个域范围的时间问题所需的步骤不同。
如果只有少数机器受到影响
- 如果受影响的机器正在运行 Windows Vista 或更高版本,请在命令提示符处运行 w32tm /query /source,以确定受影响机器的时间源。如果在 PDC Emulator 上运行此命令,则仅应列出外部时间源;否则,命令应输出域中 DC 的名称。
- w32tm /query /status 命令还显示了机器的时间源以及其他可能有用的信息。/Verbose 交换机提供了更多详细信息。与第一个命令一样,这些交换机仅在运行 Windows Vista 或更高版本的机器上可用。
- 如果列出了正确的时间源,则可以使用 w32tm /resync 尝试将机器时钟与时间源重新同步。将 /rediscover 交换机添加到此命令使计算机首先尝试发现网络时间源,然后尝试重新同步。
- 要更改机器的时间源,您可以使用以下两个命令之一:
w32tm /config /syncfromflags:DOMHIER /update 将机器配置为将域层级 (AD) 用作其时间源。
w32tm /config /syncfromflags:MANUAL /manualpeerlist:<list> /update 将机器配置为使用列表中>的时间服务器<作为其时间源。
提醒:如果在 <列表中>指定了多个时间服务器,则必须用空格分隔它们,并且整个列表必须用引号括起来。
如果整个域受到影响
- 如果该域中所有机器上的时间均不正确,则 PDC Emulator 可能是问题的根源。在 DC 上运行 netdom query fsmo 命令,以确定哪个 DC 拥有 PDC Emulator 角色。
- 在 PDC Emulator 上从命令提示符运行 w32tm /query /source,以确保将其配置为与外部时间源同步。PDC Emulator 不应被配置为与域同步,因为它是域的主时间源。
- 如果 PDC Emulator 是虚拟机 (VM),则禁用来宾-主机时钟同步。执行此操作的过程取决于虚拟主机上运行的操作系统。
- 要将 PDC Emulator 配置为与一个或多个外部时间服务器同步,请使用以下命令:
w32tm /config /syncfromflags:MANUAL /manualpeerlist:<list> /update
提醒:如果在 <列表中>指定了多个时间服务器,则必须用空格分隔它们,并且整个列表必须用引号括起来。
Windows Time service 注册表设置
上述步骤中指定的 w32tm 命令对 Windows 时间服务注册表值进行更改,这些值都位于以下注册表项下:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time
当然,可以手动设置这些值,而不是使用 w32tm 命令。如果您选择这样做,以下网站可能非常有用:
组政策
如果您使用 w32tm 命令或注册表更改 Windows 时间服务,但这些更改完全未生效,或只是生效一小段时间,然后又恢复到以前的值,则可能是组策略对象 (GPO) 覆盖了您的更改。Windows 时间服务的组策略设置包括可以使用注册表或 w32tm 命令配置的许多相同项目。这些设置可在以下位置找到:
Computer Configuration\Policies\Administrative Templates\System\Windows Time Service
将 Windows Time service 注册表值重置为默认设置
如果所有其他操作均失败,此过程会将 Windows 时间服务重置为其默认设置:
- 如果正在运行,打开服务控制台并停止 Windows Time service(或从命令提示符处运行 net stop w32time)。
- 打开升级的命令提示符,并运行 w32tm/unregister 以从注册表中删除 Windows Time service。服务控制台中不再列出该服务。
- 运行 w32tm/register,以使用其默认注册表设置重新创建服务。
- 进行任何必要的注册表更改,然后在服务控制台中或使用 net start w32time 命令启动 Windows Time service。