GetTokenInformation函数的返回值有哪些,该如何正确使用?
win32security.GetTokenInformation 使用说明及问题修复
核心问题
你调用GetTokenInformation的第二个参数使用错误:该参数是令牌信息类常量,不是特权LUID的索引值。不同的信息类常量对应返回不同结构的数据,这就是你观察到返回类型不统一的原因。
功能实现思路
如果你要获取当前进程令牌所有权限及其对应flags,按以下步骤执行:
- 调用
GetTokenInformation时传入win32security.TokenPrivileges作为信息类参数(对应值为3),该调用会返回当前令牌持有的所有权限列表 - 遍历返回的权限列表,每个条目结构为
(LUID, 状态flags) - 对每个LUID调用
LookupPrivilegeName获取权限的字符串名称,可按需解析flags的值
正确可运行代码
import win32security import win32api # 打开当前进程令牌,指定查询权限 token = win32security.OpenProcessToken( win32api.GetCurrentProcess(), win32security.TOKEN_QUERY_SOURCE | win32security.TOKEN_QUERY ) # 获取令牌所有权限信息 privilege_list = win32security.GetTokenInformation(token, win32security.TokenPrivileges) # 遍历解析每个权限 for luid, flags in privilege_list: priv_name = win32security.LookupPrivilegeName(None, luid) print(f"权限名称: {priv_name: <30} 状态flags: {hex(flags)}") # 可选:flags对应含义说明 print("\nFlags 位定义:") print("- 0x01 (SE_PRIVILEGE_ENABLED): 权限当前已启用") print("- 0x00 (SE_PRIVILEGE_ENABLED_BY_DEFAULT): 权限默认启用") print("- 0x02 (SE_PRIVILEGE_REMOVED): 权限已被移除") print("- 0x04 (SE_PRIVILEGE_USED_FOR_ACCESS): 权限近期被用于访问校验")
原代码问题说明
你之前循环传入0~0x30作为第二个参数,对应不同的令牌信息类:比如传0返回令牌关联的用户SID结构、传1返回令牌所属的用户组列表、传2返回令牌默认所有者SID,返回结构自然完全不同,和权限信息没有任何关系。
内容的提问来源于stack exchange,提问作者Roso Bergman
相关产品推荐
相关产品推荐

