C++WTSQueryUserToken函数错误

C++ WTSQueryUserToken Function Error

本文关键字:错误 函数 C++WTSQueryUserToken      更新时间:2023-10-16

我正试图让我的服务以用户身份创建一个进程,但我必须首先获得令牌。现在,由于某种原因,My函数不断返回错误87,即error_INVALID_PARAMETER。有人知道为什么吗?它已经困扰了我几个小时,从我所看到的参数是正确的。谢谢

这是我的代码:

PHANDLE currentToken = 0;
ULONG id = WTSGetActiveConsoleSessionId();
    printf("ULONG = %d", id);
// Get token of the logged in user by the active session ID
BOOL bRet = WTSQueryUserToken(id, currentToken);
if (bRet == false)
{
    printf("ERROR: %d", GetLastError());
}

我解决了这个问题,如下所示:将currentToken定义为HANDLE而不是指针(PHANDLE),并将对它的引用传递给WTSQueryUserToken函数

PHANDLE currentToken = 0; 
changes to:
HANDLE currentToken = 0; 

而且。。。

BOOL bRet = WTSQueryUserToken(id, currentToken);
//Change this to:
BOOL bRet = WTSQueryUserToken(id, &currentToken);

在这之后,我得到了一个1314-ERROR_PRIVILEGE_NOT_HELD错误,但那是因为应用程序需要作为用户"localsystem"运行,而唯一的方法是将其作为服务运行——这超出了这个答案的范围,我还是解决了87错误!

也许WTSGetActiveConsoleSessionId没有返回有效的会话id?尝试WTSEnumerateSessions获取活动会话:

    WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, &pSessionInfo, &dwCount);
    int dataSize = sizeof(WTS_SESSION_INFO);
    // look over obtained list in search of the active session
    for (DWORD i = 0; i < dwCount; ++i)
    {
        WTS_SESSION_INFO si = pSessionInfo[i];
        if (WTSActive == si.State)
        {
        // If the current session is active – store its ID
            dwSessionId = si.SessionId;
            break;
        }
    }
    // Get token of the logged in user by the active session ID
    BOOL bRet = WTSQueryUserToken(dwSessionId, currentToken);

在这里可以找到源代码和完整的代码示例。