AccessCheck 的工作原理

当线程尝试访问安全对象时,系统将授予或拒绝访问。 如果该对象没有 DACL (自由 访问控制) , 则系统会授予访问权限;否则, 系统会在对象的 DACL 中查找 (AES) 应用于线程的访问控制条目。 对象的 DACL 中的每个 ACE 都指定受信者(可以是用户帐户、组帐户或登录会话)允许或拒绝 的访问权限

DACL

系统将每个 ACE 中的受信者与线程的访问令牌 中标识的受 信者进行比较。 访问令牌包含 标识用户 (组) 标识用户和组帐户的 ID 的安全标识符。 令牌还包含标识 当前登录 会话的登录 SID。 在访问检查期间,系统会忽略未启用的组 SID。 有关已启用、禁用和仅拒绝 SID 的信息,请参阅访问令牌 中的 SID 属性

通常,系统使用 请求 访问的线程的主访问令牌。 但是,如果线程正在模拟其他用户,则系统将使用线程的 模拟令牌

系统会按顺序检查每个 ACE,直到发生以下事件之一:

  • 拒绝访问的 ACE 显式拒绝对线程的访问令牌中列出的受信者之一的任何请求访问权限。
  • 线程访问令牌中列出的受信者允许访问的一个或多个 AES 显式授予所有请求的访问权限。
  • 已检查所有 AES,并且仍有至少一个请求的访问权限未显式允许,在这种情况下,将隐式拒绝访问。

下图显示了对象的 DACL 如何允许访问一个线程,同时拒绝访问另一个线程。

向不同线程授予不同访问权限的 dacl

对于线程 A,系统读取 ACE 1 并立即拒绝访问,因为拒绝访问的 ACE 适用于线程的访问令牌中的用户。 在这种情况下,系统不会检查 AES 2 和 3。 对于线程 B,ACE 1 不适用,因此系统将继续访问 ACE 2(允许写入访问)和 ACE 3(允许读取和执行访问权限)。

由于系统在显式授予或拒绝请求的访问权限时停止检查 AES,因此 DACL 中的 AES 顺序非常重要。 请注意,如果示例中的 ACE 顺序不同,则系统可能授予了对线程 A 的访问权限。对于系统对象,操作系统在 DACL 中定义 AES 的首选顺序