如何提升子进程的权限

时间:2015-08-27 13:36:13

标签: c++ winapi

我想制作一个嵌入了管理员密码的安装程序,这样我就可以让一个简单的用户安装一个包。

我知道这不是一个好的安全措施,但这就是我(我的雇主)强迫我做的事情。

现在,我编写了所有代码,我正在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()返回零(失败)。

GetLastError()返回:Access is denied.

有谁知道为什么?

据我所知,凭据是正确的。

2 个答案:

答案 0 :(得分:1)

好的,如果UAC配置了默认设置,这实际上不应该太难。

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

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

答案 1 :(得分:0)

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

提升子进程的权限仅适用于已禁用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

您可以做的最好的事情是显示用户输入管理员密码的用户界面。