¿Por qué no puedo leer correctamente los valores de registro de 32 bits en HKCU en una máquina de 64 bits?

Estoy aturdido en un problema de registro de Windows 7 y aunque varias preguntas y respuestas me ayudan a solucionar el problema, nada de lo que he visto aborda mi problema particular. No sé si otras versiones de Windows afectan este problema, pero todos tenemos máquinas win7x64.

Tenemos una amplia variedad de herramientas en nuestro trabajo, algunas C ++, algunas C #, algunas python (2.6), etc. También ejecutamos una combinación de herramientas de 32 y 64 bits. En el pasado, felizmente hemos almacenado información de registro en HKLM . Hemos estado trabajando para mover cosas a HKCU . Hemos tenido muchas discusiones sobre si hacer esto, los efectos en UAC , etc. Realmente queremos intentar y hacer este movimiento. Dicho esto:

Estamos teniendo problemas para leer / escribir claves de registro de HKCU/software/CompanyABC/App . Tenemos una app configuración de escritura en python que escribe las claves de registro en la ubicación anterior usando _winreg . Si especificamos o no KEY_WRITE | KEY_WOW64_32KEY o simplemente KEY_WRITE, los valores se escriben en HKCU/Software/WOW6432Node/companyABC/app . Multa.

Luego tengo una aplicación de C # que intenta leer estos valores. Usando Microsoft.Win32.Registry , abro la subclave (‘HKCU / Software / CompanyABC / app’) y no veo mis valores. Resulta que estoy viendo el siguiente comportamiento:

  • Al leer / escribir claves de registro de HKLM , todo esto simplemente funciona. La aplicación python escribirá en HKLM/Softare/Wow6432Node/CompanyABC/app , y el código C # se leerá desde esa ubicación. Todo esto también tiene sentido, dado que estamos construyendo nuestras aplicaciones C # y escribiendo los valores de registro a través de python.
  • Leyendo / escribiendo los valores de registro de HKCU, tengo un comportamiento diferente. Las funciones _winreg escribirán a HKCU/Sofrware/Wow6432Node/CompanyABC/app , pero la aplicación C # se leerá de HKCU/Software/CompanyABC/app . La aplicación C # está construida como una aplicación x86 (no cualquier CPU y no x64), por lo que asumí que la aplicación se redirigiría correctamente al wow6432Node , pero no lo parece.

después de algunas investigaciones, parece que HKCU/Software es diferente. Este artículo parece indicar que esta área está “compartida” y no redirigida. Si ese es el caso, entonces no puedo entender por qué nuestra aplicación de Python (de nuevo, usando _winreg) está escribiendo en una ubicación en HKCU que usa el nodo Wow6432, parece que debería estar escribiendo sin la redirección en su lugar. Supongo que podría ser un error en _winreg .

Realmente quiero evitar WOW6432Node explícitamente en nuestras herramientas, pero ahí es donde estoy hoy. ¿Puede alguien explicarme cómo puedo hacer que los accesos de registro de los procesos de 32 y 64 bits a HKCU funcionen correctamente sin tener que recurrir a rutas codificadas en la sección de 32 bits?

Entiendo por los comentarios sobre la pregunta que este problema ha desaparecido, para cualquier otra persona que encuentre esta pregunta, puede usar Microsoft.Win32.OpenBaseKey para especificar si abrir la parte del registro de 64 o 32 bits cuando se ejecuta en una Máquina de 64 bits incluso si su proceso se ejecuta como un proceso de 32 bits.

Si siempre desea acceder a las claves en la sección NON-WOW6432Node del registro, entonces puede configurar de forma segura el parámetro Ver de OpenBaseKey en RegistryView .Registry64. Esto funcionará correctamente en sistemas operativos de 64 y 32 bits.