代码之家  ›  专栏  ›  技术社区  ›  Adam Driscoll

更改系统时区成功一次,然后不再更改

  •  3
  • Adam Driscoll  · 技术社区  · 14 年前

    我正在使用WinAPI在Windows XP SP3框上设置时区。我在看时区信息 HKLM\Software\Microsoft\WindowsNT\Time Zones\<time zone name> 然后将时区设置为指定的时区。

    我枚举时区键下的键,获取 TZI 价值并把它塞进 TIME_ZONE_INFORMATION 要传递给的结构 SetTimeZoneInformation .一切似乎都在第一关起作用。时区更改,不返回错误。

    第二次执行此操作(同一用户、新会话、在userinit之前登录时)调用成功,但系统不反映时区更改。文件上的时钟和时间戳都不会更新到新时区。当我导航到: HKLM\System\CurrentControlSet\Control\TimeZoneInformation 我的新时区信息已存在。

    当我设定时区时,会发生一些奇怪的事情:

    • 同样,当我从注册表解析TZI二进制值以存储在 时区信息 结构我注意到结构有 DaylightDate.wDay StandardDate.wDay 字段始终设置为0
    • 我试着打电话 GetTimeZoneInformation 就在我打电话之后 SetTimeZoneInformation 但调用失败,出现1300个错误(并非所有引用的特权或组都分配给调用方。)

    我还要确保发送一个 WM_BROADCAST 让探险家知道发生了什么。

    认为它是将字节数组解析为 时区信息 结构?还是我错过了其他重要的事情?

    编辑:

    找到一个说明发生这种情况原因的文档: here . vista中引入了特权…感谢msdn-docs…

    根据微软 documentation 我正在启用东南时区名称 当前进程的特权
    令牌。但当我试图打电话
    LookupPriviledgeValue 对于
    SE_TIME_ZONE_NAME 我得到了1313 错误(指定的特权 不存在。).

    2 回复  |  直到 14 年前
        1
  •  1
  •   VitalyVal    14 年前

    尝试使用lsaaddaccountrights而不是lookupprivilegevalue和adjusttokenprivileges来设置se_time_zone_name。也见 this topic .

        2
  •  0
  •   Adam Driscoll    14 年前

    在解决了这个问题一段时间后,我已经解决了这个问题,但我不太确定是什么步骤解决了这个问题。我添加了一个额外的子句来检查操作系统,以验证是否要调整进程令牌以启用se_time_zone_名称。它现在只在后XP操作系统上执行此操作。

    我还更改了TZI注册表值存储到结构中的方式。我意识到 TIME_ZONE_INFORMATION msdn文档包含用于注册表版本的结构( REG_TZI_FORMAT )简单地将二进制值直接读取到结构中就消除了一些代码。

    我还保证daylightname和standardname都被填充。

    最后我打了个电话 RegFlushKey(HKEY_LOCAL_MACHINE) 紧接着 SetTimeZoneInformation 打电话。采取这些步骤后,时区将按预期进行更改。