AccessCheck 的運作方式
當線程嘗試存取安全性實體物件時,系統會授與或拒絕存取權。 如果物件沒有 自主存取控制清單 (DACL),系統會授予存取權;否則,系統會在套用至執行緒的物件 DACL 中尋找 訪問控制項目 (ACE)。 物件 DACL 中的每個 ACE 都會為 受託者指定所允許或拒絕的訪問權限,這可以是使用者帳戶、群組帳戶或 登入會話。
DACL
系統會比較在每個 ACE 中的受託人與在線程的 存取權杖中識別的受託人。 存取令牌包含 安全性標識子(SID),識別使用者和使用者所屬的組帳戶。 令牌也包含用於識別目前登入會話的登入 SID 。 在存取檢查期間,系統會忽略未啟用的群組 SID。 如需啟用、停用和僅拒絕 SID 的詳細資訊,請參閱存取令牌 中的SID 屬性。
一般而言,系統會使用請求存取的線程的主要存取令牌 。 不過,如果線程模擬另一位使用者,系統會使用線程的 模擬令牌。
系統會依序檢查每個 ACE,直到發生下列其中一個事件為止:
- 拒絕存取的 ACE 會明確拒絕任何所要求的 訪問許可權, 線程存取令牌中列出的其中一個受託人。
- 線程存取令牌中列出的受託人一或多個允許存取的 ACE 會明確授與所有要求的訪問許可權。
- 已檢查所有的存取控制項(ACEs),但仍然至少有一個請求的訪問權限尚未獲得明確允許,在這種情況下,存取將被隱含地拒絕。
下圖顯示物件的 DACL 如何允許存取某個線程,同時拒絕存取另一個線程。
針對線程 A,系統會讀取 ACE 1 並立即拒絕存取,因為拒絕存取的 ACE 會套用至線程存取令牌中的使用者。 在此情況下,系統不會檢查 ACE 2 和 3。 對於線程 B,ACE 1 不適用,因此系統會繼續進行 ACE 2,允許寫入存取,以及允許讀取和執行存取的 ACE 3。
由於系統會在明確授與或拒絕要求的存取權時停止檢查 ACE,因此 DACL 中的 ACE 順序很重要。 請注意,如果範例中的 ACE 順序不同,系統可能會授與線程 A 的存取權。針對系統物件,作系統會在 DACL 中定義慣用的 ACE順序。