using System.Security.AccessControl; using System.IO; using System.Security.Principal;
取得目錄的訪問控制和審核安全(ACL)
DirectorySecurity fileAcl = Directory.GetAccessControl(filePath);
文件夾權限繼承控制
fileAcl.SetAccessRuleProtection(true, true);//取消權限繼承,且保留繼承的訪問規則 fileAcl.SetAccessRuleProtection(true, true);//取消權限繼承,且移除繼承的訪問規則 fileAcl.SetAccessRuleProtection(false, true);//允許權限繼承,且忽略第二個參數
訪問規則訪問控制項創建
FileSystemAccessRule everyoneRule = new FileSystemAccessRule("Everyone", FileSystemRights.FullControl, AccessControlType.Allow); FileSystemAccessRule everyoneRule1 = new FileSystemAccessRule("Everyone", FileSystemRights.Modify, AccessControlType.Allow);
//"Everyone"用戶賬戶名稱
//FileSystemRights.FullControl 訪問規則
//AccessControlType.Allow 允許訪問受保護對象,AccessControlType.Deny拒絕訪問受保護對象
SID也就是安全標識符(Security Identifiers),是標識用戶、組和計算機帳戶的唯一的號碼。在第一次創建該帳戶時,
將給網絡上的每一個帳戶發布一個唯一的 SID。Windows 2000 中的內部進程將引用帳戶的 SID 而不是帳戶的用戶或組名。
如果創建帳戶,再刪除帳戶,然后使用相同的用戶名創建另一個帳戶,則新帳戶將不具有授權給前一個帳戶的權力或權限,
原因是該帳戶具有不同的 SID 號。安全標識符也被稱為安全 ID 或 SID。
修改訪問控制列表(ACL)
bool result = false; //將指定的授權規則添加到訪問控制列表 (ACL)。 fileAcl.ModifyAccessRule(AccessControlModification.Add, everyoneRule,out result); //從 ACL 移除所含安全性標識符 (SID) 和訪問掩碼與指定授權規則一樣的授權規則。 fileAcl.ModifyAccessRule(AccessControlModification.Remove, everyoneRule, out result); //從 ACL 移除所含 SID 與指定授權規則一樣的授權規則。 fileAcl.ModifyAccessRule(AccessControlModification.RemoveAll, everyoneRule, out result); //從 ACL 移除與指定的授權規則完全匹配的授權規則。 fileAcl.ModifyAccessRule(AccessControlModification.RemoveSpecific, everyoneRule, out result); //從 ACL 移除所含 SID 與指定授權規則一樣的授權規則,然后將指定的授權規則添加到 ACL。 fileAcl.ModifyAccessRule(AccessControlModification.Reset, everyoneRule, out result); //從 ACL 移除所有授權規則,然后將指定的授權規則添加到 ACL。 fileAcl.ModifyAccessRule(AccessControlModification.Set, everyoneRule, out result); //權限追加 fileAcl.AddAccessRule(everyoneRule); //權限刪除 fileAcl.RemoveAccessRule(everyoneRule); //從當前文件或目錄移除所有匹配的允許或拒絕訪問控制列表 (ACL) 權限。 fileAcl.RemoveAccessRuleAll(everyoneRule); //從當前文件或目錄移除指定用戶的所有訪問控制列表 (ACL) 權限。 fileAcl.RemoveAccessRuleSpecific(everyoneRule); //從當前文件或目錄移除單個匹配的允許或拒絕訪問控制列表 (ACL) 權限。
遍歷ACL中的ACE
AuthorizationRuleCollection rules = fileAcl.GetAccessRules(true, true, typeof(NTAccount)); // AuthorizationRule Rule = rules[0]; foreach (FileSystemAccessRule rule in rules) {
if(rule.IdentityReference.Value.CompareTo("Users")==0)
{ fileAcl.RemoveAccessRule(rule);
} }