我正在尝试在Vista上使用ShellExecuteEx和lpVerb =“runas”从另一个主机进程运行提升的进程,例如file_copier.exe。它显示UAC对话框并运行提升,并将文件复制到“危险”文件夹,但它不会覆盖现有文件(exe)。
我在这里读到:http://www.codeproject.com/KB/vista-security/UAC__The_Definitive_Guide.aspx UAC实际上并没有覆盖现有文件,而是将新文件存储在某种缓存中。但我无法弄清楚(如果是这种情况),如何使实际覆盖现有文件。任何帮助表示赞赏。
答案 0 :(得分:3)
您在谈论virtualization of file system。要告诉Windows您的程序知道Windows规则,您应该更改manifest file。
向清单添加以下文字:
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!--The ID below indicates application support for Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!--The ID below indicates application support for Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!--The ID below indicates application support for Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
</application>
</compatibility>
答案 1 :(得分:0)
对不起伙计,这只是我的错误。代码是这样的:
ShellExecuteEx(file_copier.exe);
LaunchFreshVersionOfApplication();
实际上,ShellExecuteEx在file_copier.exe进程完成之前返回。因此后续进程无法更新正在运行的文件。谢谢你的回答,基里尔!