L'écriture à HKEY_LOCAL_MACHINE de .Net ne soit pas virtualisé dans Vista ou Windows 7?

StackOverflow https://stackoverflow.com/questions/4777228

  •  23-10-2019
  •  | 
  •  

Question

J'ai du mal à comprendre la virtualisation VirtualStore des opérations de registre dans Vista et / ou Windows 7. Je pensais essayer de écrire quelque chose dans le HKEY_LOCAL_MACHINE root lors de l'exécution en tant qu'utilisateur standard inciterait Windows virtualiser la opération et écrire à HKEY_CURRENT_USER / Classes / VirtualStore / MACHINE à la place. Je l'ai vu plusieurs anciennes applications se comportent exactement comme ça.

Cependant, en essayant de reproduire ce comportement en C # et .Net4, l'opération d'écriture à HKLM échoue juste avec UnauthorizedAccessException à la place. Y at-il un moyen de la virtualisation de la force?

Pour donner un contexte à la question: Je suis en train de lire et de manipuler les clés de registre créées à l'origine par une autre application héritée. Dans Vista ou Windows 7 ceux-ci seront situés dans le VirtualStore. Je voudrais utiliser la même logique d'accès au registre à la fois pour Windows XP et ci-dessus et pensais que mes opérations de registre seraient virtualisés tout de même que les opérations de l'application héritée (et fonctionneraient sur les mêmes touches, à cause de cela). Cela ne fonctionne pas comme prévu et le seul que je sais La solution consiste à accéder spécifiquement le chemin VirtualStore, si l'utilisateur est en cours d'exécution Vista ou 7 et a UAC activé ... semble laid, mais, surtout si Microsoft décide de modifier le comportement de virtualisation dans les versions futures de Windows.

Était-ce utile?

La solution

L'article MSDN Registre de virtualisation dans Windows Vista explique que certaines classes des processus ont virtualisation désactivé:

  • Processus 64 bits
  • Exécutables qui ont une requestedExecutionLevel spécifiée dans le document
  • et quelques autres; consultez l'article pour plus de détails

Une ou les deux des deux premiers sont généralement vrai pour une application .NET (en raison du manifeste par défaut fourni par le compilateur). Vous devez supprimer le manifeste (afin que vos regards d'application comme une application héritée) afin de permettre à la virtualisation, mais ce serait une mauvaise idée (pour la compatibilité avec Windows avant). Au lieu de cela, simplement supposer que votre application n'est pas virtualisé sur Vista (et versions ultérieures) et agir en conséquence.

En outre, l'article met en garde que « Microsoft a l'intention de supprimer cette forme de virtualisation des versions futures du système d'exploitation Windows ... il est impératif votre application ne prend pas une dépendance matérielle de la présence de la virtualisation dans le système. » Quel que soit le code que vous écrivez doit prévoir que la clé VirtualStore peut ne pas exister sur une version future de Windows.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top