CSharp - 在 regedit.exe 中,对于我可以看到的注册表项,C# OpenSubKey() 返回空值

  显示原文与译文双语对照的内容

我正在尝试获取此键内的子关键字的所有显示名称:


HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall



使用以下代码:


 RegistryKey newKey;


 string val;



 string KeyPath64Bit = @"SOFTWAREMicrosoftWindowsCurrentVersionUninstall";


 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_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall{DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}



并且它应该具有显示名称: Microsoft Visual C++ x64 Redistributable Redistributable,但是 GetSubKeyNames() 方法给了我子密钥: {DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}.KB2151757 它没有任何显示名称。

为什么我无法获得所需的确切子关键字( {DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E} 我怎样才能得到它?

时间: 原作者:

64位 操作系统上的32位 应用程序默认情况下将查看 HKLMSoftwareWow6432Node node 。 要读取密钥的64位 版本,你需要指定 RegistryView:


using (var hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64))


using (var key = hklm.OpenSubKey(@"SOFTWAREMicrosoftWindowsCurrentVersionUninstall"))


{


//key now points to the 64-bit key


}



要执行这里操作的API被添加到. NET 4.0中;如果仍使用 3.5,则需要使用p/invoke访问 64位 密钥: http://www.rhyous.com/2011/01/24/how-read-the-64-bit-registry-from-a-32-bit-application-or-vice-versa/

...