• システム開発に関わる内容をざっくりと書いていく

C# UnauthorizedAccessException(ファイル・権限)の原因と対策

UnauthorizedAccessException は、ファイル/フォルダ/レジストリなどへのアクセスが OS に拒否されたときに出る。権限・読み取り専用・排他ロックが典型。

先に結論

  • 例外メッセージのパスと、プロセスの実行アカウントを確認
  • IIS / サービス / コンテナは「ログインユーザー」と権限が違う
  • 読み取り専用属性、他プロセスのロック、ACL 拒否を疑う
  • 書き込み先をプログラム用ディレクトリ(AppData 等)へ寄せると楽なことが多い

よくある原因

  • Program Files 配下への書き込み
  • ネットワーク共有の権限不足
  • ファイルが他プロセスに開かれている
  • Docker ボリュームの user 不一致
  • レジストリ HKLM への一般ユーザー書き込み

切り分け

  1. パスと操作(Read/Write/Delete)を特定
  2. 実行 ID(アプリプール、サービスアカウント)を確認
  3. エクスプローラ / icacls / コンテナ user で ACL を確認
  4. 読み取り専用・ロックの有無
  5. 再現が特定マシンだけならポリシーや AV も疑う

対策

  • 書き込み可能なデータディレクトリを使う
  • 必要最小限の ACL を付与(Everyone Full は避ける)
  • ファイル共有は FileShare を適切に
  • 失敗時はパスと操作をログ(パスワードは出さない)

ざっくりまとめ

  • 誰が・どこへ・何をしたかを揃える
  • 実行アカウントの違いが最大の罠
  • 書き込み先設計で再発を減らす

関連記事