OpenSubKey()返回null,我可以在regedit.exe中看到一个registry项

我试图获取这个键内的所有子键的显示名称:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall 

有了这个代码:

  RegistryKey newKey; string val; string KeyPath64Bit = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"; RegistryKey mainKey = Registry.LocalMachine.OpenSubKey(KeyPath64Bit); string[] RegKeys64Bits = Registry.LocalMachine.OpenSubKey(KeyPath64Bit).GetSubKeyNames(); foreach (string s in RegKeys64Bits) { newKey = mainKey.OpenSubKey(s); val = newKey.GetValue("DisplayName", -1, RegistryValueOptions.None).ToString(); if (val != "-1") file64.WriteLine(val); } 

运行代码后,我找不到我需要的一个键:

 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E} 

它应该有显示名称:Microsoft Visual C ++ 2010 x64 Redistributable – 10.0.30319,而是GetSubKeyNames()方法给我的子项: {DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}.KB2151757它没有任何显示名称。

为什么我不能得到我需要的确切的子密钥( {DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E} ),我怎样才能得到它?

64位操作系统上的32位应用程序将默认查看HKLM\Software\Wow6432Node节点。 要读取密钥的64位版本,您需要指定RegistryView

 using (var hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)) using (var key = hklm.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall")) { // key now points to the 64-bit key } 

在.NET 4.0中添加了这样做的API; 如果您仍然使用3.5,则需要使用P / Invoke来访问64位密钥: http : //www.rhyous.com/2011/01/24/how-read-the-64-bit -registry-从-A-32位应用程序或-反之亦然/