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 }
因为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 }

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
如何加速和提升单元测试覆盖率
方法体尽量小,一入一出,不要使用变量传递。将private方法可以改成友好型,就可以同包下单独方法进行用例测试。 用static方法,可以使用powermock,如不行,使用spring单例模式来避免static的使用。 尽量避免使用三目运算符,多IF条件判断,可以使用枚举+工厂类来规避,减少单元测试编写难度。 尽量不要自己写util方法,使用大基金会(apache、spring)、大厂(google、facebook、twitter、阿里等等)、github星级比较高的提供的util方法,copy Util方法的同时,同时copy他提供的单元测试。 数据库单元测试使用H2本地数据库Mock来加快速度,数据库中单元测试脚本要命中索引,不要进行一些无谓的性能开销。各层之间使用MockITO进行模拟测试。 Spring Controller测试可以使用WebApplicationContext、MockMvc来进行mock。 文件数据等测试,加快速度可以一次性加入内存跑。 activemq测试可以使用本地vm://localhost:61616来进行测试。 有些测试比较重要,但又影响速度(...
- 下一篇
java之扫描包里面的class文件
一、class作为,编译过后的产物,在很多时候,我们需要通过反射去执行class的具体方法。但是扫描class就是一个很大的问题了。 二、所以我这里写了一个简单的class文件扫描方式。 三、主要是利用ClassLoader中能够通过包铭去需要目录的绝对路径特性,写的 四、例子: /** * 提供直接调用的方法 * @param packageName * @return * @throws IOException * @throws ClassNotFoundException */ public static List<Class> findClass(String packageName) throws IOException, ClassNotFoundException { return findClass(packageName, new ArrayList<>()); } /** * * @param packageName * @param clazzs * @return * @throws ClassNotFoundException * @...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS关闭SELinux安全模块
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7安装Docker,走上虚拟化容器引擎之路