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