VB.NET应用程序在目录上设置受限制的文件权限,这会错误地将用户创建的文件限制在同一目录中

时间:2012-07-18 22:42:49

标签: vb.net permissions file-permissions ntfs folder-permissions

我的VB.NET应用程序构建了一个访问受限的目录树。

访问权限应该是普通用户无法删除或重命名现有树。但是用户可以在树中的任何位置添加新文件/文件夹。用户创建的文件/文件夹应该可以由任何用户完全修改。

我遇到的问题是获取访问权限,以便无法更改应用程序创建的文件/文件夹,但任何用户都可以更改用户创建的文件/文件夹。

当前发生的情况是,应用程序生成的文件/文件夹行为正常。但是当用户创建自己的文件/文件夹时,该文件的/文件夹的权限仅列出当前用户。因此,其他用户(甚至存在应用程序创建的文件/文件夹的系统管理员)无法查看或修改此用户创建的文件/文件夹。


当前代码:(当用户自己创建文件/文件夹时,此代码不允许访问UserGroup或AdminGroup,只提供刚创建文件/文件夹的用户)

FolderAcl.AddAccessRule(New FileSystemAccessRule(UserGroup,
                        FileSystemRights.ReadAndExecute,
                        InheritanceFlags.None, PropagationFlags.None,
                        AccessControlType.Allow))
FolderAcl.AddAccessRule(New FileSystemAccessRule(UserGroup,
                        FileSystemRights.Write,
                        InheritanceFlags.None, PropagationFlags.None,
                        AccessControlType.Allow))

FolderAcl.AddAccessRule(New FileSystemAccessRule(AdminGroup,
                        FileSystemRights.FullControl,
                        InheritanceFlags.None, PropagationFlags.None,
                        AccessControlType.Allow))

FolderAcl.SetAccessRuleProtection(True, False)


另一个尝试:(当用户自己创建文件/文件夹时,此代码可以访问UserGroup和AdminGroup,但不提供对用户的访问权限。用户在UserGroup中,但是UserGroup没有删除或修改权限,因此如果用户创建文件/文件夹,他们甚至无法命名。)

' same code as above except...
InheritanceFlags.None ---> InheritanceFlags.Container or InheritanceFlags.Object


我已尝试过InheritanceFlags和PropagationFlags的其他组合,但还没有运气。

有什么想法吗?
谢谢, 麦克

1 个答案:

答案 0 :(得分:1)

<强>更新

您可以随时中断继承并决定保留继承的访问规则的副本或使用

删除它
SetAccessRuleProtection(True, True)

第一个布尔参数,如果为true,则中断继承保护;第二个,如果为true,则保留访问规则的副本,以便您只删除不需要的那些。

以下示例应将您的文件夹结构反映为已注释:

 ' folder structure
        '
        '---Level1
        '     |
        '     ---Level2
        '          |
        '          ---Level3

        'set access rules at level1 with inheritance

        Dim Level1DirSec As DirectorySecurity = Directory.GetAccessControl("c:\level1")

        Level1DirSec.AddAccessRule(New FileSystemAccessRule(New System.Security.Principal.SecurityIdentifier(System.Security.Principal.WellKnownSidType.BuiltinAdministratorsSid, Nothing),
         FileSystemRights.FullControl,
         InheritanceFlags.ContainerInherit + InheritanceFlags.ObjectInherit,
         PropagationFlags.None,
         AccessControlType.Allow))

        Level1DirSec.AddAccessRule(New FileSystemAccessRule(New System.Security.Principal.SecurityIdentifier(System.Security.Principal.WellKnownSidType.AuthenticatedUserSid, Nothing),
          FileSystemRights.ReadAndExecute,
          InheritanceFlags.ContainerInherit + InheritanceFlags.ObjectInherit,
          PropagationFlags.None,
          AccessControlType.Allow))

        Directory.SetAccessControl("c:\level1\", Level1DirSec)


        ' break inheritance at level3 and remove access rule for authenticated user group

        Dim Level3DirSec As DirectorySecurity = Directory.GetAccessControl("c:\level1\level2\level3")

        Level3DirSec.SetAccessRuleProtection(True, True)

        Level3DirSec.RemoveAccessRuleAll(New FileSystemAccessRule(New System.Security.Principal.SecurityIdentifier(System.Security.Principal.WellKnownSidType.AuthenticatedUserSid, Nothing), FileSystemRights.ReadAndExecute, AccessControlType.Allow))

        Directory.SetAccessControl("c:\level1\level2\level3", Level3DirSec)

您可以使用WellKnownSid指定组并将其设置在具有继承的根文件夹中:

    FolderAcl.AddAccessRule(New FileSystemAccessRule(New System.Security.Principal.SecurityIdentifier(WellKnownSidType.AuthenticatedUserSid, Nothing),
             FileSystemRights.ReadAndExecute,
             InheritanceFlags.ContainerInherit + InheritanceFlags.ObjectInherit,
             PropagationFlags.None,
             AccessControlType.Allow))

    FolderAcl.AddAccessRule(New FileSystemAccessRule(New System.Security.Principal.SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, Nothing),
             FileSystemRights.FullControl,
             InheritanceFlags.ContainerInherit + InheritanceFlags.ObjectInherit,
             PropagationFlags.None,
             AccessControlType.Allow))

这将为所有经过身份验证的用户提供r / w访问权限,以及对根文件夹以及所有子文件夹和文件的管理员组的完全访问权限。