问题描述
问题:谁能向我解释一下如何调用 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 上标有“是”的按钮进行升级!感谢大家的帮助!