2010-09-06 77 views
1

我有一个读取注册表项字符串值的小应用程序。它运作良好,但由于某些原因,在这个关键的失败: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductId 尽管其它值工作HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\无法以编程方式读取某些注册表项

它也不能在'HKEY_LOCAL_MACHINE \ SOFTWARE \微软\加密\ MachineGuid”

我正在为一个管理员,这是一个因素吗?我正在运行W7 64bit,另一台W7机器和Vista机器都正常工作。我唯一的猜测是一些许可问题,或与我有关的运行64位。

任何想法?

更新: 这似乎与我的系统运行Windows 64位和\Software\Wow6432Node\有关。我不知道。我都\Software\Wow6432Node\Microsoft\Windows NT\CurrentVersion\\Software\Microsoft\Windows NT\CurrentVersion\但只有后者包含的ProductID值...由于某种原因,当我问关键的Windows显然看在Wow6432Node

我们使用wxWidgets的,但很可能,如果直接使用一些代码的Win32需要...我们的应用程序是一个32位应用程序,但目标个人电脑可以运行32或64位版本的Windows

+1

如果您没有向我们展示代码,我们无法帮助您。你看过ACL吗?它不一定授予您正在运行的特定管理员用户。你得到什么错误代码? – bmargulies 2010-09-06 17:31:42

+0

它是wxWindows中的包装代码...您只需传入关键路径以及其它所有工作。 – 2010-09-06 17:35:46

+0

你可以扩大'它失败'?当然有一个错误代码返回,你能告诉我们它是什么吗? – James 2010-09-06 18:40:41

回答

0

我只是看着我的注册表,并没有在HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ ProductId或MachineGuid,这是在Win7 64位

+0

当我运行注册表编辑器时,我在'SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \'中看到ProductId,但看不到'SOFTWARE \ Wow6432Node \ Microsoft \ Windows NT \ CurrentVersion \'。我可以强制regedit在32/64位模式下工作吗? – 2010-09-06 18:56:38

+1

这是一个疯狂的晚评,但你可以。对于64位注册表访问使用“regedit”,对于32位注册表访问使用“regedt32”。仅适用于64位窗口。 – Wug 2012-08-06 16:08:50

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;