DirectorySecurity未正确设置权限

时间:2011-05-10 15:50:47

标签: c#

我有一个C#代码,可以创建一个文件夹并为其设置一些权限。这是代码示例:

static void Main(string[] args){

        Directory.CreateDirectory("C:\\vk07");
        DirectorySecurity dirSec = Directory.GetAccessControl("C:\\vk07");

        dirSec.AddAccessRule(new FileSystemAccessRule("INTRANET\\fGLBChorusUsers", FileSystemRights.ReadAndExecute, AccessControlType.Allow));            
        Directory.SetAccessControl("C:\\vk07", dirSec);
}

当我检查在上面创建的文件夹上设置的权限时,它没有“读取”和“修改”(这是我在代码中设置的内容),而是仅显示“特殊权限”。

有人可以帮我这个吗?我是ACL新手,所以不太了解它。

5 个答案:

答案 0 :(得分:9)

我遇到了同样的问题,实际的原因是,如果你从另一篇文章中查看该网络服务图片,它只适用于文件。如果他们说“此文件夹,子文件夹和文件”,则基本权限将仅显示在第一张图片上。为此,您需要设置两个标志-InheritanceFlags.ContainerInherit + InheritanceFlags.ObjectInherit。

    Try
        'If destination directory does not exist, create it first.
        If Not Directory.Exists(path) Then Directory.CreateDirectory(path)

        Dim dir As New DirectoryInfo(path)
        Dim dirsec As DirectorySecurity = dir.GetAccessControl()
        'Remove inherited permissions
        dirsec.SetAccessRuleProtection(True, False)

        'create rights, include subfolder and files to be inherited by this
        Dim Modify As New FileSystemAccessRule(username, FileSystemRights.Modify, InheritanceFlags.ContainerInherit + InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow)
        Dim Full As New FileSystemAccessRule(admingroup, FileSystemRights.FullControl, InheritanceFlags.ContainerInherit + InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow)

        dirsec.AddAccessRule(Modify)
        dirsec.AddAccessRule(Full)
        'Set
        dir.SetAccessControl(dirsec)
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try

答案 1 :(得分:4)

此代码适用于我:

    security.AddAccessRule(
    new FileSystemAccessRule(
        "domain\\login",
        FileSystemRights.Modify,
        InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
        PropagationFlags.None,
        AccessControlType.Allow
    ));

答案 2 :(得分:3)

我也有这个问题。执行以下代码后:

var security = Directory.GetAccessControl(folderPath);
security.AddAccessRule(
    new FileSystemAccessRule(
        new SecurityIdentifier(WellKnownSidType.NetworkServiceSid, null),
        FileSystemRights.Modify,
        InheritanceFlags.ObjectInherit,
        PropagationFlags.InheritOnly,
        AccessControlType.Allow
    )
);
Directory.SetAccessControl(folderPath, security);

...然后 folderPath 的属性对话框将显示如下:

Folder Properties Dialog

如您所述,仅选中“特殊权限”,但如果您点击“高级”,则会看到:

Advanced Security Settings Dialog

请注意,在此对话框中,NETWORK SERVICE具有修改权限。

似乎当您以编程方式设置权限时,Windows不会在文件夹属性对话框中显示这些权限,但它们仍然存在于高级安全设置下。我还确认我的Window服务(作为NETWORK SERVICE运行)可以访问 folderPath 中的文件。

答案 3 :(得分:2)

FileSystemRights.ReadAndExecute不允许您修改。这是只读的。 您需要FileSystemRights.Modify才能获得全部范围。 您可以查看out以了解可用选项。

以下是上述示例:

String dir = @"C:\vk07"; 
Directory.CreateDirectory(dir); 
DirectoryInfo dirInfo = new   DirectoryInfo(dir); 
DirectorySecurity dirSec = dirInfo.GetAccessControl(); 
dirSec.AddAccessRule(new FileSystemAccessRule("INTRANET\\fGLBChorusUsers",FileSystemRights.Modify,AccessCo‌ntrolType.Allow)); 
dirInfo.SetAccessControl(dirSec);

答案 4 :(得分:0)

我在VB中使用相同的代码,设置了FileSystemRights.FullControl。

        Dim fsRule As FileSystemAccessRule = New FileSystemAccessRule(sid, FileSystemRights.FullControl, (InheritanceFlags.ContainerInherit + InheritanceFlags.ObjectInherit), PropagationFlags.None, AccessControlType.Allow)