【问题标题】:QProcess::startDetached blocked by UAC (running an updater)QProcess::startDetached 被 UAC 阻止(运行更新程序)
【发布时间】:2010-12-24 14:16:34
【问题描述】:

我的应用程序中有一个更新功能 - 它会下载并验证安装程序(一个 setup.exe,使用 NSIS 创建)。为了真正开始更新,我一直在做:

QString path = .. absolute path to the downloaded file ...
QProcess::startDetached(path, QStringList());

这在 XP 上运行良好 - 但在 Vista 和 Win7 上,下载完成后没有任何反应。如果我浏览到下载的更新并手动运行它,它工作正常。我假设正在发生的事情是 UAC 在 CreateProcess 时阻止了安装程序,但这是我的知识耗尽的地方。

其他复杂情况 - 当我从命令行运行调试构建时,上述步骤有效 - 我收到 UAC 提示并可以运行安装程序。这是发布版本,从开始菜单/快捷方式开始,有问题 - 我假设从命令 shell 运行时身份验证令牌有所不同。

【问题讨论】:

    标签: qt process uac


    【解决方案1】:

    你也可以使用

    QDesktopServices::openUrl(QUrl::fromLocalFile(path));
    

    可能会令人惊讶和违反直觉,但它可以工作并且更跨平台

    【讨论】:

    • 很棒的解决方案。这实际上在后台调用 ShellExecute。我看到的唯一问题是它不会将 UAC 窗口带到顶部
    【解决方案2】:

    如果您不是管理员并且您在具有“Vista”清单(或没有清单,但 Windows 检测为安装程序(包括 NSIS)的 .exe)的 .exe 上调用 CreateProcess(),则调用失败,您需要使用ShellExecute[Ex]()。如果需要,ShellExecute 将触发 UAC 提示...

    【讨论】:

      【解决方案3】:

      这似乎是一个 Qt 错误,请参阅 QTBUG-9761 ,正确的解决方法是使用 ShellExecute 并将 lpOperation 设置为 runas

      【讨论】:

      • 使用runas动词会强制 UAC提升,如果你不指定动词,ShellExecute会自己算出来...
      【解决方案4】:

      另一种选择是在执行前添加cmd.exe /C。这有效地通过 shell 路由您的执行,因此您确实得到了 UAC 提示符。不利的一面是,如果您的流程失败,您可能无法通过ShellExecute[Ex] 获得尽可能多的信息,但从好的方面来说,您将获得QProcess 的所有功能,如果您使用QDesktopServices::openUrl,您会错过这些功能,您不知道事情是否有效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-21
        • 1970-01-01
        • 1970-01-01
        • 2015-07-18
        • 1970-01-01
        • 2017-02-18
        • 1970-01-01
        相关资源
        最近更新 更多