C#设置与获取目录权限(.net控制ACL)

时间:2023-12-18 12:25:08

找到两种方式可以修改文件夹的权限

第一种:

想用c#来设置和读取ntfs分区上的目录权限,找了很多资料,未果。终于发现了一段vb.net的代码,做了修改,以C#展示给大家。

C#设置与获取目录权限(.net控制ACL)using System;
C#设置与获取目录权限(.net控制ACL)using System.Collections;
C#设置与获取目录权限(.net控制ACL)using System.IO;
C#设置与获取目录权限(.net控制ACL)using System.Security.AccessControl;
C#设置与获取目录权限(.net控制ACL)static class Tester
C#设置与获取目录权限(.net控制ACL){
C#设置与获取目录权限(.net控制ACL)
C#设置与获取目录权限(.net控制ACL)    public static void Main()
C#设置与获取目录权限(.net控制ACL)    {
C#设置与获取目录权限(.net控制ACL)        try
C#设置与获取目录权限(.net控制ACL)        {
C#设置与获取目录权限(.net控制ACL)            string filename = @"f:\k"; //目标目录
C#设置与获取目录权限(.net控制ACL)            string account = @"Administrator";//用户名
C#设置与获取目录权限(.net控制ACL)            string userrights = @"RW";//权限字符串,自己定义的
C#设置与获取目录权限(.net控制ACL)            AddDirectorySecurity(filename, account, userrights);
C#设置与获取目录权限(.net控制ACL)            Console.ReadLine();
C#设置与获取目录权限(.net控制ACL)        }
C#设置与获取目录权限(.net控制ACL)        catch (Exception e)
C#设置与获取目录权限(.net控制ACL)        {
C#设置与获取目录权限(.net控制ACL)            Console.WriteLine(e);
C#设置与获取目录权限(.net控制ACL)            Console.ReadLine();
C#设置与获取目录权限(.net控制ACL)        }
C#设置与获取目录权限(.net控制ACL)    }
C#设置与获取目录权限(.net控制ACL)
C#设置与获取目录权限(.net控制ACL)    static public void AddDirectorySecurity(string FileName, string Account, string UserRights)
C#设置与获取目录权限(.net控制ACL)    {
C#设置与获取目录权限(.net控制ACL)        FileSystemRights Rights = new FileSystemRights();
C#设置与获取目录权限(.net控制ACL)
C#设置与获取目录权限(.net控制ACL)        if (UserRights.IndexOf("R") >= 0)
C#设置与获取目录权限(.net控制ACL)        {
C#设置与获取目录权限(.net控制ACL)            Rights = Rights | FileSystemRights.Read;
C#设置与获取目录权限(.net控制ACL)        }
C#设置与获取目录权限(.net控制ACL)        if (UserRights.IndexOf("C") >= 0)
C#设置与获取目录权限(.net控制ACL)        {
C#设置与获取目录权限(.net控制ACL)            Rights = Rights | FileSystemRights.ChangePermissions;
C#设置与获取目录权限(.net控制ACL)        }
C#设置与获取目录权限(.net控制ACL)        if (UserRights.IndexOf("F") >= 0)
C#设置与获取目录权限(.net控制ACL)        {
C#设置与获取目录权限(.net控制ACL)            Rights = Rights | FileSystemRights.FullControl;
C#设置与获取目录权限(.net控制ACL)        }
C#设置与获取目录权限(.net控制ACL)        if (UserRights.IndexOf("W") >= 0)
C#设置与获取目录权限(.net控制ACL)        {
C#设置与获取目录权限(.net控制ACL)            Rights = Rights | FileSystemRights.Write;
C#设置与获取目录权限(.net控制ACL)        }
C#设置与获取目录权限(.net控制ACL)
C#设置与获取目录权限(.net控制ACL)        bool ok;
C#设置与获取目录权限(.net控制ACL)        DirectoryInfo dInfo = new DirectoryInfo(FileName);
C#设置与获取目录权限(.net控制ACL)        DirectorySecurity dSecurity = dInfo.GetAccessControl();
C#设置与获取目录权限(.net控制ACL)        InheritanceFlags iFlags = new InheritanceFlags();
C#设置与获取目录权限(.net控制ACL)        iFlags = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit;
C#设置与获取目录权限(.net控制ACL)        FileSystemAccessRule AccessRule2 = new FileSystemAccessRule(Account, Rights, iFlags, PropagationFlags.None, AccessControlType.Allow);
C#设置与获取目录权限(.net控制ACL)        dSecurity.ModifyAccessRule(AccessControlModification.Add, AccessRule2, out ok);
C#设置与获取目录权限(.net控制ACL)
C#设置与获取目录权限(.net控制ACL)        dInfo.SetAccessControl(dSecurity);
C#设置与获取目录权限(.net控制ACL)
C#设置与获取目录权限(.net控制ACL)        //列出目标目录所具有的权限
C#设置与获取目录权限(.net控制ACL)        DirectorySecurity sec = Directory.GetAccessControl(FileName, AccessControlSections.All);
C#设置与获取目录权限(.net控制ACL)        foreach (FileSystemAccessRule rule in sec.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount)))
C#设置与获取目录权限(.net控制ACL)        {
C#设置与获取目录权限(.net控制ACL)            Console.WriteLine("----------------------------------");
            Console.WriteLine(rule.IdentityReference.Value);
            if ((rule.FileSystemRights & FileSystemRights.Read) != 0)
                Console.WriteLine(rule.FileSystemRights.ToString());

}
        Console.Read();
    }

}

