存取控制項 (ACE) 分 允許 (Allow) 與 拒絕 (Deny) 兩類,AccessControlType 屬性區分。**拒絕規則永遠優先於允許規則**,無論在 ACL 中順序如何。
string path = @"e:\AclTest\acltest.txt";
FileSecurity security = File.GetAccessControl(path);
foreach (FileSystemAccessRule rule in
security.GetAccessRules(true, true, typeof(NTAccount))) {
Console.WriteLine("{0} {1} ---- {2}",
rule.AccessControlType == AccessControlType.Allow ? "授權" : "拒絕",
rule.IdentityReference,
rule.FileSystemRights);
}

圖 1 GetAccessRules 輸出範例
| 參數 | 意義 |
|---|---|
| includeExplicit | 是否包含顯式設定規則 |
| includeInherited | 是否包含繼承規則 |
| targetType | 主體型別 (NTAccount / SecurityIdentifier) |
AddAccessRule / SetAccessRule / RemoveAccessRule因此,**將拒絕規則置於允許規則之前** 是最佳實務,確保預期生效。
撤銷「全職員工可讀」群組中某用戶的讀取權,**單純移除該用戶的允許規則無效**,因群組允許規則仍生效。唯一做法:**新增該用戶的拒絕規則**。
| 旗標 | 值 | 效果 |
|---|---|---|
| 繼承旗標 | ContainerInherit (CI) | 套用至子容器 (目錄) |
| ObjectInherit (OI) | 套用至子物件 (檔案) | |
| 傳播旗標 | None | 跨整個子樹遞歸套用 |
| NoPropagateInherit | 僅套用至直接子層,不再向下傳播 | |
| InheritOnly | 僅套用至子層,不套用至容器本身 |
顯式規則永遠優先於繼承規則;父層優先於祖父層。
FileSecurity security = file.GetAccessControl(); security.SetAccessRuleProtection(true, false); // 保護啟用、不保留繼承規則 file.SetAccessControl(security);
isProtected=true:阻斷父層後續變更傳播preserveInheritance=false:移除現有繼承規則security.SetOwner(new NTAccount("Administrators\\Xuanhun"));security.GetOwner(typeof(NTAccount)) 或 typeof(SecurityIdentifier)作者:玄魂
出處:https://www.cnblogs.com/xuanhun/