以不同用户身份启动进程
Starting process as different user
我希望有人能帮我解决这个问题!我有一个类似的问题,如描述:模拟标准用户
我希望能够以标准用户身份从以提升的管理员权限(UAC 执行级别:require管理员)运行的应用程序创建一个进程。用户通过从其中一个管理员帐户借用权限来启动应用程序。
我已经成功地获得了该用户的资源管理器.exe进程的句柄,并将其存储在变量m_hExplorerProc中。之后,我按以下步骤进行:
HANDLE hProcToken = NULL;
BOOL success = OpenProcessToken(m_hExplorerProc, TOKEN_QUERY | TOKEN_DUPLICATE | TOKEN_IMPERSONATE | TOKEN_ASSIGN_PRIMARY | TOKEN_ADJUST_PRIVILEGES, &hProcToken);
BOOL lookupRet = LookupPrivilegeValue(NULL, SE_ASSIGNPRIMARYTOKEN_NAME,
&(tokenPrivs.Privileges[0].Luid));
tokenPrivs.PrivilegeCount = 1;
tokenPrivs.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
BOOL adjustRet = AdjustTokenPrivileges(hProcToken, FALSE, &tokenPrivs, 0, NULL, NULL);
lookupRet = LookupPrivilegeValue(NULL, SE_INCREASE_QUOTA_NAME, &(tokenPrivs.Privileges[0].Luid));
tokenPrivs.PrivilegeCount = 1;
tokenPrivs.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
adjustRet = AdjustTokenPrivileges(hProcToken, FALSE, &tokenPrivs, 0, NULL, NULL);
HANDLE hDuplicatedToken = NULL;
success = DuplicateTokenEx(hProcToken,
TOKEN_QUERY | TOKEN_DUPLICATE | TOKEN_IMPERSONATE | TOKEN_ASSIGN_PRIMARY | TOKEN_ADJUST_PRIVILEGES,
NULL,
SECURITY_IMPERSONATION_LEVEL::SecurityImpersonation,
TOKEN_TYPE::TokenPrimary,
&hDuplicatedToken);
int err = 0;
if(FALSE == success)
err = GetLastError();
LPCTSTR appName = L"C:\testapp.exe";
PROCESS_INFORMATION procInfo;
ZeroMemory(&procInfo, sizeof(procInfo));
STARTUPINFO startupInfo;
ZeroMemory(&startupInfo, sizeof(startupInfo));
startupInfo.cb = sizeof(startupInfo);
startupInfo.wShowWindow = SW_NORMAL;
startupInfo.dwFlags = STARTF_USESHOWWINDOW;
success = CreateProcessAsUser(hDuplicatedToken, appName, NULL, NULL, NULL, FALSE,
NORMAL_PRIORITY_CLASS | CREATE_DEFAULT_ERROR_MODE,
NULL, L"C:\", &startupInfo, &procInfo);
if(FALSE == success)
err = GetLastError();
进程未创建,最后一个错误是 1314,转换为:"客户端不持有所需的权限"。
在此代码中,我只是尝试执行一个虚拟应用程序,但我最终想运行该用户选择为默认值的浏览器。是否有人知道我做错了什么,或者可能建议我的问题的替代解决方案?
我知道
回答你自己的问题并不酷,但三个月过去了,仍然没有人提出答案。
我无法使用函数CreateProcessAsUser解决上述问题,但是我偶然发现了一种使用IShellDispatch2接口的ShellExecute的替代方法,该方法使您能够以当前交互式用户的身份启动程序。完整的代码可以在以下位置找到:https://code.google.com/p/mulder/source/browse/trunk/Utils/nsis_stdutils/Contrib/StdUtils/ShellExecAsUser.cpp?r=327
我希望这对有类似问题的人有所帮助!
我知道
这个问题很老了,但我想补充一些有用的东西(我认为)。如果要使用CreateProcessAsUser
则需要特权,这可以通过模拟强大的令牌来获取。有关详细信息,请参阅此答案。
相关文章:
- 在挂钩启动新线程时解除挂钩进程
- 如何制作启动 Python 脚本的 linux 后台进程(在 c 中)
- 由 JOB 中的进程启动的子进程是否可以将 JOB 属性设置为脱离作业?
- 通过服务启动进程后,从SHGetKnownFolderPath 0x80070005错误
- 如何在启动时将 gdbserver 附加到进程?
- 在C++中启动进程时隐藏命令提示符
- 如何正确启动进程并转发 stdin/stdout/stderr
- 以不同用户身份启动进程
- 使用 posix_spawn 启动进程
- 当java作为服务运行时,从java启动进程
- 当用std::system启动进程时,我可以指定一个工作目录吗
- 在窗口错误中使用QProcess启动进程:"Timers can only be used with threads started with QThread"
- 创建进程 我无法启动进程
- Windows 7或Windows 2008如何在本地系统帐户或系统上下文中启动进程(从桌面应用程序)
- 在派生的线程中启动进程
- Windows服务启动进程结束通知(20032008)
- 无法使用参数启动进程
- 提示重新启动进程以获得管理权限
- 如何在 C、C++ 的 Linux 操作系统上启动进程
- 在linux上用c++启动进程,使用环境变量c++