本文介绍了无法通过WTSQueryUserToken()获取用户令牌的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

限时删除!!

我们有将在Service会话和Interactive会话上工作的模块,它们被编译为32位,它们将在Windows XP(VISTA)64位环境下作为WOW64工作.

当服务会话模块执行Interactive模块时,顺序为:

  1. 获取会话ID.
  2. 我们调用WTSQueryUserToken以在具有本地系统帐户的NT服务进程中获取用户令牌.
    2-1.当API的第一个参数(SessionId)为0时,它成功.
    2-2.当API的第一个参数(SessionId)非0时,它总是失败.此外,GetLastError返回ERROR_INSUFFICIENT_BUFFER(122L).
  3. 使用DuplicateTokenEx()进行交互式会话的重复令牌
  4. 在我们原始的源代码中(很抱歉,这里没有一个附件),它将进一步使用CreateProcessAsUser()
  1. Get session id.
  2. 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).
  3. Duplicate token for Interactive session with DuplicateTokenEx()
  4. 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()获取用户令牌的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

1403页,肝出来的..

09-08 04:45