前一段时间学习了.net 控制windows文件和目录权限的相关内容,期间做了一些总结。想把这方面的研究跟大家分享,一起学习。其中不免得有些用词不太标准的地方,希望大家留言指正,我加以修改。

首先,我们利用一个方法作为示例:

        /// <summary>
/// 为指定用户组,授权目录指定完全访问权限
/// </summary>
/// <param name="user">用户组,如Users</param>
/// <param name="folder">实际的目录</param>
/// <returns></returns>
private static bool SetAccess(string user, string folder)
{
//定义为完全控制的权限
const FileSystemRights Rights = FileSystemRights.FullControl; //添加访问规则到实际目录
var AccessRule = new FileSystemAccessRule(user, Rights,InheritanceFlags.None,PropagationFlags.NoPropagateInherit, AccessControlType.Allow);
var Info = new DirectoryInfo(folder);
var Security = Info.GetAccessControl(AccessControlSections.Access);
bool Result;
Security.ModifyAccessRule(AccessControlModification.Set, AccessRule, out Result);
if (!Result) return false; //总是允许再目录上进行对象继承
const InheritanceFlags iFlags = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit;
//为继承关系添加访问规则
AccessRule = new FileSystemAccessRule(user, Rights,iFlags,PropagationFlags.InheritOnly,AccessControlType.Allow);
Security.ModifyAccessRule(AccessControlModification.Add, AccessRule, out Result);
if (!Result)
return false;
Info.SetAccessControl(Security);//将 FileSecurity 对象所描述的访问控制列表 (ACL) 项应用于当前 FileStream 对象所描述的文件。
return true;
}

下面详细的介绍一下比较重要的几个方法,第一个:

一、 public FileSystemAccessRule( string identity, FileSystemRights fileSystemRights, InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags, AccessControlType type)

定义访问规则,参数如下:

identity   
  Type:     System.String
  The name of a user account. (账户名)
fileSystemRights
   Type:     System.Security.AccessControl.FileSystemRights
  One of the FileSystemRights values that specifies the type of operation associated with the access rule. (与访问规则相关联的操作类型)
inheritanceFlags
    Type:     System.Security.AccessControl.InheritanceFlags
  One of the InheritanceFlags values that specifies how access masks are propagated to child objects.
  (CSDN上解释的是“该值指示如何将访问掩码传播到子对象”,我的理解是 该值规定是将继承规则作用在文件夹上还是文件上)
propagationFlags
    Type:     System.Security.AccessControl.PropagationFlags
  One of the PropagationFlags values that specifies how Access Control Entries (ACEs) are propagated to child objects.
  (CSDN上解释的是“该值指定如何将访问控制项 (Ace) 传播到子对象”,propagationFlags能起作用的前提是inheritanceFlags不为None)
type
    Type:     System.Security.AccessControl.AccessControlType
  One of the AccessControlType values that specifies whether to allow or deny the operation.(允许还是拒绝)

第一个参数是账户名,第二个是操作类型,操作类型对应的有以下:

("AppendData", "附加数据");
("ChangePermissions", "更改权限");
("CreateDirectories", "创建文件夹/附加数据");
("CreateFiles", "创建文件/写入数据");
("Delete", "删除");
("DeleteSubdirectoriesAndFiles", "删除子文件夹及文件");
("ExecuteFile", "执行文件");
("FullControl", "完全控制");
("ListDirectory", "列出文件夹/读取数据");
("Modify", "修改");
("Read", "读取");
("ReadAndExecute", "读取和执行");
("ReadAttributes", "读取属性");
("ReadData", "读取数据");
("ReadExtendedAttributes", "读取扩展属性");
("ReadPermissions", "读取权限");
("Synchronize", "同步");
("TakeOwnership", "更改文件(夹)所有者");
("Traverse", "执行程序");
("Write", "写入");
("WriteAttributes", "写入属性");
("WriteData", "写入数据");
("WriteExtendedAttributes", "写入扩展属性");

