2

私の 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 の他の組み合わせを試しましたが、まだうまくいきません。

何か案は?
ありがとう、マイク

4

1 に答える 1

1

アップデート:

いつでも継承を中断し、継承されたアクセス ルールのコピーを残すか削除するかを決定できます。

SetAccessRuleProtection(True, True)

最初のブール値パラメーターが true の場合、継承保護が解除されます。2 番目のパラメーターが 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 アクセスが許可されるだけでなく、ルート フォルダーとすべてのサブフォルダーとファイルへの管理者グループへのフル アクセスが許可されます。

于 2012-07-19T01:59:31.973 に答える