在C#中我想在另一个文件夹(或驱动器的根目录)中添加一个文件夹,但我想复制根文件夹的权限,然后将另一个用户添加到新文件夹ACL以及来自父母(如果有意义的话)
例如......如果我有一个名为blah的文件夹,并且在该文件夹中我想要另一个名为blah2的文件夹,我希望blah2拥有blak的ACL权限加上我想将经过身份验证的用户添加到该列表中。
有什么想法吗?
答案 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添加到文件夹中。