web-dev-qa-db-fra.com

OpenSubKey () renvoie null pour une clé de registre que je peux voir 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;
     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);
     }

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 doit avoir le nom d'affichage: Microsoft Visual C++ 2010 x64 Redistributable - 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 de 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?

68
Zak Soliman

Une application 32 bits sur un système d'exploitation 64 bits examinera le HKLM\Software\Wow6432Node node par défaut. Pour lire la version 64 bits de la clé, vous devrez spécifier le 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-registre-de-registre-d'une-application-32-bits-ou-vice-versa /

162
Richard Deeming

Dans Visual Studio 2017, accédez à Projet> Propriétés> Générer> Décochez la cible 32 bits et la plate-forme en tant que "Tout processeur".

7
Clint