我可以从非虚拟化应用程序访问Windows Virtual Store中的文件和注册表项吗?

时间:2013-01-10 19:09:15

标签: c# windows-7 uac registry-virtualization

我有一个'遗留'XP应用程序,它在[ProgramFiles] \ [Application]文件夹中写入文件,并在HKLM \ Software \ [Application]路径中写入注册表项。在Windows Vista或Windows 7中运行应用程序时,文件和注册表项将改为Virtual Store。没关系;它还没有破坏任何东西。

现在,我们已经在.NET中重写了该应用程序。它只在“安全”,用户范围的位置读取和写入文件,并且我们使用指定了requestedExecutionLevel的应用程序清单,以禁用注册表虚拟化。

当用户升级到最新版本时,我们希望通过从以前虚拟化的文件和注册表设置导入设置来保持与旧应用程序的兼容性。

所以,问题是:有没有办法从其清单中指定requestedExecutionLevel的应用程序访问虚拟存储中的文件和注册表项?

1 个答案:

答案 0 :(得分:1)

我想我已经把这个问题打开了足够长的时间。以下是我的发现。

似乎没有任何方法可以从同一进程访问虚拟存储和“真实”注册表和文件系统。虚拟存储会自动应用于未指定requestedExecutionLevel的Windows应用程序,以及未作为“管理员”启动的应用程序。

然后,答案似乎是一个专门的“迁移”应用程序。此应用程序不会指定 requestedExecutionLevel,从而保证在没有管理权限的情况下启动时,应用程序将被置于“虚拟存储”中。该应用程序分两个阶段运行:

  1. 启动应用程序,无需管理员权限。应用程序将从虚拟存储中读取所需的注册表项和文件系统文件,并将它们保存在某个临时(非虚拟化)位置,如用户的AppData目录。
  2. 使用管理员权限重新启动应用程序。该应用程序实际上可以do this for itself, automatically来简化流程。该应用程序现在可以访问“真正的”注册表和文件系统。该应用程序将保存从虚拟商店备份的注册表项和文件,将它们保存到所需的“真实”位置。
  3. 理想情况下,此应用程序在某种程度上是通用的,在启动期间接受任何用户指定的注册表项和文件作为输入参数。