如何提升子进程的权限
How to elevate privileges for child process
我想做一个有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。
相关文章:
- 终止 QProcess 不会终止子进程
- 什么时候最好在子进程中使用 CPU 或 I/O 密集型代码 [ C++ ]
- 子进程更新共享 mmap 内存,但父进程没有更改
- 使用 waitpid 时等待子进程终止
- 使用重定向标准处理子进程中的 kbhit
- 由 JOB 中的进程启动的子进程是否可以将 JOB 属性设置为脱离作业?
- 是否可以将子进程的 stdout 重定向到父进程中的另一个文件?
- kill() 总是返回 0(成功),即使在子进程已经结束之后?
- 父进程和子进程之间的 POSIX 信号量
- 检测到由于操作系统内存不足而导致子进程终止
- 使用system()创建独立的子进程
- 从stdin读取时子进程挂起(fork/dup2竞争条件)
- 在 Bash 脚本中处理来自子进程的信号
- Qt C++ - 如何成功将数据传递给子进程?
- C++ 窗口本地系统模拟在子进程中失败
- 将类型化数组写入子进程 stdin 无法正常工作
- 将 nodejs 脚本作为子进程执行(而不是从其他脚本执行)
- 使用信号检测子进程何时终止的最佳方法是什么?
- 如何使用特定的访问权限启动子进程
- 如何提升子进程的权限