3

我有一个“旧版”XP 应用程序,它在 [ProgramFiles]\[Application] 文件夹中写入文件,并在 HKLM\Software\[Application] 路径中写入注册表项。在 Windows Vista 或 Windows 7 中运行应用程序时,文件和注册表项将写入虚拟存储中。没关系; 它还没有破坏任何东西。

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

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

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

4

1 回答 1

1

我想我已经把这个问题留得够久了。这是我的发现。

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

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

  1. 在没有管理权限的情况下启动应用程序。应用程序将从虚拟存储中读取所需的注册表项和文件系统文件,并将它们保存在某个临时(非虚拟化)位置,例如用户的 AppData 目录。
  2. 重新启动具有管理访问权限的应用程序。应用程序实际上可以自动为自己执行此操作,以简化流程。应用程序现在可以访问“真正的”注册表和文件系统。该应用程序将保存从虚拟存储备份的注册表项和文件,将它们保存到所需的“真实”位置。

理想情况下,此应用程序应该是通用的,在启动期间接受任何用户指定的注册表项和文件作为输入参数。

于 2014-03-07T13:18:09.643 回答