【问题标题】:QProcess cannot start maintenancetool from exe without administrative privileges没有管理权限,QProcess 无法从 exe 启动维护工具
【发布时间】:2018-10-10 17:34:47
【问题描述】:

我从我的 app.exe 调用 QtIFW 的 maintenancetool.exe 来检查这样的更新:

QString command = QString( "\"C:/Program Files/My Application/maintenancetool.exe\" --checkupdates" );
QProcess process;
process.start( command );
process.waitForFinished();

if ( process.error() != QProcess::UnknownError )
{
    return;
}

QByteArray data = process.readAllStandardOutput();

如果我运行我的应用程序,它会在调用maintenancetool.exe --checkupdates 时显示管理权限对话框,就像任何其他需要权限的应用程序一样,我同意接受。然后,我的应用程序挂了一段时间,最后 process.error() 返回了一个QProcess::Timedout 错误。

如果我以管理权限运行我的应用程序一切正常。

有没有办法使用QProcess::start 从另一个不需要管理权限的 exe 中运行需要管理权限的 exe?当然,我试图避免用户在每次运行 myapp.exe 时都打开管理权限对话框(仅在它查找更新时)。

我不能使用QProcess::startDeattached,因为我必须检索输出。

注意:如果 myapp.exe 和 maintenancetool.exe 未安装在 Program Files 中,而是安装在任何其他常规文件夹(例如 C:/myfolder)中,则一切正常。

编辑

我发现问题是当 myapp.exe 调用 maintenancetool.exe 并请求管理权限时,maintenancetool.exe 需要很长时间才能完成(33 秒)。

有趣的是默认等待时间是 30 秒

bool waitForFinished(int msecs = 30000);

所以,如果我这样称呼它,它可以工作,但我必须等待 33 秒!

process.waitForFinished( 60000 );

【问题讨论】:

  • 很高兴听到您的问题已解决。考虑添加该解决方案作为对您问题的自我回答。
  • 你应该检查QProcess::waitForFinished()的返回值。看来您正在使用在线安装程序,对吗?对于管理员权限问题,您可以使用管理员权限安装您的应用程序。那将在安装程序的配置文件中。你可能想看看这个:github.com/Skycoder42/QtAutoUpdater.

标签: c++ windows qt


【解决方案1】:

(代表问题作者发布解决方案)

看来Qt的maintenancetool.exe根本不应该要求管理员权限,这是3.0.2(我使用的版本)报告的一个错误,并且在3.0.4中已修复。

【讨论】: