采用C#代码动态设置文件权限

在开发中,我们经常会使用IO操作,例如创建,删除文件等操作。在项目中这样的需求也较多,我们也会经常对这些操作进行编码,但是对文件的权限进行设置,这样的操作可能会手动操作,现在介绍一种采用代码动态对文件设置权限的操作。

在对文件进行权限设置在DOtNet中,会采用FileSystemAccessRule类进行文件的权限操作。

1.现在看一下FileSystemAccessRule的实现代码:

 public FileSystemAccessRule(
   IdentityReference identity,
   FileSystemRights fileSystemRights,
   AccessControlType type )
   : this(
    identity,
    AccessMaskFromRights( fileSystemRights, type ),
    false,
    InheritanceFlags.None,
    PropagationFlags.None,
    type )
  {
  }
  public FileSystemAccessRule(
   String identity,
   FileSystemRights fileSystemRights,
   AccessControlType type )
   : this(
    new NTAccount(identity),
    AccessMaskFromRights( fileSystemRights, type ),
    false,
    InheritanceFlags.None,
    PropagationFlags.None,
    type )
  {
  }
  //
  // Constructor for creating access rules for folder objects
  //
  public FileSystemAccessRule(
   IdentityReference identity,
   FileSystemRights fileSystemRights,
   InheritanceFlags inheritanceFlags,
   PropagationFlags propagationFlags,
   AccessControlType type )
   : this(
    identity,
    AccessMaskFromRights( fileSystemRights, type ),
    false,
    inheritanceFlags,
    propagationFlags,
    type )
  {
  }
  public FileSystemAccessRule(
   String identity,
   FileSystemRights fileSystemRights,
   InheritanceFlags inheritanceFlags,
   PropagationFlags propagationFlags,
   AccessControlType type )
   : this(
    new NTAccount(identity),
    AccessMaskFromRights( fileSystemRights, type ),
    false,
    inheritanceFlags,
    propagationFlags,
    type )
  {
  }
  internal FileSystemAccessRule(
   IdentityReference identity,
   int accessMask,
   bool isInherited,
   InheritanceFlags inheritanceFlags,
   PropagationFlags propagationFlags,
   AccessControlType type )
   : base(
    identity,
    accessMask,
    isInherited,
    inheritanceFlags,
    propagationFlags,
    type )
  {
  }
  #endregion
  #region Public properties
  public FileSystemRights FileSystemRights
  {
   get { return RightsFromAccessMask( base.AccessMask ); }
  }
  internal static int AccessMaskFromRights( FileSystemRights fileSystemRights, AccessControlType controlType )
  {
   if (fileSystemRights < (FileSystemRights) 0 || fileSystemRights > FileSystemRights.FullControl)
    throw new ArgumentOutOfRangeException("fileSystemRights", Environment.GetResourceString("Argument_InvalidEnumValue", fileSystemRights, "FileSystemRights"));
   Contract.EndContractBlock();

   if (controlType == AccessControlType.Allow) {
    fileSystemRights |= FileSystemRights.Synchronize;
   }
   else if (controlType == AccessControlType.Deny) {
    if (fileSystemRights != FileSystemRights.FullControl &&
     fileSystemRights != (FileSystemRights.FullControl & ~FileSystemRights.DeleteSubdirectoriesAndFiles))
     fileSystemRights &= ~FileSystemRights.Synchronize;
   }
   return ( int )fileSystemRights;
  }
  internal static FileSystemRights RightsFromAccessMask( int accessMask )
  {
   return ( FileSystemRights )accessMask;
  }
 }

2.由于FileSystemAccessRule继承自AccessRule,现在看一下AccessRule的源码:

