溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C#設(shè)置文件權(quán)限

發(fā)布時間:2020-08-15 15:08:36 來源:網(wǎng)絡(luò) 閱讀:619 作者:彭澤0902 欄目:編程語言

  在開發(fā)中,我們經(jīng)常會使用IO操作,例如創(chuàng)建,刪除文件等操作。在項目中這樣的需求也較多,我們也會經(jīng)常對這些操作進行編碼,但是對文件的權(quán)限進行設(shè)置,這樣的操作可能會手動操作,現(xiàn)在介紹一種采用代碼動態(tài)對文件設(shè)置權(quán)限的操作。

   在對文件進行權(quán)限設(shè)置在DOtNet中,會采用FileSystemAcce***ule類進行文件的權(quán)限操作。

    1.現(xiàn)在看一下FileSystemAcce***ule的實現(xiàn)代碼:

public FileSystemAcce***ule(
            IdentityReference identity,
            FileSystemRights fileSystemRights,
            AccessControlType type )
            : this(
                identity,
                AccessMaskFromRights( fileSystemRights, type ),
                false,
                InheritanceFlags.None,
                PropagationFlags.None,
                type )
        {
        }

        public FileSystemAcce***ule(
            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 FileSystemAcce***ule(
            IdentityReference identity,
            FileSystemRights fileSystemRights,
            InheritanceFlags inheritanceFlags,
            PropagationFlags propagationFlags,
            AccessControlType type )
            : this(
                identity,
                AccessMaskFromRights( fileSystemRights, type ),
                false,
                inheritanceFlags,
                propagationFlags,
                type )
        {
        }

        public FileSystemAcce***ule(
            String identity,
            FileSystemRights fileSystemRights,
            InheritanceFlags inheritanceFlags,
            PropagationFlags propagationFlags,
            AccessControlType type )
            : this(
                new NTAccount(identity),
                AccessMaskFromRights( fileSystemRights, type ),
                false,
                inheritanceFlags,
                propagationFlags,
                type )
        {
        }
        internal FileSystemAcce***ule(
            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.由于FileSystemAcce***ule繼承自Acce***ule,現(xiàn)在看一下Acce***ule的源碼:

  /// <summary>
  /// 表示用戶的標(biāo)識、訪問掩碼和訪問控制類型(允許或拒絕)的組合。<see cref="T:System.Security.AccessControl.Acce***ule"/> 對象還包含有關(guān)子對象如何繼承規(guī)則以及如何傳播繼承的信息。
  /// </summary>
  public abstract class Acce***ule : AuthorizationRule
  {
    /// <summary>
    /// 使用指定的值初始化 <see cref="T:System.Security.AccessControl.Acce***ule"/> 類的一個新實例。
    /// </summary>
    /// <param name="identity">應(yīng)用訪問規(guī)則的標(biāo)識。此參數(shù)必須是可以強制轉(zhuǎn)換為 <see cref="T:System.Security.Principal.SecurityIdentifier"/> 的對象。</param><param name="accessMask">此規(guī)則的訪問掩碼。訪問掩碼是一個 32 位的匿名位集合,其含義是由每個集成器定義的。</param><param name="isInherited">如果此規(guī)則繼承自父容器,則為 true。</param><param name="inheritanceFlags">訪問規(guī)則的繼承屬性。</param><param name="propagationFlags">繼承的訪問規(guī)則是否自動傳播。如果 <paramref name="inheritanceFlags"/> 設(shè)置為 <see cref="F:System.Security.AccessControl.InheritanceFlags.None"/>,則將忽略傳播標(biāo)志。</param><param name="type">有效的訪問控制類型。</param><exception cref="T:System.ArgumentException"><paramref name="identity"/> 參數(shù)的值不能強制轉(zhuǎn)換為 <see cref="T:System.Security.Principal.SecurityIdentifier"/>,或者 <paramref name="type"/> 參數(shù)包含無效值。</exception><exception cref="T:System.ArgumentOutOfRangeException"><paramref name="accessMask"/> 參數(shù)的值為零,或者 <paramref name="inheritanceFlags"/> 或 <paramref name="propagationFlags"/> 參數(shù)包含無法識別的標(biāo)志值。</exception>
    protected Acce***ule(IdentityReference identity, int accessMask, bool isInherited, InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags, AccessControlType type);
    /// <summary>
    /// 獲取與此 <see cref="T:System.Security.AccessControl.Acce***ule"/> 對象關(guān)聯(lián)的 <see cref="T:System.Security.AccessControl.AccessControlType"/> 對象。
    /// </summary>
    /// 
    /// <returns>
    /// 與此 <see cref="T:System.Security.AccessControl.Acce***ule"/> 對象關(guān)聯(lián)的 <see cref="T:System.Security.AccessControl.AccessControlType"/> 對象。
    /// </returns>
    public AccessControlType AccessControlType { get; }
  }

  看了DotNet中實現(xiàn)文件權(quán)限設(shè)置的操作的類,現(xiàn)在提供幾個具體的文件設(shè)置操作代碼:

   3.獲取目錄權(quán)限列表:

        /// <summary>
         /// 獲取目錄權(quán)限列表
        /// </summary>
        /// <param name="path">目錄的路徑。</param>
        /// <returns>指示目錄的權(quán)限列表</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 (FileSystemAcce***ule rule in dSecurity.GetAcce***ules(true, true, typeof(NTAccount)))
                    result.Add(rule.FileSystemRights);

                return result;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message, e);
            }
        }

   4.設(shè)置目錄權(quán)限

        /// <summary>
        ///設(shè)置目錄權(quán)限
        /// </summary>
        /// <param name="path">目錄的路徑。</param>
        /// <param name="permission">在目錄上設(shè)置的權(quán)限。</param>
        /// <returns>指示是否在目錄上應(yīng)用權(quán)限的值。</returns>
        public bool SetDirectoryPermission(string path, FileSystemRights permission)
        {
            try
            {
                if (!DirectoryExists(path))
                    return false;

                var acce***ule = new FileSystemAcce***ule("Users", permission,
                                            InheritanceFlags.None,
                                            PropagationFlags.NoPropagateInherit,
                                            AccessControlType.Allow);

                var info = new DirectoryInfo(path);
                var security = info.GetAccessControl(AccessControlSections.Access);

                bool result;
                security.ModifyAcce***ule(AccessControlModification.Set, acce***ule, out result);

                if (!result)
                    return false;

                const InheritanceFlags iFlags = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit;

                acce***ule = new FileSystemAcce***ule("Users", permission,
                                            iFlags,
                                            PropagationFlags.InheritOnly,
                                            AccessControlType.Allow);

                security.ModifyAcce***ule(AccessControlModification.Add, acce***ule, out result);

                if (!result)
                    return false;

                info.SetAccessControl(security);

                return true;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message, e);
            }
        }

  5.設(shè)置目錄權(quán)限列表

        /// <summary>
        /// 設(shè)置目錄權(quán)限列表
        /// </summary>
        /// <param name="path">目錄的路徑。</param>
        /// <param name="permissions">在目錄上設(shè)置的權(quán)限。</param>
        /// <returns>指示是否在目錄上應(yīng)用權(quán)限的值。</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);
            }
        }

     以上是對文件權(quán)限設(shè)置操作的一個簡單介紹。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI