> For the complete documentation index, see [llms.txt](https://rootclay.gitbook.io/windows-access-control/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://rootclay.gitbook.io/windows-access-control/ba-qi-ta.md).

# （八）其他

## 访问控制如何工作

![](/files/-MGcXjxpOpJc443wAHTK)

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

**DACLs**

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

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

系统依次检查每个ACE，直到发生以下事件之一：

* 拒绝访问的ACE明确拒绝对线程访问令牌中列出的一个受托者的任何请求的访问权限。
* 线程的访问令牌中列出的针对受托者的一个或多个允许访问的ACE明确授予所有请求的访问权限。
* 已检查所有ACE，并且仍然存在至少一个未明确允许的请求访问权限，在这种情况下，访问被隐式拒绝。

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

![dacl that grants different access rights to different threads](https://docs.microsoft.com/zh-cn/windows/win32/secauthz/images/accctrl1.png)

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

因为当明确授予或拒绝所请求的访问权限时系统会停止检查ACE，所以DACL中ACE的顺序很重要。请注意，如果示例中的ACE顺序不同，则系统可能已授予访问线程A的权限。对于系统对象，操作系统在DACL中定义了ACE的首选顺序。

## 线程与安全对象之间的交互

当线程尝试使用安全对象时，系统会在允许线程继续进行之前执行访问检查。在访问检查中，系统将线程访问令牌中的安全信息与对象的安全描述符中的安全信息进行比较。

* 访问令牌包含安全标识符（SID），用于标识与线程关联的用户。
* 安全描述符标识对象的所有者，并包含一个自由访问控制列表（DACL）。 DACL包含访问控制项（ACE），每个访问控制项都指定对特定用户或组允许或拒绝的访问权限。

系统检查对象的DACL，从线程的访问令牌中查找适用于用户的ACE和组SID。系统将检查每个ACE，直到授予访问权限或拒绝访问为止，或者直到不再有要检查的ACE。可以想象，访问控制列表（ACL）可以具有多个应用于令牌的SID的ACE。并且，如果发生这种情况，则会累积每个ACE授予的访问权限。例如，如果一个ACE授予对组的读访问权限，而另一个ACE授予对组成员的用户的写访问权限，则该用户可以同时具有对该对象的读和写访问权限。

下图显示了这些安全信息块之间的关系：

![relationships between processes, aces, and dacls](https://docs.microsoft.com/zh-cn/windows/win32/secauthz/images/cssec-02.png)

## DACLs和ACEs

如果Windows对象没有任意访问控制列表（DACL），则系统允许所有人对其进行完全访问。如果对象具有DACL，则系统仅允许DACL中的访问控制项（ACE）明确允许的访问。如果DACL中没有ACE，则系统不允许访问任何人。同样，如果DACL具有允许访问有限的一组用户或组的ACE，则系统暗中拒绝访问未包括在ACE中的所有受托者。

在大多数情况下，可以使用允许访问的ACE控制对对象的访问。您无需明确拒绝访问对象。例外是当ACE允许访问组并且您要拒绝对组成员的访问时。为此，将用户拒绝访问的ACE放置在DACL中，然后放置在该组允许访问的ACE之前。请注意，ACE的顺序很重要，因为系统会按顺序读取ACE，直到允许或拒绝访问为止。用户的拒绝访问的ACE必须首先出现；否则，当系统读取该组的访问允许的ACE时，它将向受限用户授予访问权限。

下图显示了DACL，该DACL拒绝对一个用户的访问并向两个组授予访问权限。 A组的成员通过累积允许给A组的权限和允许给所有人的权限来获得读取，写入和执行访问权限。 Andrew是一个例外，尽管他是Everyone Group的成员，但拒绝访问的ACE拒绝了他的访问。![dacl that grants differing access rights based on group membership](https://docs.microsoft.com/zh-cn/windows/win32/secauthz/images/accctrl1.png)

## 空DACL和空DACL（授权）

如果属于对象的安全描述符的自由访问控制列表（DACL）设置为NULL，则会创建一个空DACL。空DACL授予对请求它的任何用户的完全访问权限；不对该对象执行正常的安全检查。空的DACL不应与空的DACL混淆。空的DACL是正确分配和初始化的DACL，其中不包含访问控制项（ACE）。空的DACL不允许访问对其分配的对象。

## 允许匿名访问

默认安全策略将匿名本地访问限制为没有权限。然后，管理员可以根据需要添加或减少权限。

对于具有与所有人相同访问权限的应用程序，存在本地访问组。然后，管理员可以适当地增加或减少该组中的用户数量，该组名为Windows 2000之前的兼容访问组。