/// <summary>
 /// 表示用户的标识、访问掩码和访问控制类型(允许或拒绝)的组合。<see cref="T:System.Security.AccessControl.AccessRule"/> 对象还包含有关子对象如何继承规则以及如何传播继承的信息。
 /// </summary>
 public abstract class AccessRule : AuthorizationRule
 {
 /// <summary>
 /// 使用指定的值初始化 <see cref="T:System.Security.AccessControl.AccessRule"/> 类的一个新实例。
 /// </summary>
 /// <param name="identity">应用访问规则的标识。此参数必须是可以强制转换为 <see cref="T:System.Security.Principal.SecurityIdentifier"/> 的对象。</param><param name="accessMask">此规则的访问掩码。访问掩码是一个 32 位的匿名位集合,其含义是由每个集成器定义的。</param><param name="isInherited">如果此规则继承自父容器,则为 true。</param><param name="inheritanceFlags">访问规则的继承属性。</param><param name="propagationFlags">继承的访问规则是否自动传播。如果 <paramref name="inheritanceFlags"/> 设置为 <see cref="F:System.Security.AccessControl.InheritanceFlags.None"/>,则将忽略传播标志。</param><param name="type">有效的访问控制类型。</param><exception cref="T:System.ArgumentException"><paramref name="identity"/> 参数的值不能强制转换为 <see cref="T:System.Security.Principal.SecurityIdentifier"/>,或者 <paramref name="type"/> 参数包含无效值。</exception><exception cref="T:System.ArgumentOutOfRangeException"><paramref name="accessMask"/> 参数的值为零,或者 <paramref name="inheritanceFlags"/> 或 <paramref name="propagationFlags"/> 参数包含无法识别的标志值。</exception>
 protected AccessRule(IdentityReference identity, int accessMask, bool isInherited, InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags, AccessControlType type);
 /// <summary>
 /// 获取与此 <see cref="T:System.Security.AccessControl.AccessRule"/> 对象关联的 <see cref="T:System.Security.AccessControl.AccessControlType"/> 对象。
 /// </summary>
 ///
 /// <returns>
 /// 与此 <see cref="T:System.Security.AccessControl.AccessRule"/> 对象关联的 <see cref="T:System.Security.AccessControl.AccessControlType"/> 对象。
 /// </returns>
 public AccessControlType AccessControlType { get; }
 }

看来DotNet中实现文件权限设置的操作的类,现在提供几个具体的文件设置操作代码:

3.获取目录权限列表:

 /// <summary>
  /// 获取目录权限列表
  /// </summary>
  /// <param name="path">目录的路径。</param>
  /// <returns>指示目录的权限列表</returns>
  public IList<FileSystemRights> GetDirectoryPermission(string path)
  {
   try
   {
    if (!DirectoryExists(path))
     return null;
    IList<FileSystemRights> result = new List<FileSystemRights>();
    var dSecurity = Directory.GetAccessControl(new DirectoryInfo(path).FullName);
    foreach (FileSystemAccessRule rule in dSecurity.GetAccessRules(true, true, typeof(NTAccount)))
     result.Add(rule.FileSystemRights);
    return result;
   }
   catch (Exception e)
   {
    throw new Exception(e.Message, e);
   }
  }

4.设置目录权限

 /// <summary>
  ///设置目录权限
  /// </summary>
  /// <param name="path">目录的路径。</param>
  /// <param name="permission">在目录上设置的权限。</param>
  /// <returns>指示是否在目录上应用权限的值。</returns>
  public bool SetDirectoryPermission(string path, FileSystemRights permission)
  {
   try
   {
    if (!DirectoryExists(path))
     return false;
    var accessRule = new FileSystemAccessRule("Users", permission,
           InheritanceFlags.None,
           PropagationFlags.NoPropagateInherit,
           AccessControlType.Allow);

    var info = new DirectoryInfo(path);
    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("Users", permission,
           iFlags,
           PropagationFlags.InheritOnly,
           AccessControlType.Allow);

    security.ModifyAccessRule(AccessControlModification.Add, accessRule, out result);
    if (!result)
     return false;
    info.SetAccessControl(security);
    return true;
   }
   catch (Exception e)
   {
    throw new Exception(e.Message, e);
   }
  }

   5.设置目录权限列表

 /// <summary>
  /// 设置目录权限列表
  /// </summary>
  /// <param name="path">目录的路径。</param>
  /// <param name="permissions">在目录上设置的权限。</param>
  /// <returns>指示是否在目录上应用权限的值。</returns>
  public bool SetDirectoryPermissions(string path, FileSystemRights[] permissions)
  {
   try
   {
    if (!DirectoryExists(path) || permissions == null || !permissions.Any())
     return false;
    foreach (var permission in permissions)
     if (!SetDirectoryPermission(path, permission))
      return false;
     return true;
   }
   catch (Exception e)
   {
    throw new Exception(e.Message, e);
   }
  }

以上是对文件权限设置操作的一个简单介绍。

