问题描述
我们有将在Service会话和Interactive会话上工作的模块,它们被编译为32位,它们将在Windows XP(VISTA)64位环境下作为WOW64工作.
当服务会话模块执行Interactive模块时,顺序为:
- 获取会话ID.
- 我们调用WTSQueryUserToken以在具有本地系统帐户的NT服务进程中获取用户令牌.
2-1.当API的第一个参数(SessionId)为0时,它成功.
2-2.当API的第一个参数(SessionId)非0时,它总是失败.此外,GetLastError返回ERROR_INSUFFICIENT_BUFFER(122L). - 使用DuplicateTokenEx()进行交互式会话的重复令牌
- 在我们原始的源代码中(很抱歉,这里没有一个附件),它将进一步使用CreateProcessAsUser()
- Get session id.
- We call WTSQueryUserToken to get user token in NT service process, which has LocalSystem account.
2-1. When first parameter of the API (SessionId) is 0, it succeeds.
2-2. When first parameter of the API (SessionId) is non-0, it always fails. Further, GetLastError returns ERROR_INSUFFICIENT_BUFFER (122L). - Duplicate token for Interactive session with DuplicateTokenEx()
- In our original source codes (sorry, not the one attach here), it will further execute Interactive session module with CreateProcessAsUser()
注意:Windows XP 64位版本上出现问题.在Windows XP 32和Vista 32平台上不会发生. 我们希望您的帮助,看看XP 64平台上的WTSQueryUserToken()是否有问题?我们附上了原始代码的简化代码.
HANDLE hToken = NULL;
if(:: WTSQueryUserToken(dwSessionID,& hToken)== FALSE)
{{br> DWORD dwError =: :GetLastError();
TRACE2("WTSQueryUserToken失败:0x%08X(%d)",dwError,dwError);
TRACE2("hToken:0x%08X(%d)",hToken ,hToken);
}}
else
{
TRACE0("WTSQueryUserToken成功");
}}
HANDLE hPrimaryToken = NULL;
if(!:: DuplicateTokenEx(hToken,TOKEN_ALL_ACCESS,NULL,SecurityImpersonation,TokenPrimary,& hPrimaryToken))
{
TRACE0(失败的DuplicateTokenEx()");
:: CloseHandle(hToken);
返回NULL;
}
:: CloseHandle(hToken); 跨度>
if(hPrimaryToken == INVALID_HANDLE_VALUE)
{
TRACE0("hPrimaryToken为INVALID_HANDLE_VALUE");
:: CloseHandle(hPrimaryToken);
返回NULL;
}
:: TRACE2("hPrimaryToken:0x%08X(%d)",hPrimaryToken,hPrimaryToken);
返回hPrimaryToken;
}
推荐答案
这篇关于无法通过WTSQueryUserToken()获取用户令牌的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!