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

Winapi 无法在远程会话中获取用户令牌,winapi,token,Winapi,Token,因此,我想加载library和GetProcAddress wtsapi32.dll,以便在使用Windows server 2008的服务器中调用WTSQueryUserToken()。 当我实际走到服务器并执行此程序时,可以显式加载文件而不会出现问题。 但是,当我使用Mstsc.exe访问服务器并执行相同操作时,GetProcAddress()失败,错误代码为GetLastError()中的2。 wtsapi32.dll确实与远程桌面服务API有关,但我不知道如何跟踪此问题。 如有任何提示,

因此,我想加载library和GetProcAddress wtsapi32.dll,以便在使用Windows server 2008的服务器中调用WTSQueryUserToken()。 当我实际走到服务器并执行此程序时,可以显式加载文件而不会出现问题。 但是,当我使用Mstsc.exe访问服务器并执行相同操作时,GetProcAddress()失败,错误代码为GetLastError()中的2。 wtsapi32.dll确实与远程桌面服务API有关,但我不知道如何跟踪此问题。 如有任何提示,我们将不胜感激。 提前谢谢

编辑:

事实证明,对于我真正遇到的问题,我有了另一个想法

因此,在任何情况下都会加载wtsapi32.dll,即使我在服务器上运行Mstsc.exe

真正的问题是,当我在服务器上运行Mstsc.exe时,WTSQueryUserToken()总是失败,并返回FALSEONLY。我的服务器操作系统是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)
HANDLE-hTokenImperson=nullptr;
HMODULE hModWtsapi32=加载库(文本(“wtsapi32.dll”);
HMODULE hModKernel32=加载库(文本(“kernel32.dll”);
auto lpfnWTSQueryUserToken=reinterpret_cast(GetProcAddress(hModWtsapi32,“WTSQueryUserToken”);
auto lpfnWTSGetActiveConsoleSessionId=重新解释强制转换(GetProcAddress(hModKernel32,“WTSGetActiveConsoleSessionId”);
//dwSessionId不是0。
dwSessionId=lpfnWTSGetActiveConsoleSessionId();
//FALSE仅在执行mstsc.exe时返回。
//当我走到服务器并执行此应用程序时,效果良好。
lpfnWTSQueryUserToken(dwSessionId和hTokenImperson)
我已经重新命名了我的问题的标题,因为它与我正在寻找的没有任何关系


谢谢。

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

BOOL WTSEnumerateSessions(
  _In_   HANDLE hServer,
  _In_   DWORD Reserved,
  _In_   DWORD Version,
  _Out_  PWTS_SESSION_INFO *ppSessionInfo, // <------
  _Out_  DWORD *pCount
);
boolwtsenumeratessions(
_在uuhandle hServer中,
_在德沃德保留,
_在德沃德版本中,

_Out\PWTS\u SESSION\u INFO*ppSessionInfo,//
WTSGetActiveConsoleSessionId
返回当前连接到物理控制台()的会话。 如果需要为远程会话获取令牌,可以首先调用并查找活动会话

BOOL WTSEnumerateSessions(
  _In_   HANDLE hServer,
  _In_   DWORD Reserved,
  _In_   DWORD Version,
  _Out_  PWTS_SESSION_INFO *ppSessionInfo, // <------
  _Out_  DWORD *pCount
);
boolwtsenumeratessions(
_在uuhandle hServer中,
_在德沃德保留,
_在德沃德版本中,

_Out\PWTS\u SESSION\u INFO*ppSessionInfo,//请显示代码。错误代码2是
Error\u FILE\u未找到
,并且
GetProcAddress
不会设置该错误代码。可能您的错误检查代码是错误的。可能是
LoadLibrary
失败了。但是如果没有代码,我们就无能为力。显示您的LoadLibrary代码。好好看一看美联社,我发现这并没有完全显示我得到的东西,所以我编辑了。当然谢谢你的所有回复。我自己刚开始看这些东西,但如果我问一个愚蠢的问题,请不要激怒我:这会不会因为你要的是ActiveConsole的SessionId而不是远程会话的SessionId而不起作用?请显示代码。错误代码2是
ERROR\u FILE\u NOT\u FOUND
,并且
GetProcAddress
永远不会设置该错误代码。也许您的错误检查代码是错误的。也许是
LoadLibrary
失败了。但是如果没有代码,我们就帮不上忙了。让我们看看您的LoadLibrary代码。好好睡一觉,发现这并没有完全显示我得到了什么,所以我开始了泰德。当然谢谢你的回复。我自己刚刚开始研究这些东西,但如果我问一个愚蠢的问题,请不要激怒我:它会不会因为你要求的是ActiveConsole的SessionId而不是远程会话的SessionId而不起作用?