Registry.GetValue有什么问题?

我试图获得一个注册表值:

var value = Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography", "MachineGuid", 0); 

在Windows XP中一切正常,但在Windows 7中返回0.在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography使用regedit我看到MachineGuid ,但如果我运行

 var keys = Registry.LocalMachine.OpenSubKey("SOFTWARE").OpenSubKey("Microsoft").OpenSubKey("Cryptography", RegistryKeyPermissionCheck.ReadSubTree).GetValueNames(); 

keys.Length为0。

我做错了什么? 其他值都可以在OS中完成。

问题是您可能正在将解决方案编译为x86,如果编译为x64,则可以读取值。

尝试以下代码编译为x86和x64:

 class Program { static void Main(string[] args) { Console.WriteLine("MachineGUID:" + MachineGUID); Console.ReadKey(); } public static string MachineGUID { get { Guid guidMachineGUID; if (Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Cryptography") != null) { if (Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Cryptography").GetValue("MachineGuid") != null) { guidMachineGUID = new Guid(Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Cryptography").GetValue("MachineGuid").ToString()); return guidMachineGUID.ToString(); } } return null; } } } 

您可以阅读有关访问备用注册表视图的更多信息。

你可以在这里找到一种在x86和x64中读取值的方法。

它可能与UAC(用户帐户控制)有关。 Windows Vista和Windows 7的额外保护层。

您需要请求注册表的权限。

编辑 :你的代码现在:

 var keys = Registry.LocalMachine.OpenSubKey("SOFTWARE") .OpenSubKey("Microsoft") .OpenSubKey("Cryptography", RegistryKeyPermissionCheck.ReadSubTree) .GetValueNames(); 

只请求Cryptography子项上的权限,可能会导致问题(至少我有一次),所以新代码将是:

 var keys = Registry.LocalMachine.OpenSubKey("SOFTWARE", RegistryKeyPermissionCheck.ReadSubTree) .OpenSubKey("Microsoft", RegistryKeyPermissionCheck.ReadSubTree) .OpenSubKey("Cryptography", RegistryKeyPermissionCheck.ReadSubTree) .GetValueNames(); 

EDIT2:
我在这段代码上附加了调试器:

 var key1 = Registry.LocalMachine.OpenSubKey("SOFTWARE", RegistryKeyPermissionCheck.ReadSubTree); var key2 = key1.OpenSubKey("Microsoft", RegistryKeyPermissionCheck.ReadSubTree); var key3 = key2.OpenSubKey("Cryptography", RegistryKeyPermissionCheck.ReadSubTree); var key4 = key3.GetValueNames(); 

事实certificate,您可以读取该特定值,至少是我的猜测,因为所有数据都是正确的,直到我打开key3,ValueCount为零,而不是预期的1。

我认为这是一个受到保护的特殊价值。

你说你在64位Windows上:你的应用程序是32位吗? 如果是这样,它可能会受到注册表重定向的影响,并且正在查看HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Cryptography 。 你可能需要P / Invoke来解决它: http : //msdn.microsoft.com/en-us/library/aa384129.aspx 。

如果您不是管理员,则您只拥有HKLM的读取权限。 您需要以只读方式打开密钥。 不知道如何使用.NET的Registry类做到这一点; 使用API​​直接使用RegOpenKeyEx()和KEY_READ标志。

编辑:检查MSDN后,我看到OpenSubKey()确实打开只读,如果成功则返回内容,如果失败则返回任何内容。 由于您正在链接多个OpenSubKey调用,因此很可能其中一个失败导致其他调用失败。 尝试将它们分解为单独的调用,并检查返回的中间值。