原文: 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 -- 對檔案的通路權限詳細資訊(讀/寫等),可見下面清單:

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 }