从.Net写入HKEY_LOCAL_MACHINE不会在Vista或Windows 7中虚拟化?

时间:2011-01-23 23:16:57

标签: c# registry virtualstore

我无法理解Vista和/或Windows 7中注册表操作的VirtualStore虚拟化。我想在以标准用户身份运行时尝试在 HKEY_LOCAL_MACHINE 根目录中写入内容会提示Windows虚拟化操作并写入 HKEY_CURRENT_USER / Classes / VirtualStore / MACHINE 。我见过几个较旧的应用程序就像那样。

但是,当尝试在C#和.Net4中复制该行为时,对HKLM的写入操作失败,而是以 UnauthorizedAccessException 。有没有办法强迫虚拟化?

给出一些问题的背景:我正在尝试阅读和操作最初由另一个遗留应用创建的注册表项。在Vista或Windows 7中,这些将位于VirtualStore中。我想为WinXP及以上版本使用相同的注册表访问逻辑,并认为我的注册表操作将与旧版应用程序中的操作进行虚拟化(并且会因为相同的键而操作)。这不能按预期工作,我知道的唯一解决方法是专门访问VirtualStore路径,如果用户运行Vista或7并启用了UAC ......看起来很难看,尤其是如果Microsoft决定在未来的Windows版本中更改虚拟化行为。

1 个答案:

答案 0 :(得分:3)

MSDN文章Registry Virtualization in Windows Vista解释了某些类别的进程已禁用虚拟化:

  • 64位进程
  • 在清单
  • 中指定了requestedExecutionLevel的可执行文件
  • 和其他一些人;查看文章了解详情

前两个中的一个或两个通常适用于.NET应用程序(由于编译器提供的默认清单)。您必须删除清单(以便您的应用程序看起来像一个遗留应用程序)才能启用虚拟化,但这是一个坏主意(为了向前兼容Windows)。相反,只是假设您的应用程序未在Vista(及更高版本)上虚拟化并继续进行。

此外,文章警告说“微软打算从未来版本的Windows操作系统中删除这种形式的虚拟化......你的应用程序必须不依赖于系统中虚拟化的存在。”无论您编写什么代码,都应该预期未来版本的Windows上可能不存在VirtualStore密钥。