如何提升子进程的权限

How to elevate privileges for child process

本文关键字:权限 子进程 何提升      更新时间:2023-10-16

我想做一个有admin密码嵌入其中的安装程序,这样我就可以让一个简单的用户安装一个包。

我知道这不是很好的安全措施,但这是我(雇主)强迫我做的。

现在,我已经写了所有的代码,我正在Win7虚拟机上测试它。

它可以作为管理员运行,但不能作为简单用户运行(这是我想要的)。

这是我的代码:

    PROCESS_INFORMATION pInfo;
    STARTUPINFOW sInfo = { 0 };
    sInfo.cb = sizeof(STARTUPINFOW);
    sInfo.lpReserved = NULL;
    sInfo.lpReserved2 = NULL;
    sInfo.cbReserved2 = 0;
    sInfo.dwX = 0;
    sInfo.dwY = 0;
    sInfo.lpDesktop = NULL;
    sInfo.lpTitle = NULL;
    sInfo.dwFlags = STARTF_USESHOWWINDOW;
    sInfo.dwFillAttribute = 0;
    sInfo.wShowWindow = SW_HIDE;
    CString cmdLine(_T("elevPrivInstaller.exe /q /norestart"));
    BOOL ret = ::CreateProcessWithLogonW(_T("IEUser"), NULL, _T("Passw0rd!"), 0, NULL, (LPWSTR)(LPCTSTR)cmdLine, 0, NULL, NULL, &sInfo, &pInfo);

CreateProcessWithLogonW()返回0(失败)。

GetLastError()返回:Access is denied.

有人知道为什么吗?

在我看来,凭证是正确的。

好吧,这应该不会太难,只要UAC是用默认设置配置的。

我认为CreateProcessWithLogonW()失败的原因是目标可执行文件需要提升。如果你运行一个而不是配置为需要提升的可执行文件,它应该可以工作。

此时,您正在属于管理用户的有限令牌上下文中运行。如果你然后尝试启动一个提升的进程,例如,使用ShellExecute(),你仍然会得到一个UAC对话框-但它将是一个是/否对话框;用户不需要输入密码

经过许多人的帮助和我做的一些测试,结果如下:

提升子进程的权限仅在禁用UAC的情况下有效。(

信息如下:http://blogs.msdn.com/b/cjacks/archive/2010/02/01/why-can-t-i-elevate-my-application-to-run-as-administrator-while-using-createprocesswithlogonw.aspx

你能做的最好的是显示用户输入管理员密码的UI。