无法在远程会话中获取用户令牌

时间:2013-02-06 08:20:17

标签: winapi token

所以我想使用LoadLibrary和GetProcAddress wtsapi32.dll在我的服务器上使用Windows Server 2008调用WTSQueryUserToken()。 当我走到服务器并执行该程序时,可以显式加载文件而不会出现问题。 但是,当我Mstsc.exe访问我的服务器并执行相同的操作时,它最终导致GetProcAddress()失败并返回GetLastError()中的错误代码2。 wtsapi32.dll确实与远程桌面服务API有关,但我不知道如何跟踪这个问题。 任何提示都将得到真正的赞赏。 提前致谢。

修改

事实证明,我有另一个想法,即我真正遇到麻烦。

所以wtsapi32.dll在任何情况下都被加载,即使我的服务器是Mstsc.exe。

真正的问题是,当我Mstsc.exe服务器时,WTSQueryUserToken()总是失败并且FALSE返回 ONLY 。我的服务器操作系统是Windows Server 2008.桌面上的WTSQueryUserToken()使用的是Windows 7,工作正常。

我的代码就在这里。

HANDLE hTokenImperson = nullptr;

HMODULE hModWtsapi32 = LoadLibrary(TEXT("wtsapi32.dll"));
HMODULE hModKernel32 = LoadLibrary(TEXT("kernel32.dll"));
auto lpfnWTSQueryUserToken = reinterpret_cast<bool(*)(ULONG, PHANDLE)>(GetProcAddress(hModWtsapi32, "WTSQueryUserToken"));
auto lpfnWTSGetActiveConsoleSessionId = reinterpret_cast<DWORD(*)(void)>(GetProcAddress(hModKernel32, "WTSGetActiveConsoleSessionId"));

// dwSessionId is not 0.
dwSessionId = lpfnWTSGetActiveConsoleSessionId(); 

// FALSE returns only when I do mstsc.exe.
// Works well when I walk to my server and execute this application.
lpfnWTSQueryUserToken(dwSessionId, &hTokenImperson)

我已经重新命名了我的问题标题,因为它不需要对我正在寻找的东西做任何事情。

感谢。

1 个答案:

答案 0 :(得分:2)

WTSGetActiveConsoleSessionId返回当前附加到物理控制台(MSDN)的会话。 如果您需要获取远程会话的令牌,可以先调用WTSEnumerateSessions并查找活动会话。

BOOL WTSEnumerateSessions(
  _In_   HANDLE hServer,
  _In_   DWORD Reserved,
  _In_   DWORD Version,
  _Out_  PWTS_SESSION_INFO *ppSessionInfo, // <------
  _Out_  DWORD *pCount
);

检查PWTS_SESSION_INFO结构的 State

获取活动会话的会话ID后,请致电WTSQueryUserToken以获取访问令牌。