Приложение VB.NET устанавливает ограниченные права доступа к файлам в каталоге, что неправильно ограничивает файлы, созданные пользователем, в том же каталоге.

Мое приложение 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, но пока не повезло.

Любые идеи?
Спасибо, Майк.


person gimbel0893    schedule 18.07.2012    source источник
comment
Я ищу эквивалент umask. Теперь я вижу, что когда пользователь создает новый файл/каталог в Windows, он наследует его разрешения от родительского каталога. Я хочу, чтобы созданный пользователем файл мог быть удален этим пользователем, не позволяя пользователю удалять родительский каталог. Кажется невозможным, чтобы этот созданный пользователем файл/каталог наследовал родительские разрешения и добавлял права на удаление для пользователя.   -  person gimbel0893    schedule 19.07.2012


Ответы (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))

Это даст доступ для чтения и записи всем аутентифицированным пользователям, а также полный доступ для группы администраторов к вашей корневой папке и всем подпапкам и файлам.

person nik    schedule 19.07.2012
comment
Спасибо за ответ. Однако проблема заключается в том, что для вошедшего в систему пользователя в дереве будет предоставлен доступ на запись ко всем папкам. Приложение создает более глубокие папки, к которым у пользователя может не быть доступа. Наследование доступа для вошедшего в систему пользователя нарушает это. Я хочу такое дерево: - Уровень 1: Чтение/Запись для UserGroup, Полный для Администратора - Уровень 2: Чтение/Запись для UserGroup, Полный для Администратора - Уровень 3: Полный для Администратора Приложение создает такое дерево. Если кто-то в группе пользователей, но не администратор, создает новый файл/папку на уровне 2, я хочу, чтобы все пользователи имели полный доступ к этому файлу/папке. - person gimbel0893; 19.07.2012