首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对WMIC的后续调用返回带有偏离时区的本地时间。

对WMIC的后续调用返回带有偏离时区的本地时间。
EN

Server Fault用户
提问于 2019-11-14 12:42:20
回答 1查看 2.2K关注 0票数 3

问题

在我们公司的环境中,我们使用几个批处理文件,使用WMIC检索当前时间。通常将其打印到日志文件中,还可以将时间戳包含在文件名中。

从Windows 10开始--我们不记得在Windows 7上看到过这种行为--我们经历了一些日志文件解析器(它们为评估创建了一些很好的图表)似乎绘制了一些奇怪的东西。经过一些研究,我们发现,在短时间内,调用WMIC返回一个不同的时间戳。

这就是我们所说的WMIC,以及它返回的内容。

代码语言:javascript
复制
C:\> WMIC.exe OS Get localdatetime /value
LocalDateTime=20191114112607.134000+060

现在我们做了一个实验,在更长的一段时间内,我们每秒钟调用一次WMIC。以下是产生的时间戳的摘录:

代码语言:javascript
复制
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调用都返回了预期的时间。这是我的剧本

代码语言:javascript
复制
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时区信息

代码语言:javascript
复制
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

问题

  • 有人能解释一下这种行为吗?
  • 什么能影响WMIC的结果?
  • 你觉得这是一种虫子吗?
  • 还能做什么分析来缩小这个范围呢?
EN

回答 1

Server Fault用户

回答已采纳

发布于 2020-04-22 11:07:00

那现在是一个已知的Windows。

内部有一个全局变量,它缓存DST偏移量,将其值保存5分钟。5分钟后,这个值就消失了,这给你留下了一个跳跃的当地时间。

此逻辑在RS5/1809中使用,但在19H1或Windows 2012 R2中没有使用。

解决办法:

  • 经常引导机器,这样当机器运行更长时间时,LocalDateTime和LastBootUpTime就不会有不同的时区。
  • 使用启动时运行的脚本将InstallDate设置为上次重新启动的时间,也可以避免此问题。
票数 2
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/991821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档