对照MSDN,很容易看懂上面的代码。 但是貌似这个程序需要以管理员身份来运行。^_^

其中的Directory.GetAccessControl(FileName, AccessControlSections.All); 
第二个参数如果为AccessControlSections.Access ,就可以使得运行在IIS中的Web应用程序获得目录权限了。

以上代码来源:http://www.cnblogs.com/zjneter/archive/2008/03/06/1093386.html

第二种方法:该方法就不多说了,搜索大多博客都写了第二种方法来设置权限,但是,实际上这种方法根本无法给目录设置用户权限(测试多次无法设置成功,不知其他人是否成功设置),

/// <summary>
        /// 目录权限
        /// </summary>
        public enum FloderRights
        {
            FullControl,
            Read,
            Write
        }
        public static void AddPathRights(string pathname, string username, FloderRights qx)
        {

//FileInfo fi = new FileInfo(pathname);
            //System.Security.AccessControl.FileSecurity fileSecurity = fi.GetAccessControl();
            //fileSecurity.AddAccessRule(new FileSystemAccessRule("Everyone", FileSystemRights.FullControl, AccessControlType.Allow));
            //fileSecurity.AddAccessRule(new FileSystemAccessRule("Users", FileSystemRights.FullControl, AccessControlType.Allow));
            //fi.SetAccessControl(fileSecurity);

DirectoryInfo dirinfo = new DirectoryInfo(Path.GetDirectoryName(pathname));
            if ((dirinfo.Attributes & FileAttributes.ReadOnly) != 0)
            {
                dirinfo.Attributes = FileAttributes.Normal;
            }
            //取得访问控制列表
            DirectorySecurity dirsecurity = dirinfo.GetAccessControl();
            // string strDomain = Dns.GetHostName();
            //System.Security.AccessControl.DirectorySecurity dirsecurity = dirinfo.GetAccessControl();
            switch (qx)
            {
                case FloderRights.FullControl:
                    dirsecurity.AddAccessRule(new FileSystemAccessRule(username, FileSystemRights.FullControl, AccessControlType.Allow));
                    break;
                case FloderRights.Read:
                    dirsecurity.AddAccessRule(new FileSystemAccessRule(username, FileSystemRights.Read, AccessControlType.Allow));
                    break;
                case FloderRights.Write:
                    dirsecurity.AddAccessRule(new FileSystemAccessRule(username, FileSystemRights.Write, AccessControlType.Allow));
                    break;
                default:
                    dirsecurity.AddAccessRule(new FileSystemAccessRule(username, FileSystemRights.FullControl, AccessControlType.Allow));
                    break;
            }
            dirinfo.SetAccessControl(dirsecurity);
            //System.IO.Directory.SetAccessControl(pathname, dirsecurity);

//取消目录从父继承
            //DirectorySecurity dirSecurity = System.IO.Directory.GetAccessControl(pathname);
            //dirSecurity.SetAccessRuleProtection(true, false);
            //System.IO.Directory.SetAccessControl(pathname, dirSecurity);

//AccessControlType.Allow允许访问受保护对象//Deny拒绝访问受保护对象
            //FullControl、Read 和 Write 完全控制,读,写
            //FileSystemRights.Write写入//Delete删除 //DeleteSubdirectoriesAndFiles删除文件夹和文件//ListDirectory读取
            //Modify读写删除-修改//只读打开文件和复制//
        }