所以我想使用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)
我已经重新命名了我的问题标题,因为它不需要对我正在寻找的东西做任何事情。
感谢。
答案 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
以获取访问令牌。