【发布时间】:2015-10-30 10:19:17
【问题描述】:
我的目标是在使用目标令牌启动用户模式进程之前,将privileges 从一个主用户令牌复制到另一个。我创建了一个示例伪代码来说明我需要完成的工作。
以下将从本地系统服务运行:
//dwSessionId = user session ID to run process in
HANDLE hToken1 = NULL; //Source user token
WTSQueryUserToken(dwSessionId, &hToken1);
HANDLE hSelfToken = NULL; //User token for system service
HANDLE hToken2 = NULL; //Adjusted self-token
OpenProcessToken(::GetCurrentProcess(), TOKEN_ALL_ACCESS, &hSelfToken);
DuplicateTokenEx(hSelfToken, TOKEN_ASSIGN_PRIMARY | TOKEN_ALL_ACCESS,
NULL, SecurityIdentification, TokenPrimary, &hToken2);
//Specify user session to run in
SetTokenInformation(hToken2, TokenSessionId, &dwSessionId, sizeof(dwSessionId));
//Now I need to set privileges in 'hToken2' as they are in 'hToken1'
...
//Then use 'hToken2' in CreateProcessAsUser() to start a process
知道如何将权限从hToken1 复制到hToken2?
【问题讨论】:
-
为什么不能直接使用
hToken1创建进程? -
@JonathanPotter:我试过了,但后来
CreateProcessAsUser成功了,但用户进程永远不会启动,我将其退出代码设置为STATUS_DLL_INIT_FAILED或0xC0000142 -
当然可以将
CreateProcessAsUser与hToken1一起使用,而且会更安全 - 除非您尝试在安全桌面上启动该进程? -
@HarryJohnston:安全桌面会发生什么?你的意思是
Winlogon对吧? -
IIRC 安全桌面名为 Winlogon,是的,我认为在用户上下文中运行的进程无法使用它(因此是“安全的”)。我不熟悉细节。但这是我能想到的唯一原因,为什么使用
hToken1可能是不可能的。如果这不是你在做的,那么你真的应该使用hToken1- 如果你发布一个 MCVE(作为一个单独的问题),我希望我们能找出你做错了什么。
标签: c++ c windows winapi kernel32