第三四个参数比较难懂,并且他两个应该组合起来应用。一个是inheritanceFlags(ContainerInherit,None,ObjectInherit),另一个是propagationFlags(InheritOnly,None,NoPropagateInherit),这两枚举都有三个值,都具有允许其成员值的按位组合的 FlagsAttribute 特性,propagationFlags能起作用的前提是inheritanceFlags不为None。

下面是我总结的常用的枚举组合:

对应到windows界面操作上后,如下图所示:

第五个参数规定该访问规则的类型是 允许还是拒绝。

再看一下另一个方法:

二 、public virtual bool ModifyAccessRule( AccessControlModification modification, AccessRule rule, out bool modified)

修改访问规则,参数如下:

modification
    Type:     System.Security.AccessControl.AccessControlModification
  The modification to apply to the DACL.(包括Add、Remove、RemoveAll、RemoveSpecific、Reset、Set)
rule
    Type:     System.Security.AccessControl.AccessRule
  The access rule to modify.(访问规则)
modified
    Type:     System.Boolean
  true
if the DACL is successfully modified; otherwise, false.(指示成功还是失败) 返回值
Type:     System.Boolean
true
if the DACL is successfully modified; otherwise, false.

最后利用SetAccessControl将FileSecurity 对象所描述的访问控制列表 (ACL) 项应用于当前 FileStream 对象所描述的文件。

最后贴上我自己写的一个类,可根据自己需要加以修改。

 using System;
