我想制作一个嵌入了管理员密码的安装程序,这样我就可以让一个简单的用户安装一个包。
我知道这不是一个好的安全措施,但这就是我(我的雇主)强迫我做的事情。
现在,我编写了所有代码,我正在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.
有谁知道为什么?
据我所知,凭据是正确的。
答案 0 :(得分:1)
好的,如果UAC配置了默认设置,这实际上不应该太难。
我认为CreateProcessWithLogonW()失败的原因是目标可执行文件需要提升。如果你改为运行一个不配置为要求提升的可执行文件,它应该可以工作。
此时,您正在属于管理用户的有限令牌的上下文中运行。如果您然后尝试启动提升的进程,例如,使用ShellExecute(),您仍将获得一个UAC对话框 - 但它将是是/否对话框;用户无需输入密码。
答案 1 :(得分:0)
在许多人的帮助和我做过的一些测试之后,结果如下:
提升子进程的权限仅适用于已禁用UAC。 :(
您可以做的最好的事情是显示用户输入管理员密码的用户界面。