以上就是本文的全部内容,希望对大家有所帮助,同时也希望多多支持我们!

(0)

相关推荐

  • C#权限管理和设计浅谈

    此文主要想和大家分享的是这段时间,对权限管理和设计的断断续续的思考学习,和个人的一些软件开发等方面的看法. 提到'权限管理和设计',大家可能会第一时间想到这园子里的 吉日嘎拉,在这方面他可以算是'大牛'或专家 --他的'通用权限管理系统',究竟做的怎样,看看他的博客就差不多可以知道了(貌似我在给他做推广,呵呵...,but in fact,is not),别的暂且不敢说,最起码可以看出他研究的比较深入和狂热,其系统也具有一定的'成熟度',用他的话来说--就是在努力做到他的极致.他做的是通用权限管

  • C#判断程序是否是管理员权限运行的方法代码示例

    public bool IsAdministrator() { WindowsIdentity current = WindowsIdentity.GetCurrent(); WindowsPrincipal windowsPrincipal = new WindowsPrincipal(current); return windowsPrincipal.IsInRole(WindowsBuiltInRole.Administrator); }

  • C#枚举中的位运算权限分配浅谈

    常用的位运算主要有与(&), 或(|)和非(~), 比如: 1 & 0 = 0, 1 | 0 = 1, ~1 = 0 在设计权限时, 我们可以把权限管理操作转换为C#位运算来处理. 第一步, 先建立一个枚举表示所有的权限管理操作: 复制代码 代码如下: [Flags] public enum Permissions { Insert = 1, Delete = 2, Update = 4, Query = 8 } [Flags]表示该枚举可以支持C#位运算, 而枚举的每一项值, 我们用2的

  • C#利用WMI操作DNS服务器(可远程操作,需要相应权限)

    using System; using System.Collections.Generic; using System.Text; using System.Data; namespace Yaosansi {     class Test     {         static void Main()         {             MyDnsTEST();         } /// <summary>     /// MyDnsTEST功能测试   /// C#利用WMI

  • c# 解决IIS写Excel的权限问题

    具体配置方法如下: 1:在服务器上安装office的Excel软件. 2:在"开始"->"运行"中输入dcomcnfg.exe启动"组件服务" 3:依次双击"组件服务"->"计算机"->"我的电脑"->"DCOM配置" 4:在"DCOM配置"中找到"Microsoft Excel 应用程序",在它上面点击

  • C#引用访问权限分析

    本文实例分析了C#引用访问权限问题.分享给大家供大家参考.具体分析如下: 同样代码表现的不同行为:   创建基类(Super)和派生类(Sub)每个类有一个字段field和一个公共方法getField,并且使用内联的方式初始化为1,方法getField返回字段field.C#和Java代码及运行结果如下 复制代码 代码如下: class Super {         public int field = 0;           public int getField()         {

  • c#通过进程调用cmd判断登录用户权限代码分享

    复制代码 代码如下: /// <summary>/// 应用程序的主入口点./// </summary>[STAThread]static void Main(){ if (RunCmd("net localgroup administrators").IndexOf(System.Environment.UserName) >= 0)    { //顺利执行.    }    else    {        //报错提示系统不是管理员用户登录,容易导致

  • 采用C#代码动态设置文件权限

    在开发中,我们经常会使用IO操作,例如创建,删除文件等操作.在项目中这样的需求也较多,我们也会经常对这些操作进行编码,但是对文件的权限进行设置,这样的操作可能会手动操作,现在介绍一种采用代码动态对文件设置权限的操作. 在对文件进行权限设置在DOtNet中,会采用FileSystemAccessRule类进行文件的权限操作. 1.现在看一下FileSystemAccessRule的实现代码: public FileSystemAccessRule( IdentityReference identi

  • C#设置文件权限的方法

    在开发中,我们经常会使用IO操作,例如创建,删除文件等操作.在项目中这样的需求也较多,我们也会经常对这些操作进行编码,但是对文件的权限进行设置,这样的操作可能会手动操作,现在介绍一种采用代码动态对文件设置权限的操作. 在对文件进行权限设置在DOtNet中,会采用FileSystemAccessRule类进行文件的权限操作. 1.现在看一下FileSystemAccessRule的实现代码: public FileSystemAccessRule( IdentityReference identi

  • vue动态设置路由权限的主要思路

    之前看到网上有些动态设置路由的,但是跟目前的项目不是很匹配,就自己动手实现了一种.主要思路就是: 1.配置路由的时候绑定好id,可后端开发完成后,与后端同步id就行,这id唯一不变,根据此id可找到路由地址及icon. const routerArr = [ { path: '', name: '', component: () => import( /* webpackChunkName: "strategiesMaintain" */ '@/components/Layout

  • 在Laravel5中正确设置文件权限的方法

    前言 为任何Web应用程序设置适当的文件权限是Web托管的重要部分. 在本教程中,您将学习如何在Linux Web服务器上托管的Laravel应用程序上正确配置文件权限. 首先,确定运行Web服务器的用户名. 以下是一些默认情况 Linux上的Nginx使用帐户 -  www-data Debian系统上的Apache使用account-www-data RedHat系统上的Apache使用帐户 -  apache 我们假设我们的Web服务器使用帐户www-data运行. 现在递归更改所有文件和

  • Linux下修改文件权限(所有权)

    Linux与Unix是多用户操作系统,所以文件的权限与所有权的实现就显得很有必要:每个文件主要与三组权限打交道,分别是用户(user),用户组(group),其他用户(other) 用户(u)是文件的所有者,通常有所有的文件的操作权限 用户组(g)是多个用户的集合,可能有文件的部分访问权,相当于各用户之间的共享文件 其他(o)是指文件所有者和用户组成员之外的任何人 使用ls -l可以显示出当前目录下的文件类型,权限,所有者以及组在内的多方面信息: 第一列含义为:-(filetype)---(us

  • Django项目中动态设置静态文件路径的全过程

    目录 前言 一.修改BASE_DIR: 二.修改模板文件路径(TEMPLATES中的DIRS的值): 三.修改国际化文件路径,由于LOCALE_PATHS默认不存在,需要自己在合适位置添加,如下图所示: 四.修改公共文件路径,如下图所示: 五.修改STATIC_ROOT文件路径,如下图所示: 六.修改多媒体路径,如下图所示: 总结 前言 Django项目需要在settings.py文件中设置各种文件的路径,例如:媒体文件(media)的路径.静态文件(static files)的路径.模板文件(

  • ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码

    在ThinkPHP3.1版本之前,如果需要设置自动验证或者自动完成,必须定义在模型中,或者通过setProperty方法动态设置属性来完成,但是这样做的缺点是不太方便动态改变和调整 . ThinkPHP3.1版本在模型类中增加auto和validate两个连贯操作,用于动态设置自动完成和自动验证规则,现在可以在Action中使用,示例代码如下: $validate = array( array(verify,require,验证码必须!), array(name,,帐号名称已经存在!,0,uni

  • Js动态设置rem来实现移动端字体的自适应代码

    下面一段代码给大家介绍了Js动态设置rem来实现移动端字体的自适应,以此做个记录,方便以后需要,感兴趣的朋友一起看看吧. 具体代码如下所示: //设置根元素字体 var win = window, doc = document; function setFontSize() { var winWidth = $(window).width(); //750这个数字是根据你的设计图的实际大小来的,所以值具体根据设计图的大小 var size = (winWidth / 750) * 100; do

  • linux新文件权限设置之umask的深入理解

    前言 起源是一道题1:如果你的umask设置为022,缺省的你创建的文件权限为? 这让我回忆起被问过的另外一道题2: 777表示什么权限? 用户组说明 -rwxrw-r‐-1 root root 1213 Feb 2 09:39 abc 第一个字符代表文件(-).目录(d),链接(l) 其余字符每3个一组(rwx),读(r).写(w).执行(x) 第一组rwx:文件所有者的权限是读.写和执行 第二组rw-:与文件所有者同一组的用户的权限是读.写但不能执行 第三组r--:不与文件所有者同组的其他用

  • vue 动态设置img的src地址无效,npm run build 后找不到文件的解决

    动态设置img的src属性无效,而直接写可以 解决办法: imgSrc写成require('path'): 原因: 动态添加src被当做静态资源处理了,没有进行编译 npm run build 后出现 xxxxxxx net::ERR_FILE_NOT_FOUND 解决办法: 进入:build文件夹 > 打开 webpack.prod.conf.js 找到:output 对象 添加:publicPath:'./' 具体写法: publicPath: process.env.NODE_ENV ==

随机推荐