我很难理解Vista和/或Windows 7中注册表操作的虚拟店虚拟化。我想试图将某些内容写入 hkey_local_machine 作为标准用户运行时的root会提示Windows虚拟化操作并写入 hkey_current_user/class/virtualstore/Machine 反而。我已经看到几个旧应用程序的行为完全如此。

但是,当试图在c#和.net4中复制该行为时,对HKLM的写操作只会失败 未授权的accessexception 反而。有什么办法强制虚拟化吗?

为一个问题提供一些背景:我正在尝试阅读和操纵最初由另一个旧应用程序创建的注册表键。在Vista或Windows 7中,这些将位于VirtualStore中。我想使用相同的注册表访问WinxP及以上的逻辑,并认为我的注册表操作将与Legacy应用程序的操作相同(因此将在相同的键上操作,因此将其虚拟化。这是不按预期工作的,我知道唯一的解决方法是专门访问虚拟店路径, 如果用户正在运行Vista或7,并且启用了UAC不过,...似乎很丑陋,尤其是如果微软决定在未来的Windows版本中改变虚拟化行为。

有帮助吗?

解决方案

MSDN文章 Windows Vista中的注册表虚拟化 解释说,某些类别的流程具有虚拟化禁用:

  • 64位过程
  • 具有在清单中指定的请求的executionlevel的可执行文件
  • 还有其他一些;检查文章以获取详细信息

对于.NET应用程序,前两个通常是正确的(由于编译器支持默认清单)。为了实现虚拟化,您必须删除清单(使您的应用程序看起来像旧应用程序),但这是一个坏主意(对于与Windows的远期兼容性)。取而代之的是,只需假设您的应用程序不会在Vista(以及以后)上虚拟化并相应地进行。

此外,文章警告说:“ Microsoft打算从Windows操作系统的未来版本中删除这种虚拟化形式……必须严格依赖系统中的虚拟化存在。”无论您编写哪种代码,都应该预期在Windows的未来版本上可能不存在VirtualStore密钥。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top