7

我无法理解 Vista 和/或 Windows 7 中注册表操作的 VirtualStore 虚拟化。我认为在以标准用户身份运行时尝试将某些内容写入HKEY_LOCAL_MACHINE根目录会提示 Windows 虚拟化操作并写入HKEY_CURRENT_USER/Classes/VirtualStore/机器代替。我已经看到几个较旧的应用程序的行为完全一样。

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

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

4

1 回答 1

3

MSDN 文章Windows Vista 中的注册表虚拟化解释了某些类别的进程禁用了虚拟化:

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

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

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

于 2011-01-23T23:43:15.280 回答