AccessRightType について教えてください

タグの編集
投稿者 N88-Basic  (社会人) 投稿日時 2024/12/20 15:58:40
Visual Studio 2022 + Basic + Windows 11 にてファイルのコピーを行うプログラムを作っています。

今までは、全く問題なく動作していたのですが、「system.unauthorizedAcessException パス ”C:¥user\xxx\Documets\My Music" というメッセージが出力され継続ができません。
この掲示板でも、同じようなじれが紹介されていましたがうまく動作しませんでした。NET で検索した結果以下のような処理を追加しました。
一応、スキップすることができました。
ただ、C# では結構な説明があるのですが、Basic 用は見つかっておりません。

無知は承知で、以下のコード内の AccessRightType.IsPublic で Users グループにアクセス権があるか判断できるものでしょうか?
情報をお持ちでしたらご教授ください(実際のユーザは Adoministrators に属しています)
ーー以下 テストコードーー
            Dim fileInfo As New FileInfo( ターゲットフォルダ )
            Dim fileSec As FileSecurity = fileInfo.GetAccessControl()
            If fileSec.AccessRightType.IsPublic = False Then 
     ’ 使用不可?のためにスキップする
            End If

以上、よろしくお願いします。
投稿者 KOZ  (社会人) 投稿日時 2024/12/21 04:29:53
Type.IsPublic って、そのクラスが Public で宣言されているかどうかなので、アクセス権にはなんら関係ないと思いますが・・・
フォルダなのに、New FileInfo( ターゲットフォルダ ) というのも変ですね。
以下のような感じで確認できます。

Imports System.IO
Imports System.Security.AccessControl
Imports System.Security.Principal

Module Module1

    Sub Main()
        Dim folderPath As String = "xxxxxxxxxx" ' フォルダパスを指定 
        Dim account As String = "BUILTIN\Users"

        Dim directorySecurity As DirectorySecurity = Directory.GetAccessControl(folderPath)
        Dim authorizationRules As AuthorizationRuleCollection = directorySecurity.GetAccessRules(TrueTrueGetType(NTAccount))
        Dim usersGroupHasAccess As Boolean = False
        For Each rule As FileSystemAccessRule In authorizationRules
            Console.WriteLine($"{rule.IdentityReference}:{rule.FileSystemRights}")
            If rule.IdentityReference.Value.Equals(account, StringComparison.CurrentCultureIgnoreCase) Then
                If rule.FileSystemRights.HasFlag(FileSystemRights.Read) Then
                    usersGroupHasAccess = True
                    Exit For
                End If
            End If
        Next

        If usersGroupHasAccess Then
            Console.WriteLine("フォルダに 'Users' グループのアクセス権があります。")
        Else
            Console.WriteLine("フォルダに 'Users' グループのアクセス権がありません。")
        End If
    End Sub

End Module

投稿者 N88-BASIX  (社会人) 投稿日時 2024/12/25 10:50:38
KOZ さん、ご連絡ありがとうございます。
おかげさまで、ご紹介いただいたコードで無事エラーを回避できました。
初めは、BUILTIN\Users の意味が分からず、ユーザー名(ローカルアカウント)などを指定していたのですがうまくいかず、変更せずに行うとうまくいきました。
ただ、別のマシンでは、BUILTIN\Administrators とする必要がありました(状況がわかりませんが、Windows 11 がインストール済みの PC をセットアップしてローカルアカウントに切り替えたり、OneDrive フォルダーを回避したかもしれません。

以上、今後ともよろしくお願いいたします。