OpenSubKey () devuelve nulo para una clave de registro que puedo ver en regedit.exe

79

Estoy tratando de obtener todos los nombres para mostrar de las subclaves dentro de esta clave:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

Con este código:

     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);
     }

Después de ejecutar el código, no puedo encontrar una de las claves que necesito:

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

Y debería tener el nombre para mostrar: Microsoft Visual C ++ 2010 x64 Redistributable - 10.0.30319, pero en su lugar el GetSubKeyNames()método me da la subclave : {DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}.KB2151757que no tiene ningún nombre para mostrar.

¿Por qué no puedo obtener la subclave exacta que necesito ( {DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}) y cómo puedo obtenerla?

Zak Soliman
fuente
¿Puede hacerlo si ejecuta Visual Studio como administrador?
tsells el
@tsells Lo intenté y no funciona.
Zak Soliman
¿Está ejecutando un proceso de 32 bits en un sistema operativo de 64 bits?
Richard Deeming
@RichardDeeming El ejecutable está compilado para 32 bits y mi sistema operativo es de 64 bits
Zak Soliman

Respuestas:

185

Una aplicación de 32 bits en un sistema operativo de 64 bits buscará en el HKLM\Software\Wow6432Nodenodo de forma predeterminada. Para leer la versión de 64 bits de la clave, deberá especificar 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
}

La API para hacer esto se agregó en .NET 4.0; Si todavía usa 3.5, deberá usar P / Invoke para acceder a las claves de 64 bits: http://www.rhyous.com/2011/01/24/how-read-the-64-bit -register-from-a-32-bit-application-or-vice-versa /

Richard Deeming
fuente
Gracias. Tuve el mismo problema, con la misma clave. :)
Eduardo
1
Gracias por esto. Aunque todavía no entiendo por qué hay dos registros.
Robert Noack
@RobertNoack: Creo que es principalmente para COM y para garantizar que las variables de entorno se expandan correctamente en REG_EXPAND_SZvalores. Hay algo de información sobre MSDN - Registry Redirector
Richard Deeming
Salvaste mi día. Me estaba asustando la forma en que se comportaba la clave de registro para mí. +1.
RBT
Debo haber leído una docena de explicadores; este es el primero en mostrar el paso RegistryKey.OpenBaseKey (RegistryHive.LocalMachine, RegistryView.Registry64)). ¡¡Gracias!!
Joe Baker
14

En Visual Studio 2017, vaya a

Project > Properties > Build > Uncheck 32 bit and Platform target as "Any CPU".
Clint
fuente
2
Tuve el mismo problema: desmarqué 32Bit y funcionó bien.
RDV