更改系统时区成功一次,然后不再更改
我使用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.wDay
和StandardDate.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 错误(指定的特权不 不存在)。
经过一段时间的搞乱之后,我已经解决了这个问题,但我不太清楚哪一步修复了它。我添加了一个额外的子句来检查操作系统,以验证是否调整流程令牌以启用SE_TIME_ZONE_NAME。它现在只在后XP操作系统上这样做。
我也改变了如何将TZI注册表值存储到我的结构中。我意识到在TIME_ZONE_INFORMATION MSDN文档中包含用于注册表版本的结构(REG_TZI_FORMAT
)。只需将二进制值直接读入结构中就可以省去一些代码。
我也保证BOTH DaylightName和StandardName都被填充。
最后我在拨打SetTimeZoneInformation
之后立即拨打RegFlushKey(HKEY_LOCAL_MACHINE)
。采取这些步骤后,时区正在按预期更改。
尝试使用LsaAddAccountRights而不是LookupPrivilegeValue和AdjustTokenPrivileges来设置SE_TIME_ZONE_NAME。另见this topic。
感谢您的想法,但我认为AdjustTokenPriviledge工作正常。我编辑了这个问题,因为SE_TIME_ZONE_NAME在XP中不存在。 – 2010-04-01 14:55:46