![Windows Server 上 NTP 的故意时间偏差(2016)](https://linux22.com/image/786594/Windows%20Server%20%E4%B8%8A%20NTP%20%E7%9A%84%E6%95%85%E6%84%8F%E6%97%B6%E9%97%B4%E5%81%8F%E5%B7%AE%EF%BC%882016%EF%BC%89.png)
由于界面写得不好,我需要确保服务器 A 总是比服务器 B 快几秒钟。(是的,我知道这是一件可怕的事情)到目前为止,我有三个广泛的解决方案:
(首选)改变 W32Time,在进行时间 NTP 同步时将时钟提前 X 秒。
安装不同的(修改过的?)NTP 时间服务(我看到 Windows 中提到了 Meinberg)但不想如此大幅度地更改服务器。
(最黑客的)与 W32Time 事件日志绑定的计划任务。这意味着每次 Win32Time 设置时钟时,都会运行一个脚本来扭曲它(呸)。我在这里停下来,因为 MS 所说的 Windows 2016 上服务的日志不存在。我从 MS 支持那里看到的只是如何检查您的服务器版本,因为它“必须在那里”
更新:好吧,我可能是新来的,但我是 StackOverflow 的长期用户,声誉很高。
如果你投票反对我,那没关系,但我想知道原因,这样我就可以调整。
我想不出还有什么办法可以使它更加精确。
答案1
好吧,我很高兴我让供应商明白了道理并修复了他们的界面(足够了)。由于我讨厌留下未解决的问题,所以有一个简单的解决方案,如果你不幸需要这样做:
- 将 w32time 设置为手动(而不是自动)
- 创建一个计划任务来同步时钟,并在下一行调整时间
如果您在域中,则可能使用域控制器(自动)作为时间源。因此,您需要向域询问时间服务器,以便能够将其放入对 w32time 的调用中。
对于本文的其余部分,example.com 是域,time.example.com 是时间服务器。
获取典型域的时间服务器(例如.com):
nltest /dsgetdc:example.com
获取“DC: ...”值。它将是你的时间服务器。
将时间同步设置为手动 运行此命令:
w32tm /config /syncfromflags:manual /reliable:YES /update
然后重新启动“Windows Time”服务。
获取时间偏差 w32tm /stripchart /computer:time.exaample.com /samples:3 /dataonly
取第二列的数据,并计算三个数字的平均值。这就是服务器相对于时间源的领先或落后程度。
使用 powershell 将时间添加到当前时钟
设置日期-日期(获取日期).添加秒数(1.03)
注意:这将比示例中的“1.03”多添加几毫秒。您可以多次调用它来测量增加了多少毫秒,并将其构建到计算函数调用值的方式中。根据您需要的精确度,您可能需要在设置后再次检查时间偏差。
将时钟同步重新设置为自动 运行此命令:
w32tm /config /syncfromflags:domhier /update
然后重新启动“Windows Time”服务。
综上所述
- 将 Windows 时间 (W32tm) 同步设置为手动
- 创建计划任务,定期调用脚本手动同步时间。
脚本步骤
这假设您需要让本地时钟 X 比另一台服务器的时钟早(/晚)一段时间。如果您只需要它与时间服务器有偏差,则可以简化此脚本。
- 如果需要,确定时间源
- 同步时钟
- 测量本地时钟的时间偏差
- 检查服务器是否已经足够领先/落后于其他服务器的时钟:
- 使用远程 powershell 执行命令来测量时间偏差
- 比较本地和远程服务器的时间偏差,以了解服务器当前领先多少。
- 如果确定服务器时间需要调整:
- 同步本地时钟
- 运行命令检查时间偏差
- 将实际倾斜与所需倾斜进行比较
- 如果需要,运行命令将 X.yyyy 秒数添加到本地时钟。