UnauthorizedAccessException について

初級者向けにおさらいします。

目次

この例外エラーの説明

Unauthorized Access(権限を必要とするデータソースに対して、権限が無い状態でアクセスしようとすることで発生する)Exception です。ファイルやフォルダへの読み書き権限だったり、一般ユーザーで管理者権限が必要なフォルダやファイルにアクセスしようとしたり、システム設定やレジストリ操作をしようとしたりする際などに発生します。SecurityException の可能性もあります。ASP.NET の場合は、IIS のコンテンツディレクトリのアクセス権限を確認したりします。

事例とその対処方法

例外エラーは、想定外の扱われ方をすると発生して飛んで来ます。それは命令の使い方が間違っていたり、存在しないデータを扱おうとしていたり、アカウント権限を越えたアクセスをしようとしていたり(Windows 側やウェブ側の話だったり)、サービスが動いていないのに連携しようとしたり、製品上の仕様考慮モレだったり、そういう系です。

こうなっている前提のはずだから、こうやろうとしたのに、実際はここがこうなっているからダメじゃん!こういう場合の処理が無いじゃん!みたいなコードになっていませんか?

System.IO.File

1つ目

※わざとあらかじめ、"error.log" を読み取り拒否設定に変えています。

Dim logFile As String = "error.log"
Dim logData As String = File.ReadAllText(logFile)
System.UnauthorizedAccessException: 'パス 'C:\~\bin\Debug\error.log' へのアクセスが拒否されました。'

読み取り拒否の場合は、そのPCのエクスプローラー上から拒否設定を解除する手間がありますが、読み取り専用であれば、プログラムから属性を変更することが可能です。自分だけが使うファイルであれば属性を変更しても良いですが、他のプログラムも参照しているようなファイルの場合は、オリジナルには何もせずに、自分のところのフォルダにコピーしてきて操作した方が良い場合もあります。

Dim original As String = "original.log"
Dim logFile As String = "error.log"

' コピーして、読み取り属性を削除する
File.Copy(original, logFile)
Dim fi As New FileInfo(logFile)
fi.IsReadOnly = False


Dim logData As String = File.ReadAllText(logFile)

2つ目

Dim jsonFile = "C:\Program Files (x86)\Microsoft.NET\settings.json"
File.WriteAllText(jsonFile, "key: value")
System.UnauthorizedAccessException: 'パス 'C:\Program Files (x86)\Microsoft.NET\settings.json' へのアクセスが拒否されました。'

インストールしている自社製品のフォルダ内に、設定ファイルを配置してやり取りしようとした場合、Program Files など重要な場所には操作できないようになっています。どうしても読み書きしたい場合は、ここではなく、ユーザーアカウント別の管理下にある、AppData\Roaming フォルダに専用フォルダを作成して、その中に設定ファイルなどを配置、操作します。

' ※"C:\Users\user\AppData\Roaming\PerfectSoft\settings.json"
Dim jsonFile = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
jsonFile = Path.Combine(jsonFile, "PerfectSoft\settings.json")

File.WriteAllText(jsonFile, "key: value")