Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建具有父权限的文件夹,然后添加其他权限_C#_.net - Fatal编程技术网

C# 创建具有父权限的文件夹,然后添加其他权限

C# 创建具有父权限的文件夹,然后添加其他权限,c#,.net,C#,.net,在C#中,我想在另一个文件夹(或驱动器的根目录)中添加一个文件夹,但我想复制根文件夹的权限,然后将另一个用户添加到新文件夹ACL以及父文件夹ACL(如果有意义的话) 例如。。。如果我有一个名为blah的文件夹,并且在该文件夹中我希望另一个名为blah2的文件夹,我希望blah2具有blak plus的ACL权限,我希望将经过身份验证的用户添加到该列表中 有什么想法吗?右键单击根文件夹,并确保该文件夹设置为将权限下推到任何子文件夹中。创建文件夹后,使用MSDN article向文件夹中添加您想要的

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

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


有什么想法吗?

右键单击根文件夹,并确保该文件夹设置为将权限下推到任何子文件夹中。创建文件夹后,使用MSDN article向文件夹中添加您想要的任何ACL。

您需要了解的主要过程是添加/修改文件或目录的ACL

var parentDir = new DirectoryInfo(@"c:\some\directory");
var parentAc = parentDir.GetAccessControl();
首先,要获取目录的权限集,可以使用
DirectoryInfo.GetAccessControl()
方法(文件将具有类似的
FileInfo.GetAccessControl()
)或静态
目录.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
对象集合。从这里,您可以获取这些规则并将其添加到您想要添加到的目录中。但是如果你想创建新的规则,你必须手工创建规则。看一看这门课,看看你有什么选择。如果您想让每个人都拥有完全的控制权,您可以创建以下规则:

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

当然,您还可以做更多的事情,但这将有助于您了解自己想要做什么。

新文件和文件夹的权限不是已经继承了吗?这应该只是创建文件夹和添加新权限的问题。我认为,如果您将权限更改为文件夹,则在添加新权限之前会首先清除父权限,因此我需要从父权限读取权限?您可能是对的,我不确定是否真的这样做。我只是想看看你有没有考虑过。这就是我理解(NTFS)文件系统工作的方式,.net操作只是暴露了其中的一些。啊,好的:)我的理解是,当你修改文件夹上的ACL时,它不再从父文件夹继承,因此当你添加另一个用户时,你会失去这些权限。。。我想我是对的:)