在我们进一步了解访问令牌之前,我们要先知道访问令牌有哪些种类,而访问令牌主要分为3类,分别是:
主令牌 (Primary Token)
模拟令牌 (Impersonation Token)
定义:这是一种临时“身份证”,允许一个线程暂时“模拟” 另一个用户(如客户端)的安全上下文去执行任务。
关联对象:只能分配给线程(Thread)。
用途:常见于服务端程序。例如,打印服务在访问你的文档时,可以模拟你的身份,以确保它有权访问。
模拟级别(Impersonation Level):这是模拟令牌的关键属性,决定了服务器模拟客户端的“程度”。
SecurityAnonymous (匿名):服务器无法获取客户端任何信息,也无法模拟。
SecurityIdentification (标识):服务器能识别客户端身份,但不能模拟其权限。
SecurityImpersonation (模拟):服务器可以在本地系统上模拟客户端权限。这是大多数本地服务使用的级别。
SecurityDelegation (委托):服务器不仅可以模拟客户端,还能将模拟的权限传递给其他网络服务。这是权限最高的模拟级别。
受限令牌 (Restricted Token

定义:这是一种“被裁剪”过的令牌,可以是主令牌或模拟令牌的受限版本。
特点:通过 CreateRestrictedToken API创建,通过移除特权、为SID添加“仅拒
绝”属性或指定限制SID列表等方式实现权限限制。
双重安全检查:受限令牌在访问资源时,系统会进行两次访问检查:先检查常规SID,再检查限制SID列表。只有两次检查都通过,访问才会被授予。
典型应用:最著名的应用就是 UAC(用户账户控制)。当你以管理员身份登录时,explorer.exe 等进程运行的其实是受限令牌,只有当程序显式请求时才会获得完整管理员权限。
看到这里你应该已经知道令牌的种类了,我现在讲一下访问令牌里包含哪些信息。

如图,这是我用PowerIcacls.exe创建出来的一个沙盒进程,我们使用工具查看其的令牌信息,可以发现其包含以下内容:
用户SID、组SID、特权信息、令牌类型、完整性级别、令牌ID、会话ID等等
那这些信息有什么用呢?简单一句话:当你的进程试图访问一个文件、一个注册表键、或任何Windows安全对象时,系统就用这些信息来决定你“让不让你进”。
假设你的令牌里有一个用户SID,他是:代码登录后可见。现在你去访问C:\Windows\System32\drivers\etc\hosts这个文件。这个文件的**安全描述符(Security Descriptor)**里有一张访问控制列表(ACL),其中可能写着这样的规则:

Windows的安全系统会拿着你的令牌,从ACL的顶部开始逐条比对:
- 你的用户SID是管理员 → 匹配 Administrators 组
- 系统发现ACL中有一条允许管理员完全控制的规则
- 访问被授予
但如果ACL里写的不是 Allow,而是 Deny 完全控制呢?这时规则变成了 “拒绝Administrators组的写入权限” 。即使你是管理员,系统也会优先执行Deny规则,因此你的访问被拒绝,就弹出了那句经典名言:拒绝访问。
所以,令牌里每一项信息都不是摆设——它们是每一次访问决策的依据。