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

问题描述 投票:0回答:1

我希望能够为特定用户设置目标文件夹内的子文件夹和文件的权限。

到目前为止我发现了如何设置特定文件夹的权限。但不适用于原始文件夹内的子文件夹和文件。 经过广泛的互联网搜索后,我找不到任何关于如何解决这个问题的线索。另外,Windows doku 只展示了如何仅设置目录的权限。

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);

    }
}

我希望你们中的一位能给我指出正确的方向。

c# permissions directory
1个回答
9
投票

您必须添加另一个 AccessRule,并将 InheritanceFlags 设置为 ContainerInherit AND ObjectInherit。

要获得传播到子文件夹的权限,请将 PropagationFlag 设置为仅继承。

下面是一个例子

    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);

    }

您也可以通过递归来完成此操作,但上面的方法是我的首选方法,因为清理权限会很烦人。

© www.soinside.com 2019 - 2024. All rights reserved.