2011-10-12 74 views
7

我想调用更新程序来检查更新(而不是实际执行更新,但只检查是否有更新)。我想在背景中默默地做到这一点。如果有更新,我会要求用户提升权限并运行更新。检查包括读取应用程序目录中的文件,并将其中找到的版本与网站上的版本进行比较。如何在没有提升的情况下执行应用程序?

我该如何在没有提升的情况下运行它才能检查? QProcess::start()失败,因为它需要提升的权限和ShellExecute只适用于如果我添加“runas”动词出于同样的原因(我只想要,如果实际上将在该目录中写入,即我想执行更新)。我猜我需要添加某种清单,但我不知道它的内容。

回答

10

因此,事实证明,我有另一个错误,导致无升级运行分支在所有情况下运行。我在帖子中描述的模型工作。为避免Windows推断提升权限的需要,您需要添加清单资源。 (例如,如果你的应用程序exe文件的名称中包含单词“更新”将触发)

清单的内容如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> 
     <security> 
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> 
       <requestedExecutionLevel level="asInvoker" uiAccess="false" /> 
      </requestedPrivileges> 
     </security> 
    </trustInfo> 
</assembly> 

到您的.exe取决于它编译你的编译器和环境,所以我只显示我的:Qt Creator的和MinGW-GCC:

创建的资源包含以下内容的RC文件:

1 24 DISCARDABLE manifest.xml 

该RC文件添加到您的.pro这样的:

win32:RC_FILE = resources.rc 

在此之后,ShellExecute的无动词放慢参数将不抬高运行,并使用“运行方式”将抬高运行它。

+0

这大致就是我所说的。 –

+3

我更喜欢这个答案。少说话,多写代码。 –

0

我建议使用这些方案之一:

  • 把该文件在用户的配置文件,而不是
  • 在这情况下,该文件的
  • 将内容复制到用户的配置文件的只读模式,然后运行应用程序的路径QProcess::start()
  • 包括.qrc文件内部的文件,然后将其解压到用户的个人资料中的失败的情况下读取或运行QProcess::start()
4

由于某种原因,当应用程序请求时会出现提示提示。您可以使用应用程序清单来控制它。有关如何添加清单的详细信息,请参阅Create and Embed an Application Manifest (UAC)文章。

我建议你如下:

  1. 独立的更新更新检查,让他们在不同的.exe文件。
  2. UpdateChecker.exe不需要管理员权限,因此requestedExecutionLevel清单中的元素具有asInvoker级别。
  3. Updater.exe需要管理员权限,因为它会将更新的应用程序文件写入Program Files。因此requestedExecutionLevel其清单元素有requireAdministrator级别。

在你的程序中,你可以以任何你喜欢的方式启动UpdateChecker.exe。要启动Updater.exe,您必须使用ShellExecute;如果应用程序具有清单(并强烈建议嵌入清单),则应用程序需要管理员权限时,它将显示UAC提示提升。没有必要使用runas动词。

或者,您可以检查更新是否适用于您的主应用程序。只有在服务器上有新版本时才启动Updater.exe。


另一个选择是使Updater.exe都检查更新并应用它,如果有更新,就像现在一样。在这种情况下,Updater.exe的清单中应该有asInvoker级别。当它启动时,没有参数,它检查服务器上是否有新版本。如果它找到较新的版本,则以管理员权限重新启动自身并传递一个命令行参数,例如/doUpdate,它指示它执行实际更新。

为了重新启动本身提升,它必须使用ShellExecute函数和runas动词,因为ShellExecute将无法​​自动检测到您的Updater.exe现在需要管理权限。

请记住,在Windows XP和Windows Vista/7中,runas动词的含义不同,因此如果您要支持以前版本的Windows,则应该处理这种情况。我描述的第一种方法可以在Windows XP上运行,无需额外处理。

+0

感谢您的详细解答!我将在周一进一步调查这个问题,并可能会采用分裂解决方案。我检查了wyUpdate(商业更新程序)中的清单,该清单既执行检查和更新,也将其设置为尽可能最低的“asInvoker”权限级别。我可能忽略了一些东西,它可能按我原先的计划工作。我会告诉你。 –

+0

我做过了,如果您有兴趣,请查看下面的答案。 –

+0

@TamásSzelei感谢发布更新。 –

相关问题