可繼承 ACE 的自動傳播
SetNamedSecurityInfo 和 SetSecurityInfo 函式支援自動傳播可繼承 訪問控制專案 (ACE)。 例如,如果您使用這些函式將可繼承的 ACE 新增至 NTFS 中的目錄,系統會將 ACE 適當地套用至任何現有子目錄或檔案的 存取控制清單 (ACL)。
直接套用的 ACE 優先順序高於繼承的 ACE。 系統會將直接套用的 ACE 放在 選擇性存取控制清單中 (DACL) 中,將直接套用的 ACE 置於繼承的 ACE 之前,以實作此優先順序。 當您呼叫 SetNamedSecurityInfo 和 SetSecurityInfo 函式來設定物件的安全性資訊時,系統會將目前的繼承模型強加於目標物件下方階層中所有物件的 ACL 上。 對於已轉換成目前繼承模型的物件,SE_DACL_AUTO_INHERITED和SE_SACL_AUTO_INHERITED位會設定在 物件的 安全性描述元 控件字段中。
當您建置反映目前繼承模型的新安全性描述元時,請小心不要變更安全性描述元的語意。 因此,不允許和拒絕 ACE 永遠不會彼此移動。 如果需要這類移動(例如將所有非繼承的 ACE 放在 ACL 前面),ACL 會標示為受保護以防止語意變更。
將繼承的 ACE 傳播至子物件時,系統會使用下列規則:
- 如果沒有 DACL 的子物件繼承 ACE,則結果為只包含繼承 ACE 之 DACL 的子物件。
- 如果具有空白 DACL 的子物件繼承 ACE,則結果是包含只包含繼承 ACE 之 DACL 的子物件。
- 如果您從父物件移除可繼承的 ACE,自動繼承會移除子物件繼承之 ACE 的任何復本。
- 如果自動繼承會導致從子物件的 DACL 中移除所有 ACE,則子物件具有空的 DACL,而不是沒有 DACL。
這些規則可能會有非預期的結果,將沒有 DACL 的物件轉換成具有空白 DACL 的物件。 沒有 DACL 的物件允許完整存取,但具有空白 DACL 的物件不允許存取。 例如,這些規則如何建立空的 DACL,假設您將可繼承的 ACE 新增至對象的樹狀結構根物件。 自動繼承會將可繼承的 ACE 傳播至樹狀結構中的所有物件。 以無 DACL 開頭的子對象現在具有繼承的 ACE 的 DACL。 如果您從根物件移除可繼承的 ACE,系統會自動將變更傳播至子物件。 以無 DACL 開頭的子物件(允許完整存取)現在有空的 DACL(不允許存取)。
若要確保沒有 DACL 的子物件不受可繼承的 ACE 影響,請在對象的安全性描述元中設定SE_DACL_PROTECTED旗標。
如需如何正確建立 DACL 的詳細資訊,請參閱 建立 DACL。