AccessCheck 的工作原理
当线程尝试访问安全对象时,系统会授予或拒绝访问权限。 如果对象没有自由访问控制列表 (DACL) ,则系统会授予访问权限;否则,系统会在对象的 DACL 中查找应用于线程的访问控制项 (ACE) 。 对象的 DACL 中的每个 ACE 指定 受信人允许或拒绝的访问权限,这些权限可以是用户帐户、组帐户或 登录会话。
DACL
系统将每个 ACE 中的受托人与线程 访问令牌中标识的受托人进行比较。 访问令牌包含 安全标识符 (SID) 标识用户和用户所属的组帐户。 令牌还包含标识当前登录会话的登录 SID 。 在访问检查期间,系统会忽略未启用的组 SID。 有关启用、禁用和仅拒绝 SID 的详细信息,请参阅 访问令牌中的 SID 属性。
通常,系统使用请求访问的线程 的主访问令牌 。 但是,如果线程模拟另一个用户,系统将使用该线程的 模拟令牌。
系统按顺序检查每个 ACE,直到发生以下事件之一:
- 拒绝访问的 ACE 显式拒绝对线程的访问令牌中列出的某个受信人的任何请求 访问权限 。
- 线程的访问令牌中列出的受托人的一个或多个允许访问的 ACE 显式授予所有请求的访问权限。
- 已检查所有 ACE,但仍至少有一个请求的访问权限未被显式允许,在这种情况下,访问将被隐式拒绝。
下图显示了对象的 DACL 如何允许访问一个线程,同时拒绝访问另一个线程。
对于线程 A,系统会读取 ACE 1 并立即拒绝访问,因为拒绝访问的 ACE 适用于线程的访问令牌中的用户。 在这种情况下,系统不检查 ACE 2 和 3。 对于线程 B,ACE 1 不适用,因此系统继续执行 ACE 2(允许写入访问)和 ACE 3(允许读取和执行访问)。
由于系统在显式授予或拒绝请求的访问权限时停止检查 ACE,因此 DACL 中 ACE 的顺序非常重要。 请注意,如果示例中的 ACE 顺序不同,则系统可能已授予对线程 A 的访问权限。对于系统对象,操作系统定义 DACL 中 ACE 的首选顺序。