【发布时间】:2015-02-27 06:50:12
【问题描述】:
我正在尝试确定 Windows 系统的当前时区。以下代码 sn-p (大致)基于@MattJohnson 在此线程上的回答:Getting local timezone identifier when OS display language is non-english
using (RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(
@"SYSTEM\CurrentControlSet\Control\TimeZoneInformation"))
{
if (registryKey != null)
{
string windowsTimeZoneId = registryKey.GetValue("TimeZoneKeyName") as string;
if (string.IsNullOrEmpty(windowsTimeZoneId))
windowsTimeZoneId = registryKey.GetValue("StandardName") as string;
if (!string.IsNullOrEmpty(windowsTimeZoneId))
{
int i = windowsTimeZoneId.IndexOf('\0');
if (i != -1)
windowsTimeZoneId = windowsTimeZoneId.Remove(i);
return ConvertFromWindowsId(windowsTimeZoneId);
}
}
}
如果我在第一行“if (string.IsNullOrEmpty(windowsTimeZoneId))”上放置一个断点,那么这就是我在 Visual Studio 调试器中看到的:
这里发生了什么? RegistryKey.GetValue() 正在返回一个装箱的字符串,但为什么它没有检测到两个十六进制 00 字节并在那里终止字符串?
到目前为止,我已经在我的两台 PC 上对此进行了测试。这是来自运行 Windows 7 64 位的版本。另一个运行 Windows 7 32 位,除了它说返回的字符串的长度是 128 个字符而不是 127 个字符之外,它是相同的。
使用 regedit.exe 查看注册表项时,它看起来很好,只显示“浪漫标准时间”。
有点谷歌搜索出现了这个问题https://social.msdn.microsoft.com/Forums/sqlserver/en-US/eca7ad76-c910-46be-8fb9-876c7cde5c69/registry-read-time-zone-info-differ-when-code-build-on-40-framework-on-host-system-win-7-64-bit?forum=csharpgeneral否则我找不到任何东西。
该程序是使用 Visual Studio 2012 构建的,目标是 .Net 2.0。
如您所见,我添加了代码以将这种“损坏”结果考虑在内,但如果有人能向我解释这里发生了什么,甚至可能如何避免整个问题。
编辑:
该程序是使用 Visual Studio 2012 构建的,目标是 .Net 2.0。
嗯,情节变厚了。这种说法并不完全正确。上面显示的代码树桩位于针对 .Net 2.0 构建的库程序集中,但它是从针对 .Net 4.0 的程序调用的。现在我尝试从一个针对 .Net 2.0 的程序调用它,没有问题,RegistryKey.GetValue() 只返回“浪漫标准时间”。因此,正如 MSDN 上的帖子所暗示的那样,它似乎确实与 .Net Framework 4.0 有关。
编辑 2 - 开始认为这是“正常的”
这对于 SO 来说有点离题,但如果有人能看一下我在 Superuser.com 上的相关帖子,我将不胜感激,因为我在那里没有得到即时满足,我想解决这个问题,所以我知道我是否仍然应该恐慌。谢谢。
https://superuser.com/questions/859031/possible-malware-modification-of-windows-registry-entry
【问题讨论】:
-
非常有趣的细节。另请注意,浪漫标准时间适用于欧洲 - 而不是墨西哥。所以这不是故意的,因为值在同一个字符串中是不相关的。
-
@Matt:我怀疑多余的数据是随机的,只是分配缓冲区时内存中发生的任何事情。看起来 Windows 本身正在这样做;如果我删除多余的内容,然后更改时区,它会重新出现。每次看起来都是相同的数据,但我还没有尝试重新启动机器,看看是否让它看起来有什么不同。
标签: .net windows timezone registry