7

我有一些代码,我正在尝试获取当前会话用户令牌:

#include <Wtsapi32.h>

DWORD activeSessionId = WTSGetActiveConsoleSessionId();

HANDLE currentToken;
BOOL queryRet = WTSQueryUserToken(activeSessionId, &currentToken);

if (!queryRet) {
    DWORD err = GetLastError();
    return 0;
}

err 的值为 1314。

更新 1

到目前为止没有运气,试图授予当前进程 SE_TCB_NAME - 但仍然从 WTSQueryUserToken (1314) 得到相同的错误。

HANDLE process = GetCurrentProcess();

HANDLE processToken;
BOOL openTokenRet = OpenProcessToken(
    process, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &processToken);

if (!openTokenRet)
{
    DWORD err = GetLastError();
    return 0;
}

TOKEN_PRIVILEGES tokenPrivs;
BOOL lookupRet = LookupPrivilegeValue(
    NULL, SE_TCB_NAME, &tokenPrivs.Privileges[0].Luid);

if (!lookupRet)
{
    DWORD err = GetLastError();
    return 0;
}

tokenPrivs.PrivilegeCount = 1;
tokenPrivs.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

BOOL adjustRet = AdjustTokenPrivileges(
    processToken, FALSE, &tokenPrivs, 0, (PTOKEN_PRIVILEGES)NULL, 0);

if (!adjustRet)
{
    DWORD err = GetLastError();
    return 0;
}

// get the user in the active session
HANDLE currentToken;
BOOL queryRet = WTSQueryUserToken(activeSessionId, &currentToken);

if (!queryRet) {
    DWORD err = GetLastError();
    return 0;
}

更新 2:

添加了更多调试信息,但 prevState.PrivilegeCount 为 0...

TOKEN_PRIVILEGES prevState;
DWORD prevStateLen = 0;

BOOL adjustRet = AdjustTokenPrivileges(
    processToken, FALSE, &tokenPrivs, 
    sizeof(TOKEN_PRIVILEGES), &prevState, &prevStateLen);

DWORD adjustErr = GetLastError();
if (!adjustRet)
{
    return 0;
}

解决方案:

看起来 WTSQueryUserToken 只能在作为 LocalSystem 运行时使用,这意味着我必须作为服务运行并从那里进行调试……Doh!

4

1 回答 1

10

错误 1314 是 ERROR_PRIVILEGE_NOT_HELD。您需要 SE_TCB_NAME 权限才能调用 WTSQueryUserToken。

此特权通常仅由作为本地系统运行的代码持有。如果此权限存在于您的令牌中,但已禁用,您可以使用AdjustTokenPrivileges来启用它。由于 SE_TCB_NAME 具有潜在的非常危险的权限,因此您应该在使用后立即再次禁用它。查看您是否拥有此权限的一种简单方法是使用进程属性窗口的安全表中的进程资源管理器。

每个更新 1 - AdjustTokenPrivileges 返回成功,但 GetLastError() 设置为 ERROR_NOT_ALL_ASSIGNED?MSDN 表示如果未启用权限,它可能会返回此信息。您能否验证您的进程确实具有 SE_TCB_NAME 权限,但它已被禁用?您的进程以什么帐户运行?

于 2009-08-17T16:51:53.680 回答