【问题标题】:How to recover privileges with GetTokenInformation () ? c++如何使用 GetTokenInformation () 恢复权限? C++
【发布时间】:2019-05-08 14:57:10
【问题描述】:

我想恢复用户名的所有权限。例如权限:“SE_ASSIGN_PRIMARY_TOKEN_PRIVILEGE”、“SE_AUDIT_PRIVILEGE”、“SE_DEBUG_PRIVILEGE”...我在 microsoft 文档上搜索,发现 GetTokenInformation() https://docs.microsoft.com/en-us/windows/desktop/api/securitybaseapi/nf-securitybaseapi-gettokeninformation 但我不明白如何访问所有权限并查看此权限的价值。 请问有人已经用这个方法和一个例子或如何继续吗?

【问题讨论】:

  • 恢复所有权限是什么意思?用名称、属性或什么枚举所有特权? 来自用户名 - 来自具体进程(比如当前)会话等?
  • 我想用名字列出所有权限以及它们是启用还是禁用......
  • 那么你的问题是什么?获取令牌,查询 TokenPrivileges,得到 LUID_AND_ATTRIBUTES 权限 数组。遍历数组(其中的 PrivilegeCount 元素)。用于将 luid 转换为 redable 名称 - LsaLookupPrivilegeName

标签: c++ winapi window access-token


【解决方案1】:

你可以试试下面的代码:

#include <iostream>
#include <windows.h>
#include <tchar.h>

BOOL CheckWindowsPrivilege(const TCHAR *Privilege)
{
    /* Checks for Privilege and returns True or False. */
    LUID luid;
    PRIVILEGE_SET privs;
    HANDLE hProcess;
    HANDLE hToken;
    hProcess = GetCurrentProcess();
    if (!OpenProcessToken(hProcess, TOKEN_QUERY, &hToken)) return FALSE;
    if (!LookupPrivilegeValue(NULL, Privilege, &luid)) return FALSE;
    privs.PrivilegeCount = 1;
    privs.Control = PRIVILEGE_SET_ALL_NECESSARY;
    privs.Privilege[0].Luid = luid;
    privs.Privilege[0].Attributes = SE_PRIVILEGE_ENABLED;
    BOOL bResult;
    PrivilegeCheck(hToken, &privs, &bResult);
    return bResult;
}

int wmain(void)
{
    if (!CheckWindowsPrivilege(SE_ASSIGNPRIMARYTOKEN_NAME))
    {
        wprintf(L"I do not have SeAssignPrimaryTokenPrivilege!\n");
        return 1;
    }
    wprintf(L"I do have SeAssignPrimaryTokenPrivilege!\n");
    return 0;
}

然后调用SetPrivilege(不是win32 api,而是MSDN示例中的函数)

【讨论】:

  • 谢谢你的例子,所以如果我想知道与域名相关的权限,我用域名替换方法 GetProcess() 吗?我重复所有权限的代码?
  • 函数 LookupPrivilegeValue 总是返回 false 并返回错误 NO SUCH PRIVILEGE ,你知道它是从哪里来的吗?
  • 你传入了哪个权限?
  • 我解决了这个错误,因为我正在传递 SE_ASSIGNPRIMARYTOKEN_NAME 并执行 SeAssignPrimaryTokenPrivilege 它有效....如果我想知道与域名相关的权限,我将方法 GetProcess () 替换为域名?我重复所有权限的代码?
  • 当用户登录时,系统会生成一个包含用户权限列表的访问令牌。该示例适用于当前用户。而如果要获取其他域用户的权限,需要使用LogonUser获取token句柄。(但是这样不能登录远程电脑)
猜你喜欢
  • 2010-12-12
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
  • 1970-01-01
  • 2016-03-18
  • 2010-12-15
  • 1970-01-01
  • 2016-05-09
相关资源
最近更新 更多