以不同用户身份启动进程

Starting process as different user

本文关键字:启动 进程 身份 用户      更新时间:2023-10-16

我希望有人能帮我解决这个问题!我有一个类似的问题,如描述:模拟标准用户

我希望能够以标准用户身份从以提升的管理员权限(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则需要特权,这可以通过模拟强大的令牌来获取。有关详细信息,请参阅此答案。