【问题标题】:Windows Server Time Incorrect After Updates/Reboot更新/重启后 Windows Server 时间不正确
【发布时间】:2017-12-03 22:18:08
【问题描述】:

我们正在运行 Windows Server 2012 R2。我发现当服务器安装更新并重新启动(每天凌晨 4 点)时,它将在不正确的时区重新启动。我们的时间大小是 EST -5(当前为 -4 夏令时),服务器默认为 UTC -0,比我们的时区早 4 小时。

当我们最初发现该问题时,我们发现唯一真正有效的解决方法是在服务器重新启动时使用任务调度程序运行同步命令。直到两周前,即 2017 年 6 月 15 日左右,该任务和命令一直运行良好,但从那以后它一直没有奏效。我查看了任务/事件日志,它声称已成功运行,但实际上没有。

此时我唯一的想法是 Windows 更新中的某些内容导致同步代码无用。但我不知道那可能是什么。有人对如何识别问题有建议吗?

我们使用的同步代码位于 .bat 文件中。 2014 年 6 月 14 日早上安装的两个 Windows 更新,我怀疑这可能是任务不再工作的原因,是:

2017 年 6 月针对基于 x64 的系统的 Windows Server 2012 R2 安全质量月度汇总 (KB4022726)

适用于 Windows 8、8.1、10 和 Windows Server 2012、2012 R2、2016 x64 版本的 Windows 恶意软件删除工具 - 2017 年 6 月 (KB890830)

REM *** Retry for up to 15 minutes (90 retries @ 10 seconds each)
set retryCount=0

:SyncStart
if %retryCount == 90 goto SyncEnd
set /A retryCount=retryCount + 1

REM *** Resync the system clock
net start w32time
w32tm /resync
if errorlevel 1 goto SyncDelay
if errorlevel 0 goto SyncEnd

:SyncDelay
REM *** If unsuccessful, delay 10 seconds, then retry
choice /n /t:y,10>nul
goto SyncStart

:SyncEnd

【问题讨论】:

  • 安装应用程序或安全更新绝对不会改变时区。但时区设置与帐户相关。因此,为您的帐户配置的可能是 EST 时区,但为系统帐户配置的是 UTC 时区。可以以管理员权限复制当前的地区(国家、日期/时间/货币格式等)、语言(键盘、语音识别等)和时间设置(时区、夏令时调整等)用户到默认用户帐户(用于新帐户)和系统帐户。您应该利用这种可能性。

标签: windows batch-file time server windows-server-2012


【解决方案1】:

批处理文件在一行中包含语法错误:

if %retryCount == 90 goto SyncEnd

环境变量的值必须在使用标准扩展时使用%VariableName% 引用,而不仅仅是%VariableNameFOR 循环变量(%I 在 cmd 上分别%%I 在批处理文件) 或批处理文件参数 (%0,%1, ...),或与 !VariableName! 一起使用此处不需要的延迟扩展。

代码也可以优化:

@echo off
REM *** Retry for up to 15 minutes (90 retries @ 10 seconds each)
set retryCount=0

:SyncStart
if %retryCount% == 90 goto :EOF
set /A retryCount+=1

REM *** Resync the system clock
%SystemRoot%\System32\net.exe start w32time
%SystemRoot%\System32\w32tm.exe /resync
if not errorlevel 1 goto :EOF

REM *** If unsuccessful, delay 10 seconds, then retry
%SystemRoot%\System32\timeout.exe 10 /nobreak
goto SyncStart

嗯,代码可以进一步优化:

@echo off
REM *** Retry for up to 15 minutes (90 retries @ 10 seconds each)
set retryCount=0
%SystemRoot%\System32\net.exe start w32time
%SystemRoot%\System32\timeout.exe 5 /nobreak

:SyncTime
%SystemRoot%\System32\w32tm.exe /resync
if not errorlevel 1 goto :EOF

REM *** If unsuccessful, delay 10 seconds, then retry
set /A retryCount+=1
if not %retryCount% == 90 %SystemRoot%\System32\timeout.exe 10 /nobreak & goto SyncTime

要了解所使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

  • echo /?
  • goto /?
  • if /?
  • net /?
  • net start /?
  • rem /?
  • set /?
  • timeout /?
  • w32tm /?

并阅读 Microsoft 支持文章 Testing for a Specific Error Level in Batch Files

【讨论】:

  • 出色的答案。谢谢你。我应该指出我没有写命令,这超出了我的范围。我只是假设它“坏了”它,因为它工作了 8 个多月,直到 6 月 14 日。由于它在服务器安装更新后立即停止工作,我只是假设它们是相关的。
  • 您的解决方案一直有效,但现在停止了。我附上了一张日志图片,显示同步任务已完成,但没有正确更新时间。关于可能导致它停止工作的任何想法? link
  • 批处理文件必须以管理员身份以提升的权限执行。批处理文件只是向 Windows 时间管理发送消息以强制与配置的时间源重新同步。配置的时间源通常是微软的NTP服务器,时间同步是通过Windows自带的NTP客户端完成的。因此,您必须检查配置的 NTP 服务器是否正常工作,并且不会拒绝来自 NTP 客户端的重新同步请求。查看 Windows 注册表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time 并了解此注册表项。
猜你喜欢
  • 2013-03-23
  • 2019-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-16
  • 2016-11-12
  • 1970-01-01
相关资源
最近更新 更多