我有一个小应用程序,它读取注册表键字符串值。它运作良好,但由于某种原因,它失败了这个键:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductId
尽管处理了HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\
它在`HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Cryptography \ MachineGuid'上也失败了
我作为管理员运行,这是一个因素吗?我正在运行W7 64bit,另一台W7机器和Vista机器都运行良好。我唯一的猜测是一些许可问题,或者与我运行64位相关。
有什么想法吗?
更新
它似乎与我运行Windows 64bit和\Software\Wow6432Node\
的系统有关。我不知道是是什么。我同时拥有\Software\Wow6432Node\Microsoft\Windows NT\CurrentVersion\
和\Software\Microsoft\Windows NT\CurrentVersion\
,但只有后者包含ProductId值...出于某种原因,当我要求关键Windows显然在Wow6432Node中查找时
我们正在使用wxWidgets,但如果需要,可能会直接使用一些win32代码......我们的应用程序是32位应用程序,但目标PC可以运行32位或64位版本的Windows
答案 0 :(得分:2)
归功于WOW64。这个other question侧重于细节。
答案 1 :(得分:0)
我只是查看了我的注册表,HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ ProductId或MachineGuid没有密钥,这是在Win7 64位上
答案 2 :(得分:0)
我得到以下代码来处理32位XP盒子和64位Win 7盒子。我认为这应该涵盖大多数基础。
// start out trying to read machine guid on 32 bit machine
object value = Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography", @"MachineGuid", (object) "defaultValue");
if (value != null && value.ToString() != "defaultValue")
{
return value.ToString();
}
// read machine guid on 64 bit machine
RegistryKey regKeyBase = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
RegistryKey regKey = regKeyBase.OpenSubKey(@"SOFTWARE\Microsoft\Cryptography", RegistryKeyPermissionCheck.ReadSubTree);
value = regKey.GetValue("MachineGuid", (object) "defaultValue");
regKeyBase.Close();
regKey.Close();
if (value != null && value.ToString() != "defaultValue")
{
return value.ToString();
}
return string.Empty;