没有管理权限,QProcess无法从exe启动maintenancetool

时间:2018-10-10 17:34:47

标签: c++ windows qt

我从我的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 );

1 个答案:

答案 0 :(得分:0)

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

Qt的maintenancetool.exe似乎根本不要求管理员特权,这是针对3.0.2(我使用的版本)报告的错误,并且已在3.0.4中修复。