2012-06-07 14 views
9

Traté de escribir una subclave del registro y su valor correspondiente al registro de esta manera:¿Por qué se escribe el registro en una ubicación diferente a la esperada?

const string subKey = @"SOFTWARE\Apple\Banana\"; 
const string regKey = "pip"; 

var rk = Registry.LocalMachine.OpenSubKey(subKey); 
if (rk == null) 
    rk = Registry.LocalMachine.CreateSubKey(subKey); 

var rv = rk.GetValue(regKey); 
if (rv == null) 
    rk.SetValue(regKey, "XXX"); 

return rv.ToString(); 

Ahora el problema es que cuando miro en la ubicación manualmente (a través de regedit) No puedo ver la carpeta SOFTWARE\Apple\Banana en HKLM .

Pero cuando ejecuto el código anterior de nuevo y depuro, puedo ver que Registry.LocalMachine.OpenSubKey(subKey) y rk.GetValue(regKey) producen los valores guardados anteriormente. Sin embargo, no veo los valores en la ubicación dada a través de regedit. Así que en buscar en el registro, puedo ver las claves y los valores anteriores en las ubicaciones siguientes:

  1. HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE\SOFTWARE\Apple\Banana

  2. HKEY_USERS\S-1-5-21-44266131-1313801407-2392705078-1000\Software\Classes\VirtualStore\MACHINE\SOFTWARE\Apple\Banana

En tanto, que los valores permanecen exactamente como he salvado. Así que me di cuenta que es desde donde mi aplicación lee el valor, aunque en mi código llamo desde HKLM\SOFTWARE\Apple\Banana\ ..

  1. Por qué sucede esto? ¿Está relacionado con el tema de los derechos de acceso?

  2. ¿Este comportamiento es esperado? En este sentido, este valor es muy importante para mí, así que solo sé si hay algún riesgo asociado con la reubicación automática.

  3. ¿Hay una manera correcta de escribir al registro de modo que permanezca en su ubicación exacta ..

Mi cuenta de administrador es uno, y estoy usando 32 bits de Windows 7.

Editar: como llegué a saber, la entrada del registro se almacena en la ubicación actual de los usuarios en lugar de HKLM. Y cuando consulto el valor de reg de una cuenta diferente, no obtengo el valor. En pocas palabras, no tiene sentido en primer lugar de guardarlo en HKLM :(

+0

Responda a su comentario "¿pero esto no significa que un futuro usuario que consulte la misma ubicación en hklm no obtendrá el valor que reside en la ubicación actual de los usuarios? Ok, voy a probarlo de todos modos" - sí lo hace. HLM en el registro y los archivos de programa y los directorios de ProgramData solo deben escribirse durante la instalación. Solo los administradores pueden escribir de otra manera (y solo con elevación si UAC está habilitado). –

+0

@DannyVarod No recibí tu primera oración. De todos modos, cuando probé aprendí que la virtualización no ayuda si desea obtener el mismo valor de registro para todos los usuarios. – nawfal

+0

Hay varias ubicaciones en Windows 6+ que están destinadas a contener datos de configuración solamente y hay otras ubicaciones que son destinado a contener datos configurables o datos que cambian durante el tiempo de ejecución. Durante la configuración, los usuarios tienen permiso para escribir en las ubicaciones de configuración (por administrador a través de UAC). Durante el tiempo de ejecución windows impide el acceso a estas ubicaciones a menos que el usuario sea administrador. (Los administradores no deben afectar a otros usuarios.) –

Respuesta

5

Sí, este es el comportamiento correcto y está sucediendo porque no tiene suficientes privilegios para escribir directamente en la sección HKLM. Se llama virtualización y también ocurre para el sistema de archivos, ha sido un comportamiento en el sistema operativo desde Vista.

Debe continuar tal como está e intentar leer también desde la misma clave HKLM en la que está escribiendo, Windows lo redirigirá de forma transparente.

Preet tiene kindly provided un enlace de MSDN que debe leer detenidamente.

Tenga en cuenta que cuando se accede a una clave en HKLM también debe incluir los permisos que desee, incluso si está ejecutando como administrador (porque la clave no se abre automáticamente con derechos de administrador, usted tiene que solicitarlo):

key = key.OpenSubKey(keyname, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.FullControl); 
+0

pero esto no significa que un futuro usuario consulte el ¿La misma ubicación en hklm no obtendrá el valor que reside en la ubicación actual de los usuarios? Ok, voy a probarlo de todos modos. – nawfal

+0

gracias por la sugerencia adicional – nawfal

+0

Estoy teniendo el mismo problema, pero estoy tratando de guardar una clave de activación en el registro. Quiero que la clave sea la misma para todos los usuarios, ¿esta virtualización lo arruinará? – Alan

4
  1. This is Registry Virtualization (msdn)

    virtualización del registro es una tecnología de compatibilidad de aplicaciones que permite operaciones de escritura de Registro que tienen impacto global que ser redirigidos a las ubicaciones por usuario. Esta redirección es transparente para las aplicaciones que leen o escriben en el registro. Se admite comenzando con Windows Vista.

    Descripción general de la virtualización

    Antes de Windows Vista, las aplicaciones eran normalmente ejecutadas por los administradores. Como resultado, las aplicaciones podrían acceder libremente a los archivos del sistema y las claves de registro. Si estas aplicaciones fueran ejecutadas por un usuario estándar, fallarían debido a la insuficiencia de los derechos de acceso .Windows Vista y versiones posteriores de Windows mejoran la compatibilidad de las aplicaciones para estas aplicaciones al redirigir automáticamente estas operaciones a . Por ejemplo, las operaciones de registro en la tienda global (HKEY_LOCAL_MACHINE \ Software) se redirigen a una ubicación por usuario dentro del perfil del usuario conocido como la tienda virtual (HKEY_USERS \ _Classes \ VirtualStore \ Machine \ Software).

  2. Sí, es exactamente como debería ser.

  3. Puede vivir con Virtualization si desea escribir en una ubicación que tenga un impacto global o utilizar ubicaciones más localizadas si no lo desea. De cualquier manera, es invisible para el lector, así que no te preocupes por eso.

+0

+1, incluyó un enlace :) – slugster

+0

@slugster - Creo que es importante poner enlaces a texto citado u otras muestras de personas/blogs. –

+0

, pero ¿no significa que un futuro usuario que consulte la misma ubicación en hklm no obtendrá el valor que reside en la ubicación actual de los usuarios? Ok, voy a probarlo de todos modos. – nawfal

Cuestiones relacionadas