如何获取当前系统用户对文件/文件夹的操作权限?
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 -- 对文件的访问权限详细信息(读/写等),可见下面列表:
因为AuthorizationRule中,IdentityReference对应权限的用户/用户组标识,格式为:"MYDOMAIN\MyAccount"
所以,如通过当前系统用户名与IdentityReference匹配,即可获取FileSystemAccessRule权限。如何获取用户名,见下一段落
3. 获取当前系统用户名/用户组
通过 System.Environment.UserDomainName 和 System.Environment.UserName 取得当前用户名
对当前系统用户名/用户组的其它操作,可参考
- C# 管理 Windows 本地用户组
- C# 获取 Windows 用户组成员
因此,将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 }
获取文件夹是否有删除权限(仅删除空文件夹):
1 /// <summary> 2 /// 检查当前用户是否拥有此文件夹的删除操作权限 3 /// </summary> 4 /// <param name="folder"></param> 5 /// <returns></returns> 6 public static bool HasDeleteOperationPermission(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 if (userAccessRules.Count > 0 && 14 userAccessRules.Any(i => (i.FileSystemRights & FileSystemRights.Delete) != 0 && i.AccessControlType == AccessControlType.Allow)) 15 { 16 17 return true; 18 } 19 return false; 20 }