2011-07-05 5 views
7

Tengo una aplicación (escrita en C#), que se ejecuta en un servidor de Windows 2008 (64 bits). En esta aplicación, debo verificar algunas claves de registro con respecto a IIS. Entre otros Quiero tener acceso a la clave HKEY_LOCAL_MACHINE \ Software \ Microsoft \ InetStp \ Components \ WMICompatibility" para comprobar si el modo de compatibilidad con IIS 6 está habilitado o no. Para ello utilizo Registry.GetValue de Microsoft.Win32.Acceso de registro con C# y "BUILD x86" en una máquina de 64 bits

Por alguna razón, la solución debe ser compilado con x 86. la consecuencia es, que ya no es posible acceder a la HKEY_LOCAL_MACHINE \ Software \ Microsoft \ InetStp \ componentes de pero todavía es posible leer la clave desde HKEY_LOCAL_MACHINE \ Software \ Microsoft \ InetStp. Al compilarlo con "AnyCPU" -flag el acceso de registro funciona bien.

¿Cuál es la razón de este comportamiento? ¿Hay alguna solución o solución para este problema?

+0

No recuerdo los nombres de las teclas específicas, pero el software x86 en Win64 reside en HKEY_LOCAL_MACHINE \ Software \ Wow64 o subclave con nombre similar – sehe

Respuesta

12

la que está cayendo falta de registry redirection.

La mejor solución es abrir una vista de 64 bits del registro, así:

using Microsoft.Win32; 
... 
RegistryKey registryKey = 
    RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64). 
    OpenSubKey(@"Software\Microsoft\InetStp\Components"); 
object value = registryKey.GetValue(@"WMICompatibility"); 

Si desea que su código funcione en ambos 32 y 64 bits máquinas, entonces tendrá que codificar algunos cambiando entre vistas de registro.

Nota: La capacidad de acceder a 64 bits puntos de vista de los procesos de 32 bits sólo se añadió a las bibliotecas de .NET en .NET 4. Parece que antes de que se necesitaba utilizar las API nativas, por ejemplo, con P/invocar.

+0

Ya tiene la vista de 32 bits, necesita la vista de 64 bits. Su solución requiere .NET 4. Se requerirá Pinvoke o un exe por separado para las versiones anteriores. –

+0

@hans sí, lo entendí mal, gracias. Lo edité –

+0

¡Gracias, esa es la solución para el problema! – Elmex

3

64 bits de Windows tiene un nodo separado para los programas x86 (no la idea más brillante)

Todas las claves del registro estarán bajo HKEY_LOCAL_MACHINE \ Software \ WOW6432Node

Más sobre este tema:
How to view the system registry by using 64-bit versions of Windows

El programa todavía "piensa" que está escribiendo en el mismo camino.

Le sugiero que corrija su programa de instalación (despacho) para escribir la configuración inicial en el lugar correcto.

Editar, alguna "información" de MSDN:

Registry Keys Affected by WOW64

+0

En realidad, la solución de nodo separada con redirección es una gran idea. ¿Cuál es tu mejor alternativa? –

+0

La mejor alternativa sería simplemente no tener este sistema. No es necesario y no funciona correctamente. El registro solo almacena los valores enteros y de cadena sin procesar (todos los 32 bits), así que ¿por qué necesita redireccionarse? ¿Por qué no pueden simplemente dejar los valores en el lugar normal? – NickG

+0

"Para admitir la coexistencia del registro COM de 32 bits y de 64 bits y los estados del programa ..." https://support.microsoft.com/en-us/help/305097/how-to-view-the -system-registry-by-using-64-bit-versions-of-windows –

Cuestiones relacionadas