gpt4 book ai didi

winapi - 如何获取物理 session 的当前用户 token ?

转载 作者:行者123 更新时间:2023-12-02 06:21:26 34 4
gpt4 key购买 nike

我有一些代码,我试图用它们获取当前 session 用户 token :

#include <Wtsapi32.h>

DWORD activeSessionId = WTSGetActiveConsoleSessionId();

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

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

错误值为 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!

最佳答案

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

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

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

关于winapi - 如何获取物理 session 的当前用户 token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1288965/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com