using System.Collections.Generic;
using System.Text;
using System.Security.AccessControl;
using System.IO;
using System.Security.Principal; namespace subServer
{
class WinFileAccessHelper
{
private enum MyRights
{
ChangePermissions,
CreateDirectories,
CreateFiles,
Delete,
DeleteSubdirectoriesAndFiles,
ExecuteFile,
FullControl,
ListDirectory,
Modify,
Read,
ReadAndExecute,
ReadAttributes,
ReadData,
ReadExtendedAttributes,
ReadPermissions,
Synchronize,
TakeOwnership,
Traverse,
Write,
WriteAttributes,
WriteData,
WriteExtendedAttributes
}; public enum MyEffectRange//作用范围
{
OnlyThisFolder, // 仅作用于此文件夹 ThisAndAllChildFolder, // 此文件夹和子文件夹(包括子文件夹下的所有文件夹)
OnlyAllChildFolder, // 只有子文件夹(包括子文件夹下的所有文件夹,但不包括此文件夹)
ThisAndOnlyChildFolder, // 此文件夹和子文件夹(不包括子文件夹下的文件夹) ThisAndALLFiles, // 此文件夹和文件(包括子文件夹下的所有文件)
OnlyAllFiles, // 只有文件(包括子文件夹下的所有文件,但不包括此文件夹)
ThisAndOnlyChildFiles, // 此文件夹和此文件夹下的文件(不包括子文件夹和子文件夹下的文件) ThisAndAllFolderFiles, // 此文件夹、子文件夹和文件(包括文件夹下的所有文件夹和文件)
OnlyAllChildFolderFiles, // 子文件夹和文件(包括文件夹下的所有文件夹和文件,不包括此文件夹)
ThisAndOnlyChildFolderFiles // 此文件夹、此文件夹下的文件 和子文件夹(不包括子文件夹下的文件夹和文件)
}; public struct InheritPropPair
{
public InheritPropPair(InheritanceFlags inher, PropagationFlags pro)
{
inherit = inher;
propagation = pro;
}
public InheritanceFlags inherit;
public PropagationFlags propagation;
} /// <summary>
/// 通过作用范围获得InheritPropPair
/// </summary>
/// <param name="range"></param>
/// <param name="pair"></param>
/// <returns></returns>
public static bool getInheritPropPair(MyEffectRange range, out InheritPropPair pair)
{
bool isRight = true;
InheritanceFlags inheritTmp = InheritanceFlags.None;
PropagationFlags propagationTmp = PropagationFlags.None; switch (range)
{
case MyEffectRange.OnlyThisFolder:
inheritTmp = InheritanceFlags.None;
propagationTmp = PropagationFlags.None;
break; case MyEffectRange.ThisAndAllChildFolder:
inheritTmp = InheritanceFlags.ContainerInherit;
propagationTmp = PropagationFlags.None;
break;
case MyEffectRange.OnlyAllChildFolder:
inheritTmp = InheritanceFlags.ContainerInherit;
propagationTmp = PropagationFlags.InheritOnly;
break;
case MyEffectRange.ThisAndOnlyChildFolder:
inheritTmp = InheritanceFlags.ContainerInherit;
propagationTmp = PropagationFlags.NoPropagateInherit;
break; case MyEffectRange.ThisAndALLFiles:
inheritTmp = InheritanceFlags.ObjectInherit;
propagationTmp = PropagationFlags.None;
break;
case MyEffectRange.OnlyAllFiles:
inheritTmp = InheritanceFlags.ObjectInherit;
propagationTmp = PropagationFlags.InheritOnly;
break;
case MyEffectRange.ThisAndOnlyChildFiles:
inheritTmp = InheritanceFlags.ObjectInherit;
propagationTmp = PropagationFlags.NoPropagateInherit;
break; case MyEffectRange.ThisAndAllFolderFiles:
inheritTmp = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit;
propagationTmp = PropagationFlags.None;
break;
case MyEffectRange.OnlyAllChildFolderFiles:
inheritTmp = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit;
propagationTmp = PropagationFlags.InheritOnly;
break;
case MyEffectRange.ThisAndOnlyChildFolderFiles:
inheritTmp = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit;
propagationTmp = PropagationFlags.NoPropagateInherit;
break; default:
Console.WriteLine("输入参数不正确");
isRight = false;
break;
}
pair.inherit = inheritTmp;
pair.propagation = propagationTmp;
return isRight;
} /// <summary>
/// 为指定用户组,授权目录指定访问权限
/// </summary>
/// <param name="user">用户组,如Users/Everyone</param>
/// <param name="folderOrFile">目录或文件路径</param>
/// <param name="rights">FileSystemRights类型的权限,可叠加</param>
/// <param name="pair">由作用范围得到的继承和传播方式pair</param>
/// <param name="accessType">AccessControlType类型的参数,有Allow/Deny</param>
/// <param name="isDelExistingAccess">是否删除该用户已有的权限控制</param>
/// <returns></returns>
public static bool SetAccess(string user, string folderOrFile, FileSystemRights rights, InheritPropPair pair,AccessControlType accessType)
{
try
{
if (!Directory.Exists(folderOrFile) && !File.Exists(folderOrFile))
return false; var Info = new DirectoryInfo(folderOrFile);
var Security = Info.GetAccessControl(AccessControlSections.Access);
bool Result;
var AccessRule = new FileSystemAccessRule(user, rights, pair.inherit, pair.propagation, accessType); Security.ModifyAccessRule(AccessControlModification.Set, AccessRule, out Result);
if (!Result)
return false; Info.SetAccessControl(Security);
return true;
}
catch(Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.ToString(), "设置权限错误");
return false;
}
} /// <summary>
/// 删除权限
/// </summary>
/// <param name="user"></param>
/// <param name="folderOrFile"></param>
/// <param name="rights"></param>
/// <param name="pair"></param>
/// <param name="accessType"></param>
/// <returns></returns>
public static bool RemoveAccess(string user, string folderOrFile, FileSystemRights rights, InheritPropPair pair, AccessControlType accessType)
{
try
{
if (!Directory.Exists(folderOrFile) && !File.Exists(folderOrFile))
return false; var Info = new DirectoryInfo(folderOrFile);
var Security = Info.GetAccessControl(AccessControlSections.Access);
bool Result;
var AccessRule = new FileSystemAccessRule(user, rights, pair.inherit, pair.propagation, accessType); Security.ModifyAccessRule(AccessControlModification.Remove, AccessRule, out Result);
if (!Result)
return false; Info.SetAccessControl(Security);
return true;
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.ToString(), "删除权限错误");
return false;
}
} /// <summary>
/// 删除所有“拒绝”权限,只能删除自身设置的访问控制权限,不能删除继承得来的权限。如果想删除继承的权限,请先调用DenyInheritAccess()
/// </summary>
/// <param name="folderOrFile">文件夹或文件</param>
/// <returns></returns>
public static bool RemoveAllDenyAccess(string folderOrFile)
{
try
{
if (!Directory.Exists(folderOrFile) && !File.Exists(folderOrFile))
return false; var Info = new DirectoryInfo(folderOrFile);
var Security = Info.GetAccessControl(AccessControlSections.Access);
bool Result; foreach (FileSystemAccessRule rule in Security.GetAccessRules(true, true, typeof(NTAccount)))
//foreach (FileSystemAccessRule rule in Security.GetAccessRules(true, true, typeof(SecurityIdentifier)))
{
//NTAccount时输出:允许 BUILTIN\Administrators---- FullControl
//SecurityIdentifier时输出:允许 S-1-5-32-544---- FullControl
//Console.WriteLine("{0} {1}---- {2}",
// rule.AccessControlType == AccessControlType.Allow ? "允许" : "拒绝",
// rule.IdentityReference.ToString(),
// rule.FileSystemRights
// );
if (rule.AccessControlType == AccessControlType.Deny)
{
Security.ModifyAccessRule(AccessControlModification.Remove, rule, out Result);
if (!Result)
return false;
Info.SetAccessControl(Security);
// System.Windows.Forms.MessageBox.Show(folderOrFile+"Deny result"+Result);
}
} return true;
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.ToString(), "删除权限错误");
return false;
}
} /// <summary>
/// 删除继承得来的访问权限
/// </summary>
/// <param name="folderOrFile">文件夹或文件</param>
/// <param name="preserveInheritance">是否保留继承得来的访问权限</param>
/// <returns></returns>
public static bool DenyInheritAccess(string folderOrFile, bool preserveInheritance)
{
try
{
if (!Directory.Exists(folderOrFile) && !File.Exists(folderOrFile))
return false;
var Info = new DirectoryInfo(folderOrFile);
var Security = Info.GetAccessControl(AccessControlSections.Access);
Security.SetAccessRuleProtection(true, preserveInheritance);
Info.SetAccessControl(Security);
return true;
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.ToString(), "禁用继承权限错误");
return false;
}
}
}
}

