正如您一样,我还发现了处理 UAC 文件夹虚拟化的问题。我建议一种解决方法,它似乎应该可以工作。
它来自假设提升的进程总是使用原始副本而不是虚拟副本 (CMIIW)。此外,我假设您已处理的设置已提升执行
这个想法是创建一个“通用”进程(非提升,遗留),你的主安装程序应该运行。此过程将在用户选择的文件夹中创建一个文件名,该文件名具有您的程序都知道的名称和内容(例如,test73819704.bin)。如果文件夹被虚拟化,这个文件应该出现在用户 VirtualStore 中,而不应该出现在原始文件中(从安装程序的角度和权限的角度来看)。
所以对于选择的 C:\Program_Files_But_Not_Necessarily 和 Process-1(提升)
- Process-1 确保没有文件 C:\Program_Files_But_Not_Necessarily\test73819704.bin
- 它启动没有提升的 Process-2
- Process-2 创建 C:\Program_Files_But_Not_Necessarily\test73819704.bin 并检查它是否真的存在。如果存在,它将返回一个良好的返回代码,否则返回一个“失败”的代码。
- Process-1 等待 Process-2 并分析结果。如果好,检查 C:\Program_Files_But_Not_Necessarily\test73819704.bin,如果存在,选择“Bingo!没有发生虚拟化”,如果不存在,“不好,让我们找一些其他的存储位置”。如果 Process-2 中的代码是“失败”的,则向用户显示一些错误消息。
不幸的是,我现在无法测试它,但我想它应该可以工作,并且这背后有一个逻辑,使用 Process-2 你只是模拟你的主程序的行为)