OpenSubKey () renvoie null pour une clé de registre visible dans regedit.exe

J’essaie d’obtenir tous les noms d’affichage des sous-clés dans cette clé:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall 

Avec ce code:

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

Après avoir exécuté le code, je ne trouve pas l’une des clés dont j’ai besoin:

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

Et il devrait avoir le nom d’affichage: Microsoft Visual C ++ 2010 x64 Redissortingbuable – 10.0.30319, mais à la place la méthode GetSubKeyNames() me donne la sous-clé: {DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}.KB2151757 qui n’a pas tout nom d’affichage.

Pourquoi ne puis-je pas obtenir la sous-clé exacte dont j’ai besoin ( {DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E} ) et comment l’obtenir?

Une application 32 bits sur un système d’exploitation 64 bits examinera par défaut le nœud HKLM\Software\Wow6432Node . Pour lire la version 64 bits de la clé, vous devez spécifier 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 } 

L’API pour ce faire a été ajoutée dans .NET 4.0; Si vous utilisez toujours la version 3.5, vous devrez utiliser P / Invoke pour accéder aux clés 64 bits: http://www.rhyous.com/2011/01/24/how-read-the-64-bit -registry-from-a-32-bit-application-ou-vice-versa /