【问题标题】:Writing to HKEY_LOCAL_MACHINE from .Net doesn't get virtualized in Vista or Windows 7?从 .Net 写入 HKEY_LOCAL_MACHINE 不会在 Vista 或 Windows 7 中虚拟化?
【发布时间】:2011-06-14 05:11:11
【问题描述】:

我无法理解 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 版本中更改虚拟化行为。

【问题讨论】:

    标签: c# registry virtualstore


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢,这解释了我想知道的一切:) ...此外,如果 Microsoft 决定删除或更改此注册表虚拟化,那么旧版应用程序可能无论如何都无法运行 - 所以我的无论如何,应用程序将不再有任何用途。
    猜你喜欢
    • 2010-12-14
    • 2010-10-16
    • 1970-01-01
    • 2011-10-30
    • 2011-08-24
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多