首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

檔案與目錄存取控制 (三):ACE 允許/拒絕優先序、繼承傳播旗標與擁有者權限

     編輯:關於.NET

存取控制項 (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 輸出範例

GetAccessRules 三參數

參數意義
includeExplicit是否包含顯式設定規則
includeInherited是否包含繼承規則
targetType主體型別 (NTAccount / SecurityIdentifier)

規則集合唯讀,修改必須透過 FileSecurity 方法

  • AddAccessRule / SetAccessRule / RemoveAccessRule
  • 規則物件本身不可變

為何拒絕優先?存取檢查演算法

  1. 依 ACL 順序逐一評估
  2. 遇到符合主體的「拒絕」 → 立即決定拒絕,停止評估
  3. 若無拒絕,遇到符合主體的「允許」 → 決定允許,停止評估
  4. 若遍歷完無匹配 → 隱性拒絕

因此,**將拒絕規則置於允許規則之前** 是最佳實務,確保預期生效。

移除權限 vs. 明確拒絕

撤銷「全職員工可讀」群組中某用戶的讀取權,**單純移除該用戶的允許規則無效**,因群組允許規則仍生效。唯一做法:**新增該用戶的拒絕規則**。

繼承與傳播旗標

旗標值效果
繼承旗標ContainerInherit (CI)套用至子容器 (目錄)
ObjectInherit (OI)套用至子物件 (檔案)
傳播旗標None跨整個子樹遞歸套用
NoPropagateInherit僅套用至直接子層,不再向下傳播
InheritOnly僅套用至子層,不套用至容器本身

規則評估順序

  1. 顯式允許
  2. 顯式拒絕
  3. 繼承允許 (父→祖父…)
  4. 繼承拒絕 (父→祖父…)

顯式規則永遠優先於繼承規則;父層優先於祖父層。

存取控制保護:切斷父層繼承

FileSecurity security = file.GetAccessControl();
security.SetAccessRuleProtection(true, false); // 保護啟用、不保留繼承規則
file.SetAccessControl(security);
  • isProtected=true:阻斷父層後續變更傳播
  • preserveInheritance=false:移除現有繼承規則

擁有者特權

  • 擁有者可無視 DACL 重寫規則、重獲控制權
  • security.SetOwner(new NTAccount("Administrators\\Xuanhun"));
  • 查看擁有者:security.GetOwner(typeof(NTAccount)) 或 typeof(SecurityIdentifier)

作者:玄魂
出處:https://www.cnblogs.com/xuanhun/

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved