2

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

编辑:

事实证明,我有另一个想法来思考我真正遇到的问题。

所以 wtsapi32.dll 在任何情况下都会被加载,即使当我使用 Mstsc.exe 我的服务器时也是如此。

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

我的代码在这里。

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)

我已经重命名了我的问题的标题,因为它与我正在寻找的内容没有任何关系。

谢谢。

4

1 回答 1

4

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

获得活动会话的会话 ID 后,调用WTSQueryUserToken以获取访问令牌。

于 2013-02-28T05:05:10.460 回答