【问题标题】:Elevated process in Vista does not overwrite filesVista中提升的进程不会覆盖文件
【发布时间】:2009-09-04 10:52:05
【问题描述】:

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

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

【问题讨论】:

  • 您要写入哪些文件夹?

标签: c++ windows uac


【解决方案1】:

你说的是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:很有帮助!我只想补充一点,"{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" 是 Windows 8 的 GUID(例如,参见 here
【解决方案2】:

对不起,这只是我的错误。代码是这样的:

ShellExecuteEx(file_copier.exe);
LaunchFreshVersionOfApplication();

确实,ShellExecuteEx 在 file_copier.exe 进程完成之前返回。所以后面的进程无法更新正在运行的文件。谢谢你的回答,基里尔!

【讨论】:

  • 那为什么不给基里尔打勾呢?
  • 很高兴,但我的声誉只有 9,投票需要 15,对不起。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-14
  • 2023-03-25
  • 2021-08-20
相关资源
最近更新 更多