Vista中提升的进程不会覆盖文件

时间:2009-09-04 10:52:06

标签: c++ windows uac

我正在尝试在Vista上使用ShellExecuteEx和lpVerb =“runas”从另一个主机进程运行提升的进程,例如file_copier.exe。它显示UAC对话框并运行提升,并将文件复制到“危险”文件夹,但它不会覆盖现有文件(exe)。

我在这里读到:http://www.codeproject.com/KB/vista-security/UAC__The_Definitive_Guide.aspx UAC实际上并没有覆盖现有文件,而是将新文件存储在某种缓存中。但我无法弄清楚(如果是这种情况),如何使实际覆盖现有文件。任何帮助表示赞赏。

2 个答案:

答案 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进程完成之前返回。因此后续进程无法更新正在运行的文件。谢谢你的回答,基里尔!