AccessCheck 的工作原理

当线程尝试访问安全对象时,系统会授予或拒绝访问。 如果对象没有 (DACL) 的任意访问控制列表,则系统授予访问权限;否则,系统会在应用于线程的对象 DACL 中查找访问控制项 (ACE) 。 对象 DACL 中的每个 ACE 指定 受托人允许或拒绝的访问权限,可以是用户帐户、组帐户或 登录会话

DACL

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

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

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

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

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

dacl that grants different access rights to different threads

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

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