如何在 Windows 上通过 QProcess 启动提升的子进程?

Posted

技术标签:

【中文标题】如何在 Windows 上通过 QProcess 启动提升的子进程?【英文标题】:How to start an elevated subprocess through QProcess on Windows? 【发布时间】:2017-07-12 11:49:47 【问题描述】:

我正在使用 QProcess 类来启动一个执行任务的子进程。有时该进程需要管理员权限。在 Linux 上,我只需通过 pkexec 运行它,一切正常。如何在 Windows 上实现相同的效果?

明确一点:我希望能够在运行时决定是否以管理员身份运行它。我还需要能够通过 stdin/stdout 与进程通信。

或者,把它放在代码中:

void modifyArgsForRoot(QString &program, QStringList &args)

#if defined(Q_OS_LINUX)
    args.prepend(program);
    program = "pkexec";
#elif defined(Q_OS_WIN32)
    // what do I put here? //////////////////////////////
#endif


void foo()

    QProcess p;
    QString program;
    QStringList arguments;
    // ......
    if (!hasWriteAccessToCertainDir())
        modifyArgsForRoot(program, arguments);

    p.start(program, arguments);

【问题讨论】:

您是否检查过有关从 cmd 或 powershell 运行提升的可执行文件的其他答案?我认为您必须针对特定系统进行处理,就像在 linux 上一样。 是的,他们都没有给我一个满意的答案。大多数建议使用 ShellExecute 函数,但我想通过 QProcess。 pkexec 已经有点像黑客了,不是吗? 不,这不是黑客攻击。 【参考方案1】:

您可能想看看runas command,它在某种程度上是pkexec for Windows 的替代品。

例如,你可以试试

#elif defined(Q_OS_WIN32)
    args.prepend(program);
    args.prepend("/user:mymachine\administrator"); // Change accordingly
    args.prepend("/noprofile"); // See link above
    program = "runas";
#endif

编辑:您也可以尝试使用清单,如here 所述。

【讨论】:

已经试过了,不行。 AFAIK runas 无法弹出 UAC 提示,而是想从控制台读取管理员密码。

以上是关于如何在 Windows 上通过 QProcess 启动提升的子进程?的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 上使用 QProcess 读取 GDAL /vsistdout/

如何在 QProcess 中使用 cmd.exe 命令

如何使用 QProcess 通过 Ping 检测“网络不可达”?

如何确定在 Linux 上使用 Qt4 终止 QProcess 的信号?

在 Windows 上向 QProcess 发送 Ctrl+C

需要 virtenv 时如何运行 QProcess?