访问令牌
访问令牌是描述进程或线程的安全上下文的对象。 令牌中的信息包括与进程或线程关联的用户帐户的标识和权限。 当用户登录时,系统会通过将用户密码与存储在安全数据库中的信息进行比较来验证用户的密码。 如果密码 经过身份验证,系统会生成访问令牌。 代表此用户执行的每个进程都有此访问令牌的副本。
当线程与 安全对象 交互或尝试执行需要特权的系统任务时,系统使用访问令牌来标识用户。 访问令牌包含以下信息:
- 用户帐户 的安全标识符 (SID)
- 用户所属组的 SID
- 标识当前登录会话的登录SID
- 用户或用户组拥有 的权限 的列表
- 所有者 SID
- 主要组的 SID
- 用户在未指定安全描述符的情况下创建安全对象时系统使用的默认 DACL
- 访问令牌的源
- 令牌是 主 令牌还是 模拟 令牌
- 限制 SID 的可选列表
- 当前模拟级别
- 其他统计信息
每个进程都有一个 主令牌 ,用于描述与进程关联的用户帐户 的安全上下文 。 默认情况下,当进程的线程与安全对象交互时,系统会使用主令牌。 此外,线程可以模拟客户端帐户。 模拟允许线程使用客户端的安全上下文与安全对象交互。 模拟客户端的线程同时具有主令牌和 模拟令牌。
使用 OpenProcessToken 函数检索进程的主标记的句柄。 使用 OpenThreadToken 函数检索线程模拟令牌的句柄。 有关详细信息,请参阅 模拟。
可以使用以下函数来操作访问令牌。
函数 | 说明 |
---|---|
AdjustTokenGroups | 更改访问令牌中的组信息。 |
AdjustTokenPrivileges | 启用或禁用访问令牌中的特权。 它不会授予新权限或撤销现有权限。 |
CheckTokenMembership | 确定是否在指定的访问令牌中启用指定的 SID。 |
CreateRestrictedToken | 创建一个新令牌,该令牌是现有令牌的受限版本。 受限令牌可以具有禁用的 SID、已删除的权限和受限制的 SID 列表。 |
DuplicateToken | 创建复制现有令牌的新模拟令牌。 |
DuplicateTokenEx | 创建与现有令牌重复的新主令牌或模拟令牌。 |
GetTokenInformation | 检索有关令牌的信息。 |
IsTokenRestricted | 确定令牌是否具有限制 SID 的列表。 |
OpenProcessToken | 检索进程的主访问令牌的句柄。 |
OpenThreadToken | 检索线程的模拟访问令牌的句柄。 |
SetThreadToken | 为线程分配或删除模拟令牌。 |
SetTokenInformation | 更改令牌的所有者、主组或默认 DACL。 |
访问令牌函数使用以下结构来描述访问令牌的各个部分。
结构 | 说明 |
---|---|
TOKEN_CONTROL | 标识访问令牌的信息。 |
TOKEN_DEFAULT_DACL | 系统在线程创建的新对象的安全描述符中使用的默认 DACL。 |
TOKEN_GROUPS | 指定访问令牌中组 SID 的 SID 和属性。 |
TOKEN_OWNER | 新对象的安全描述符的默认所有者 SID。 |
TOKEN_PRIMARY_GROUP | 新对象的安全描述符的默认主组 SID。 |
TOKEN_PRIVILEGES | 与访问令牌关联的权限。 此外,还确定是否启用特权。 |
TOKEN_SOURCE | 访问令牌的源。 |
TOKEN_STATISTICS | 与访问令牌关联的统计信息。 |
TOKEN_USER | 与访问令牌关联的用户的 SID。 |
访问令牌函数使用以下枚举类型。
枚举类型 | 指定 |
---|---|
TOKEN_INFORMATION_CLASS | 标识正在设置或从访问令牌检索的信息的类型。 |
TOKEN_TYPE | 将访问令牌标识为主令牌或模拟令牌。 |