2010-03-31 68 views
3

我使用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二进制值在我TIME_ZONE_INFORMATION结构来存储我注意到的结构有DaylightDate.wDayStandardDate.wDay场总是被设置为0
  • 我试着打电话给GetTimeZoneInformation之后我打电话SetTimeZoneInformation,但呼叫失败,出现错误1300(未标记被分配给呼叫者的所有权限或组。)

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

认为这是解析字节数组到TIME_ZONE_INFORMATION结构?或者我错过了其他重要的东西?

编辑:

发现一份文件,证明为什么发生这种情况:here。特权是在Vista中引入...感谢MSDN文档...

每微软documentation 我使SE_TIME_ZONE_NAME 特权当前进程
令牌。但是,当我尝试调用
LookupPriviledgeValue
SE_TIME_ZONE_NAME我收到了1313 错误(指定的特权不 不存在)。

回答

0

经过一段时间的搞乱之后,我已经解决了这个问题,但我不太清楚哪一步修复了它。我添加了一个额外的子句来检查操作系统,以验证是否调整流程令牌以启用SE_TIME_ZONE_NAME。它现在只在后XP操作系统上这样做。

我也改变了如何将TZI注册表值存储到我的结构中。我意识到在TIME_ZONE_INFORMATION MSDN文档中包含用于注册表版本的结构(REG_TZI_FORMAT)。只需将二进制值直接读入结构中就可以省去一些代码。

我也保证BOTH DaylightName和StandardName都被填充。

最后我在拨打SetTimeZoneInformation之后立即拨打RegFlushKey(HKEY_LOCAL_MACHINE)。采取这些步骤后,时区正在按预期更改。

1

尝试使用LsaAddAccountRights而不是LookupPrivilegeValue和AdjustTokenPrivileges来设置SE_TIME_ZONE_NAME。另见this topic

+0

感谢您的想法,但我认为AdjustTokenPriviledge工作正常。我编辑了这个问题,因为SE_TIME_ZONE_NAME在XP中不存在。 – 2010-04-01 14:55:46