【问题标题】:VB.NET app is setting restricted file permissions on a directory, which is incorrectly restricting user created files in the same directoryVB.NET 应用程序在目录上设置受限文件权限,这错误地限制了用户在同一目录中创建的文件
【发布时间】:2012-07-18 22:42:48
【问题描述】:

我的 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 的其他组合,但还没有成功。

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

【问题讨论】:

  • 我正在寻找的是一个 umask 等价物。我现在看到,当用户在 Windows 中创建一个新文件/目录时,它会从父目录继承它的权限。我希望用户创建的文件可由该用户删除,而不允许用户删除父目录。似乎不可能让这个用户生成的文件/目录继承父权限并为用户添加删除权限。

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


【解决方案1】:

更新:

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

将其删除
SetAccessRuleProtection(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))

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

【讨论】:

  • 感谢您的回复。但是,问题在于这将为树中的登录用户提供对所有文件夹的写访问权限。该应用程序会创建用户可能无法访问的更深层次的文件夹。继承登录用户的访问权限违反了这一点。我想要这样的树: - lvl 1:用户组读/写,管理员完整 - lvl 2:用户组读/写,管理员完整 - lvl 3:管理员完整 该应用程序制作了这样的树。如果用户组中的某个人而不是管理员在 lvl 2 中创建了一个新文件/文件夹,我希望所有用户都拥有对该文件/文件夹的完全访问权限。
猜你喜欢
  • 2018-08-18
  • 1970-01-01
  • 2015-12-19
  • 2018-04-26
  • 2012-05-24
  • 2013-12-01
  • 2016-01-17
  • 2015-07-28
  • 2023-02-11
相关资源
最近更新 更多