Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 如何获取物理会话的当前用户令牌?_Winapi_Wtsapi32 - Fatal编程技术网

Winapi 如何获取物理会话的当前用户令牌?

Winapi 如何获取物理会话的当前用户令牌?,winapi,wtsapi32,Winapi,Wtsapi32,我有一些代码,我正试图使用这些代码获取当前会话用户令牌: #include <Wtsapi32.h> DWORD activeSessionId = WTSGetActiveConsoleSessionId(); HANDLE currentToken; BOOL queryRet = WTSQueryUserToken(activeSessionId, &currentToken); if (!queryRet) { DWORD err = GetLastEr

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

#include <Wtsapi32.h>

DWORD activeSessionId = WTSGetActiveConsoleSessionId();

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运行时使用,这意味着我必须作为服务运行并从那里进行调试。。。啊

错误1314是未持有的错误权限。您需要SE_TCB_NAME权限才能调用WTSQueryUserToken

此权限通常仅由作为本地系统运行的代码持有。如果令牌中存在此权限,但已禁用,则可以使用来启用它。由于SE_TCB_NAME是一种潜在的非常危险的特权,因此您应该在使用后立即再次禁用它。查看您是否具有此权限的一个简单方法是使用Process properties窗口的Security表中的Process Explorer


每更新1-是否返回成功,但GetLastError()设置为ERROR\u NOT\u ALL\u ASSIGNED?MSDN表示,如果未启用权限,它可能会返回此消息。您能否验证您的进程是否具有SE_TCB_NAME权限,但它已被禁用?您的进程以哪个帐户运行?

来自MSDN:令牌没有NewState参数中指定的一个或多个权限。即使未调整权限,该函数也可能成功执行此错误值。PreviousState参数表示已调整的权限。看起来这个函数可以成功,但不能启用特权。啊哈,我可以确认GetLastError()给出了错误\u not \u ALL \u赋值-但adjustRet的值为TRUE。所以,我已经填充了一个TOKEN_PRIVILEGES结构,但是privilegecont的值是0。。。这是否意味着什么都没有改变?请参阅更新2。@Nick-您的进程以什么帐户运行?你是在模拟另一个用户的线程上运行吗?Michael:普通用户帐户,是Vista管理员的成员。我也尝试过以管理员的身份运行,但没有区别。管理员没有TCB。要做到这一点,您需要以LocalSystem运行。您是在试图获取其他用户的令牌还是您自己的令牌?
TOKEN_PRIVILEGES prevState;
DWORD prevStateLen = 0;

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

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