【问题标题】:C++ WTSQueryUserToken Function ErrorC++ WTSQueryUserToken 函数错误
【发布时间】:2013-06-27 14:21:37
【问题描述】:

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

【问题讨论】:

    标签: c++ token


    【解决方案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);
    

    Source and full code example found here.

    【讨论】:

    • 见我试过这个,但 Enumeratesesions 只是给我一个错误,它无法建立 RFC 服务器。开始认为在 Win7 上可能无法实现,原因是:msdn.microsoft.com/en-us/…
    • 听起来像是权限问题,因为枚举会话需要多个 RDS 权限,see this document link 了解更多信息。
    • 我也处于相同的位置 - 使用枚举会话会产生正确的会话 ID(1 - 通过在命令提示符下使用任务列表进行验证,我可以在其中查看我正在运行的应用程序的会话 ID)但是,使用与上面相同的代码,它给了我错误 87。
    【解决方案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错误!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-04
      • 2016-11-29
      • 2012-10-10
      • 2015-06-22
      • 1970-01-01
      相关资源
      最近更新 更多