2

我试图让我的服务以用户身份创建一个进程,但我必须先获取令牌。现在由于某种原因,我的函数不断返回错误 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());
}
4

2 回答 2

2

我按如下方式解决了这个问题:将 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反正错误!

于 2015-08-28T12:24:14.707 回答
1

也许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);

在此处找到源代码和完整代码示例

于 2013-06-30T07:07:58.593 回答