9

J'ai essayé d'écrire un sous-clé de Registre et sa valeur correspondant au registre comme ceci:Pourquoi le registre est-il écrit dans un emplacement différent de celui prévu?

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

Maintenant, le problème est que je quand je regarde dans l'emplacement manuellement (via regedit) Je ne vois pas le dossier SOFTWARE\Apple\Banana dans HKLM .

Mais quand je réexécute le code ci-dessus et que je débogue, je peux voir que Registry.LocalMachine.OpenSubKey(subKey) et rk.GetValue(regKey) donnent les valeurs précédemment sauvegardées. Pourtant, je ne vois pas les valeurs à l'emplacement donné via regedit. Donc, sur la recherche dans le registre, je peux voir les touches ci-dessus et des valeurs dans des endroits suivants:

  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

Dans les deux que les valeurs restent exactement comme je l'ai sauvé. Donc, je me rends compte que c'est où mon application lit la valeur que dans mon code, je l'appelle de HKLM\SOFTWARE\Apple\Banana\ ..

  1. Pourquoi est-ce qui se passe? Est-ce lié à la question des droits d'accès?

  2. Est-ce que ce comportement est attendu? En ce sens, cette valeur est très importante pour moi, alors je sais juste s'il y a un risque associé à l'auto-relocation!

  3. est-il une bonne façon d'écrire au registre afin qu'il reste dans son emplacement exact ..

Mon compte est administrateur, et je me sers 32 bit windows 7.

Edit: Comme je viens de le savoir, l'entrée de registre est stockée dans l'emplacement actuel des utilisateurs plutôt que HKLM. Et quand je demande la valeur reg à partir d'un compte différent, je ne reçois pas la valeur. En bref, aucun point d'abord l'enregistrer à HKLM :(

+0

Répondre à votre commentaire "mais cela ne signifie-t-il pas un futur utilisateur interrogeant le même emplacement dans hklm ne recevra pas la valeur qui réside dans l'emplacement actuel des utilisateurs? Ok je vais le tester de toute façon" - oui oui. HLM dans le Registre et les répertoires Program Files et ProgramData ne doivent être écrits que pendant l'installation. Seuls les administrateurs peuvent y écrire autrement (et seulement avec une élévation si l'UAC est activé). –

+0

@DannyVarod Je n'ai pas eu votre première phrase. Quoi qu'il en soit, quand j'ai testé j'ai appris que la virtualisation n'aide pas si vous voulez obtenir la même valeur de registre pour tous les utilisateurs. – nawfal

+0

Il y a plusieurs endroits dans Windows 6+ qui ne contiennent que des données d'installation et il y a d'autres endroits destiné à contenir des données configurables ou des données qui changent pendant l'exécution. Au cours de l'installation, les utilisateurs sont autorisés à écrire dans les emplacements d'installation (par admin via UAC). Pendant l'exécution, les fenêtres empêchent l'accès à ces emplacements sauf si l'utilisateur est admin. (Non les administrateurs ne devraient pas affecter les autres utilisateurs.) –

Répondre

5

Oui, ce comportement est correct et cela se produit car vous n'avez pas les droits suffisants pour écrire directement dans la ruche HKLM. C'est ce qu'on appelle la virtualisation et ça se passe aussi pour le système de fichiers, ça a été un comportement dans l'OS depuis Vista.

Vous devriez continuer comme vous êtes et tenter de lire également à partir de la même clé HKLM que vous écrivez, Windows redirigera de manière transparente pour vous.

Le pré-équipement contient kindly provided un lien MSDN que vous devez lire attentivement.

Notez que lorsque vous accédez à une clé sous HKLM vous devez également inclure les autorisations que vous voulez, même si vous exécutez en tant qu'administrateur (car la clé n'est pas ouvert automatiquement avec des droits d'administrateur, vous devez en faire la demande):

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

mais cela ne signifie-t-il pas un futur utilisateur interrogeant le même emplacement dans hklm ne recevra pas la valeur qui réside dans l'emplacement des utilisateurs actuels? Ok, je vais le tester de toute façon .. – nawfal

+0

merci pour l'astuce supplémentaire – nawfal

+0

J'ai le même problème, mais j'essaye d'enregistrer une clé d'activation dans le registre. Je veux que la clé soit la même pour tous les utilisateurs, est-ce que cette virtualisation va gâcher ça? – Alan

4
  1. This is Registry Virtualization (msdn)

    virtualisation du Registre est une technologie de compatibilité des applications qui permet des opérations d'écriture de registre qui ont un impact mondial pour être redirigés Cette redirection est transparente aux applications qui lisent ou écrivent dans le registre et qui sont prises en charge à partir de Windows Vista

    Présentation de la virtualisation

    Avant Windows Vista, les applications étaient généralement exécutées par les administrateurs. En conséquence, les applications peuvent accéder librement aux fichiers système et aux clés de registre. Si ces applications étaient exécutées par un utilisateur standard, elles échoueraient en raison des droits d'accès insuffisants.Windows Vista et versions ultérieures de Windows améliorent la compatibilité des applications pour ces applications par automatiquement la redirection de ces opérations. Par exemple, les opérations de registre vers le magasin global (HKEY_LOCAL_MACHINE \ Software) sont redirigées vers un emplacement par utilisateur dans le profil de l'utilisateur connu sous le nom de magasin virtuel (HKEY_USERS \ _Classes \ VirtualStore \ Machine \ Software).

  2. Oui, c'est exactement ce qu'il devrait être. Vivez avec Virtualization si vous voulez écrire dans un emplacement impactant globalement, ou utilisez des emplacements plus localisés si vous ne le souhaitez pas. De toute façon, c'est invisible pour le lecteur, alors ne vous inquiétez pas.

+0

+1, vous avez inclus un lien :) – slugster

+0

@slugster - Je pense qu'il est important de mettre des liens vers des citations de texte ou d'autres échantillons de personnes/blogs. –

+0

mais cela ne signifie-t-il pas qu'un futur utilisateur interrogeant le même emplacement dans hklm n'obtiendra pas la valeur qui réside dans l'emplacement actuel des utilisateurs? Ok, je vais le tester quand même .. – nawfal

Questions connexes