在我们公司的环境中,我们使用几个批处理文件,使用WMIC检索当前时间。通常将其打印到日志文件中,还可以将时间戳包含在文件名中。
从Windows 10开始--我们不记得在Windows 7上看到过这种行为--我们经历了一些日志文件解析器(它们为评估创建了一些很好的图表)似乎绘制了一些奇怪的东西。经过一些研究,我们发现,在短时间内,调用WMIC返回一个不同的时间戳。
这就是我们所说的WMIC,以及它返回的内容。
C:\> WMIC.exe OS Get localdatetime /value
LocalDateTime=20191114112607.134000+060现在我们做了一个实验,在更长的一段时间内,我们每秒钟调用一次WMIC。以下是产生的时间戳的摘录:
20191114112607.134000+060
20191114122608.394000+120
20191114122609.687000+120
[...]
20191114123105.161000+120
20191114123106.431000+120
20191114113107.672000+060我们生活在MEZ时区的一个区域,那就是UTC+1,这就是为什么我们期望时间戳带有+060分钟指示。我们也不期望它改变,除非一年两次,也就是当日灯节省时间切换到MESZ (UTC+2)时,反之亦然。
正如您在上面的时间戳中所看到的:在几乎完全5分钟的时间内,WMIC返回+120时间戳。
我还记录了其他一些调用的输出,以检查这是否是一个全局Windows问题,或者更确切地说是一个wmic行为。一切似乎都是一种(婴儿车?)WMIC的行为
所有函数/程序,甚至另一个WMIC调用都返回了预期的时间。这是我的剧本
while ($true) {
Get-Date -Format G
Get-TimeZone
$timeservers | ForEach-Object {
$server = $_
w32tm.exe /stripchart /computer:$server /dataonly /samples:1 | Out-Default
}
cmd.exe /c date /T | Out-Default
cmd.exe /c time /T | Out-Default
WMIC.exe Path Win32_LocalTime Get /Format:value | Out-Default
# All 'correct' except:
WMIC.exe OS Get localdatetime /value | Out-Default
Start-Sleep -Seconds 1
}上面脚本的输出显示只有OS Get localdatetime调用返回“错误”时间戳。我们已经搜索了系统和应用程序事件日志中的条目,这些条目可以告诉我们为什么会发生这种情况,但是没有记录任何条目。我还检查了是否计划在发生这种情况时运行一些操作,但什么也没有。
Registry时区信息
C:\>reg query HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation
Bias REG_DWORD 0xffffffc4
DaylightBias REG_DWORD 0xffffffc4
DaylightName REG_SZ @tzres.dll,-321
DaylightStart REG_BINARY 00000300050002000000000000000000
DynamicDaylightTimeDisabled REG_DWORD 0x0
StandardBias REG_DWORD 0x0
StandardName REG_SZ @tzres.dll,-322
StandardStart REG_BINARY 00000A00050003000000000000000000
TimeZoneKeyName REG_SZ W. Europe Standard Time
ActiveTimeBias REG_DWORD 0xffffffc4发布于 2020-04-22 11:07:00
那现在是一个已知的Windows。
内部有一个全局变量,它缓存DST偏移量,将其值保存5分钟。5分钟后,这个值就消失了,这给你留下了一个跳跃的当地时间。
此逻辑在RS5/1809中使用,但在19H1或Windows 2012 R2中没有使用。
解决办法:
https://serverfault.com/questions/991821
复制相似问题