QProcess 如何请求 Windows UAC 使用 runAs 绕过来自管理员帐户的管理员级别命令的密码

问题描述

问题:谁能向我解释一下如何调用 UAC?此时,我需要提升 Powershell 会话。我过去使用过或在这里看到的所有其他方法都需要密码。我需要绕过密码。请参阅以下函数下的说明以获取更多信息:

void MainWindow::execute_command(QString param)
{
    // In this case assume param is simply Remove-LocalUser "User name"
    QProcess *process = new QProcess();
    QStringList params;
    QString command = "powershell";
    params << "-c" << "start-process powershell.exe -Verb runAs " << param;
    process->start(command,params);
    process->waitForFinished();
    process->kill();
}

如果我尝试任何管理员级别的命令,它无法在 Powershell 中执行,因为访问被拒绝。我知道可以提升用户访问权限的各种方法。但据我所知,所有这些都需要用户输入密码。任何运行此程序的帐户都将认为管理员或域管理员;所以,我希望通过调用 UAC 能让用户确认并接受提升请求以通过管理员 Powershell。

解决方法

我阅读您的问题的方式是您希望完全避免 UAC 提示。只要您在系统上启用了 UAC 的情况下从交互式登录会话中运行程序,这是不可能的。

登录该帐户可以避免需要输入管理员密码,但您仍然需要 UAC 提示,以便使用提升的管理员令牌而不是大多数程序使用的受限令牌运行。

>

请注意,如果您的程序是一项服务,则该程序将在不提供拆分用户令牌的会话中运行,而是所有程序都将使用完整令牌运行(尽管大多数权限仍将被禁用,直到/除非进程启用它们)。

,

所以,@RbMm 是正确的,我的代码是错误的:

void MainWindow::execute_command(QString param)
{
     SHELLEXECUTEINFO ShExecInfo = {0};
     ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
     ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
     ShExecInfo.hwnd = NULL;
     ShExecInfo.lpVerb = "runas";
     ShExecInfo.lpFile = TEXT("powershell.exe");
     ShExecInfo.lpParameters = TEXT("stuff..");
     ShExecInfo.lpDirectory = NULL;
     ShExecInfo.nShow = SW_SHOW;
     ShExecInfo.hInstApp = NULL;
     ShellExecuteEx(&ShExecInfo);
     WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
}

召唤 UAC 提示,它允许我根据用户是否单击 UAC 上标有“是”的按钮进行升级!感谢大家的帮助!