使用父权限创建文件夹,然后添加其他权限

时间:2014-05-30 13:50:34

标签: c# .net

在C#中我想在另一个文件夹(或驱动器的根目录)中添加一个文件夹,但我想复制根文件夹的权限,然后将另一个用户添加到新文件夹ACL以及来自父母(如果有意义的话)

例如......如果我有一个名为blah的文件夹,并且在该文件夹中我想要另一个名为blah2的文件夹,我希望blah2拥有blak的ACL权限加上我想将经过身份验证的用户添加到该列表中。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您想要了解的主要过程是为文件或目录添加/修改ACLS。

首先,要获取为目录设置的权限集,您可以使用DirectoryInfo.GetAccessControl()方法(文件将具有类似的FileInfo.GetAccessControl())或静态Directory.GetAccessControl()。这将为您提供一个对象,其中包含目录的ACL和其他安全信息。

var parentDir = new DirectoryInfo(@"c:\some\directory");
var parentAc = parentDir.GetAccessControl();

获得后,您可以获取该目录的访问规则(前提是您具有执行此操作的权限)。您可以选择获取继承或显式定义的规则或两者。有一个targetType参数,您可以指定如何获取身份信息。您可能希望将System.Security.Principal.NTAccount类型用于用户友好标识符。正如名称所暗示的那样,继承权限是从父目录继承的权限,而显式是直接添加的权限。

var inheritedRules = parentAc.GetAccessRules(
    includeExplicit: false,
    includeInherited: true,
    targetType: typeof(System.Security.Principal.NTAccount)
);
var explicitRules = parentAc.GetAccessRules(
    includeExplicit: true,
    includeInherited: false,
    targetType: typeof(System.Security.Principal.NTAccount)
);

这将为您提供代表ACL的FileSystemAccessRule个对象的集合。从这里,您可以采用这些规则并将其添加到您要添加到的目录中。但是如果您想创建新规则,则必须手动创建规则。查看FileSystemAccessRule课程,了解可供选择的选项。如果您想让每个人都完全控制,您可以创建规则:

var newRule = new FileSystemAccessRule(
    new System.Security.Principal.NTAccount("Everyone"),
    FileSystemRights.FullControl,
    AccessControlType.Allow
);

要添加新规则,只需获取规则并将其添加到要添加到的访问控制对象中。您不必添加继承的规则,因为......它们将被继承,但您可能希望添加显式规则。请注意,在您将其设置回来之前,对访问控制对象所做的更改将不会反映实际目录。

var dir = parentDir.CreateSubdirectory("test");
var ac = dir.GetAccessControl();
ac.AddAccessRule(newRule);
foreach (FileSystemAccessRule rule in explicitRules)
    ac.AddAccessRule(rule);
dir.SetAccessControl(ac);

当然,你可以做更多的事情,但这应该有助于让你知道你想做什么。

答案 1 :(得分:0)

右键单击根文件夹,确保将文件夹设置为将权限下推到任何子文件夹。创建文件夹后,使用this MSDN文章将所需的ACL添加到文件夹中。

相关问题