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

我枚举“时区”键下的键,获取TZI值并将其填充到TIME_ZONE_INFORMATION结构中,以传递给SetTimeZoneInformation。一切似乎都在第一遍工作。时区更改,不返回错误。

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

设置时区时,发生了一些奇怪的事情:

  • 同样,当我从注册表中解析TZI二进制值以存储在TIME_ZONE_INFORMATION结构中时,我注意到该结构的DaylightDate.wDayStandardDate.wDay字段始终设置为0
  • 我尝试在调用SetTimeZoneInformation之后立即调用GetTimeZoneInformation,但是调用失败并显示1300错误(并非所有引用的特权或组都分配给了调用者。)

  • 我还要确保发送WM_BROADCAST消息,以便Explorer知道发生了什么。

    认为这是将字节数组解析为TIME_ZONE_INFORMATION结构吗?还是我错过了其他重要的事情?

    编辑:

    找到了说明发生这种情况的文档:here。特权是在Vista中引入的...感谢MSDN文档...

    最佳答案

    尝试使用LsaAddAccountRights代替LookupPrivilegeValue和AdjustTokenPrivileges设置SE_TIME_ZONE_NAME。另请参见this topic

    09-08 04:01
    查看更多