设置目录/子目录/文件的权限

5
我希望能够为特定用户设置目标文件夹内子文件夹和文件的权限。
到目前为止,我已经找到了如何为特定文件夹设置权限,但是没有找到如何为原始文件夹内的子文件夹和文件设置权限的方法。在广泛的互联网搜索之后,我没有找到任何解决这个问题的线索。同时,Windows文档只显示如何为一个目录设置权限。
class DirectoryPermissions
{
    public static void DirectoryPermissionsMain(string Directory, string Account, string Rights, int Takeaway, string Domain)
    {
        try
        {
            string DirectoryName = Directory;

            Console.WriteLine("Adding access control entry for " + DirectoryName);
            if(Takeaway == 0 && Rights.Equals("Read")){
                AddDirectorySecurity(DirectoryName, Domain + @"\" + Account, FileSystemRights.ReadData, AccessControlType.Allow);

                Console.WriteLine("Removing access control entry from " + DirectoryName);
            }

            MessageBox.Show("Done");

        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }

        Console.ReadLine();
    }

    // Adds an ACL entry on the specified directory for the specified account.
    public static void AddDirectorySecurity(string FileName, string Account, FileSystemRights Rights, AccessControlType ControlType)
    {
        // Create a new DirectoryInfo object.
        DirectoryInfo dInfo = new DirectoryInfo(FileName);

        // Get a DirectorySecurity object that represents the 
        // current security settings.
        DirectorySecurity dSecurity = dInfo.GetAccessControl();

        // Add the FileSystemAccessRule to the security settings. 
        dSecurity.AddAccessRule(new FileSystemAccessRule(Account,
                                                        Rights,
                                                        ControlType));

        // Set the new access settings.
        dInfo.SetAccessControl(dSecurity);

    }
}

我希望你能指引我正确的方向。

1个回答

8

您需要添加另一个AccessRule,并将InheritanceFlags设置为ContainerInherit和ObjectInherit。

要使权限传播到子文件夹,PropagationFlag仅设置为Inherit。

以下是示例:

    public void PropogateSecurity(string userid,string directory)
    {

        var myDirectoryInfo = new DirectoryInfo(directory);
        var myDirectorySecurity = myDirectoryInfo.GetAccessControl();
        myDirectorySecurity.AddAccessRule(new FileSystemAccessRule(userid, FileSystemRights.Modify, InheritanceFlags.ContainerInherit, PropagationFlags.InheritOnly, AccessControlType.Allow));
        myDirectorySecurity.AddAccessRule(new FileSystemAccessRule(userid, FileSystemRights.Modify, InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, AccessControlType.Allow));
        myDirectoryInfo.SetAccessControl(myDirectorySecurity);

    }

你也可以使用递归来实现,但我更喜欢上面的方法,因为清理权限会很麻烦。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接