目录访问控制类

如果想进一步了解关于访问控制的详细介绍,可以参考http://www.cnblogs.com/xuanhun/archive/2012/06/23/2559576.html

.NET 控制Windows文件和目录访问权限研究(FileSystemAccessRule)的更多相关文章

  1. apache环境下禁止某文件夹内运行PHP脚本、禁止访问文件或目录执行权限的设置方法

    apache环境下禁止某文件夹内运行PHP脚本.禁止访问文件或目录执行权限的设置方法   首先我们来看两段对上传目录设置无权限的列子,配置如下: <Directory "要去掉PHP执 ...

  2. CentOS 6.5系统上安装SVN服务器端的方法及目录访问权限配置(转总结)

    SVN其实就是Subversion,分为服务器端和客户端.之前在网上搜了很多方法,都有各种问题,经过自己搜集整理以及实际尝试,总算有个比较靠谱的方法.本文主要介绍CentOS 6.5系统上安装SVN服 ...

  3. WIN7 WIN10赋予文件或者文件夹完全访问权限

    WIN7 WIN10赋予文件或者文件夹完全访问权限win7文件夹图标中多了一把小锁打不开文件夹怎么办?解决办法一:右击目录→取得管理员权限!该方法适用于win7旗舰版.解决办法二:添加everyone ...

  4. asp.net项目中通过Web.config配置文件及文件夹的访问权限!

    描述:在开发中我们通常会碰到这样的问题,例如:在项目的根目录下面有一个文件或者文件夹需要用户登陆后才能访问.如果用户在没有登录的情况下访问该文件或者该文件夹下面的文件时,直接拦截重定向到对应的登陆页面 ...

  5. Unix/Linux文件类型及访问权限

    在Linux系统中,有7种文件类型. 普通文件 (regular file) 目录文件 (directory) 链接文件 (symbolic link) 管道文件 (FIFO) 套接字文件 (sock ...

  6. chmod变更文件或目录的权限

    chmod命令用来变更文件或目录的权限.在UNIX系统家族里,文件或目录权限的控制分别以读取.写入.执行3种一般权限来区分,另有3种特殊权限可供运用.用户可以使用chmod指令去变更文件与目录的权限, ...

  7. chmod---变更文件或目录的权限

    chmod命令用来变更文件或目录的权限.在UNIX系统家族里,文件或目录权限的控制分别以读取.写入.执行3种一般权限来区分,另有3种特殊权限可供运用.用户可以使用chmod指令去变更文件与目录的权限, ...

  8. CentOS Linux SVN服务器 配置用户目录访问 权限 Authorization failed

    SVN 修改 aurhz 文件设置用户目录访问权限格式: [/code] user=rw user 用户对code目录拥有读和写的权限. 但是访问 svn://192.168.1.59 的时候却提示A ...

  9. 15、linux文件、目录的权限及如何改变权限(root用户不受任何权限的限制)

    15.1.linux普通文件的读.写.执行权限说明: r:读,表示具有读取\阅读文件内容的权限: w:可写,表示具有新增,修改文件内容的权限: 如果没有r配合,那么vi编辑文件会提示无法编辑(但可以强 ...

随机推荐

  1. [EXP]phpBB 3.2.3 - Remote Code Execution

    // All greets goes to RIPS Tech // Run this JS on Attachment Settings ACP page var plupload_salt = ' ...

  2. Xamarin.Android 使用线程无法更改页面文本问题

    前言: 刚接触Xamarin.Android不到一个月时间,却被他折磨的不要不要的,随着开发会出现莫名其妙的问题,网上类似Xamarin.Android的文档也不多,于是本片文章是按照Java开发An ...

  3. HW2018校招研发笔试编程题

    1. 数字处理 题目描述:给出一个不多于5位的整数,进行反序处理,要求 (1)求出它是几位数 (2)分别输出每一个数字(空格隔开) (3)按逆序输出各位数字(仅数字间以空格间隔,负号与数字之间不需要间 ...

  4. (原创)UML要点总结

    今天我们总结要点: 我们就从这张图慢慢讲. 一.类图部分 基础: 类图→长方形表示.类名在最上栏,下面是数据,第三栏是方法.其存在两种关系:关联和泛化 属性: 全形:  可见性  名:类型     重 ...

  5. UML介绍--用例图

    用例图定义:由参与者(Actor).用例(Use Case)以及它们之间的关系构成的用于描述系统功能的静态视图称为用例图. 用例图(User Case)是被称为参与者的外部用户所能观察到的系统功能的模 ...

  6. SQL 必知必会·笔记<12>组合查询

    什么是组合查询 SQL 通过执行多个查询(多条SELECT 语句),并将结果作为一个查询结果集返回.这些组合查询通常称为并(union)或复合查询(compound query). 什么时候使用组合查 ...

  7. 音频标签化2:youtube-8m项目的训练、评估与测试

    之前小程介绍了使用机器学习的办法来解决"音频标签化"的问题,并且提到了训练样本audioset跟youtube-8m的dataset,而训练模型上也提到了youtube-8m的模型 ...

  8. windows环境下pycharm如何设置Linux编码

    最近写代码一直在windows环境下,写完之后再传到Linux端就会出现代码格式错乱. 解决办法: 在windows端的pycharm代码格式设置为unix and os及可以解决这个问题. 如果你要 ...

  9. jQuery学习(2)ajax()使用

      在上一篇分享JavaScript之使用AJAX(适合初学者)中,我们学习了如何在JavaScript中使用AJAX.由于jQuery出色的性能和简洁的写法,且它也支持AJAX的使用,所以,本次分享 ...

  10. vue 使用mint-ui实现上拉加载和下拉刷新

    解决了官网中下拉刷新存在的问题 <template> <div class="tmpl"> <nav-bar title="商品列表&quo ...