天天看點

C# 判斷使用者是否對路徑擁有通路權限

原文: C# 判斷使用者是否對路徑擁有通路權限 如何擷取目前系統使用者對檔案/檔案夾的操作權限?

 1.擷取安全資訊DirectorySecurity

DirectorySecurity fileAcl = Directory.GetAccessControl(folder);

通過Directory.GetAccessControl擷取檔案夾的權限/安全資訊

詳細介紹,可參考

MSDN官方文檔

對檔案/檔案夾權限的詳細操作,可參考一篇部落格

C#檔案夾權限操作

2. 擷取檔案夾通路權限清單FileSystemAccessRule

var rules = fileAcl.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount)).OfType<FileSystemAccessRule>().ToList();

GetAccessRules()方法傳回的是AuthorizationRule集合,此處隻需要擷取檔案權限。

FileSystemAccessRule

繼承自AuthorizationRule,并新增倆個屬性

  • AccessControlType -- 枚舉 Allow/Deny
  • FileSystemRights -- 對檔案的通路權限詳細資訊(讀/寫等),可見下面清單: 
C# 判斷使用者是否對路徑擁有通路權限
C# 判斷使用者是否對路徑擁有通路權限
1   /// <summary>定義要建立通路和稽核規則時使用的通路權限。</summary>
 2   [Flags]
 3   public enum FileSystemRights
 4   {
 5     ReadData = 1,
 6     ListDirectory = ReadData, // 0x00000001
 7     WriteData = 2,
 8     CreateFiles = WriteData, // 0x00000002
 9     AppendData = 4,
10     CreateDirectories = AppendData, // 0x00000004
11     ReadExtendedAttributes = 8,
12     WriteExtendedAttributes = 16, // 0x00000010
13     ExecuteFile = 32, // 0x00000020
14     Traverse = ExecuteFile, // 0x00000020
15     DeleteSubdirectoriesAndFiles = 64, // 0x00000040
16     ReadAttributes = 128, // 0x00000080
17     WriteAttributes = 256, // 0x00000100
18     Delete = 65536, // 0x00010000
19     ReadPermissions = 131072, // 0x00020000
20     ChangePermissions = 262144, // 0x00040000
21     TakeOwnership = 524288, // 0x00080000
22     Synchronize = 1048576, // 0x00100000
23     FullControl = Synchronize | TakeOwnership | ChangePermissions | ReadPermissions | Delete | WriteAttributes | ReadAttributes | DeleteSubdirectoriesAndFiles | Traverse | WriteExtendedAttributes | ReadExtendedAttributes | CreateDirectories | CreateFiles | ListDirectory, // 0x001F01FF
24     Read = ReadPermissions | ReadAttributes | ReadExtendedAttributes | ListDirectory, // 0x00020089
25     ReadAndExecute = Read | Traverse, // 0x000200A9
26     Write = WriteAttributes | WriteExtendedAttributes | CreateDirectories | CreateFiles, // 0x00000116
27     Modify = Write | ReadAndExecute | Delete, // 0x000301BF
28   }      

View Code

 因為AuthorizationRule中,IdentityReference對應權限的使用者/使用者組辨別,格式為:"MYDOMAIN\MyAccount"

是以,如通過目前系統使用者名與IdentityReference比對,即可擷取FileSystemAccessRule權限。如何擷取使用者名,見下一段落

3. 擷取目前系統使用者名/使用者組

通過 System.Environment.UserDomainName 和 System.Environment.UserName 取得目前使用者名

對目前系統使用者名/使用者組的其它操作,可參考

是以,将Path.Combine(Environment.UserDomainName, Environment.UserName)與IdentityReference.Value比較,擷取目前使用者對檔案夾的權限資訊

詳細實作如下:

1     /// <summary>
 2     /// 檢查目前使用者是否擁有此檔案夾的操作權限
 3     /// </summary>
 4     /// <param name="folder"></param>
 5     /// <returns></returns>
 6     public static bool HasOperationPermission(string folder)
 7     {
 8         var currentUserIdentity = Path.Combine(Environment.UserDomainName, Environment.UserName);
 9 
10         DirectorySecurity fileAcl = Directory.GetAccessControl(folder);
11         var userAccessRules = fileAcl.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount)).OfType<FileSystemAccessRule>().Where(i=>i.IdentityReference.Value==currentUserIdentity).ToList();
12 
13         return userAccessRules.Any(i => i.AccessControlType == AccessControlType.Deny);
14     }      

繼續閱讀