Programming Field

ユーザー権限の確認とファイルのアクセス制御変更(Icacls編) - Windowsコマンド実用例

Windows 環境でファイルやフォルダーのアクセス制御を変更するには Icacls コマンドが便利です。特定のユーザーに読み取り専用アクセスを与える、不要なアクセスを削除する、といった操作が可能です。

使用コマンド

  • Icacls - NTFSアクセス制御リストの表示・設定
  • Echo - バッチファイル内でのメッセージ出力
  • If - 条件付き実行処理

基本操作例

アクセス権の変更

@echo off
icacls "C:\share\important.txt" /grant User1:R
icacls "C:\share\important.txt" /remove User2

上記の例では、User1 に読み取りアクセス(R)を付与し、User2 のアクセス権を削除しています。

アクセス権の確認

icacls "C:\share\important.txt"

現在のアクセス権限を表示します。バッチ処理内でログとして保存することも可能です。

応用例

  • サブフォルダーを含めて一括変更:
    icacls "C:\share" /grant User1:(OI)(CI)M /T

    "C:\share" 以下のすべてのファイルとフォルダーに対して、User1 に変更権限(M)を再帰的に付与します。(OI) は"ファイルに適用"、(CI) は"フォルダーに適用"、/T は再帰処理の指定です。ただしこの方法では、各ファイル・フォルダーに明示的な権限が設定されるため、継承による権限管理が難しくなることがあります。

    実運用では、親フォルダーに対してのみ (OI)(CI) を指定して権限を付与し、子要素には継承で適用する構成の方が、柔軟性や保守性に優れる場合があります。

    親フォルダーのみに継承権限を設定する例:

    icacls "C:\share" /grant User1:(OI)(CI)M

    このように(/T を使わずに指定)すれば、親フォルダー C:\share に対して設定した権限が、サブフォルダーやファイルに継承される形で適用されます。個別にすべてのファイル・フォルダーへ設定を行わなくて済むため、管理が容易になります。

    加えて、既に設定されているサブフォルダー・ファイルの明示的なアクセス権を継承に置き換えたい場合は、以下のコマンドを利用します:

    icacls "C:\share" /inheritance:e /remove /T

    これにより、すべての子要素が親フォルダーからの継承を有効にしつつ、個別に設定された「許可」および「拒否」のアクセス権を削除できます。結果として、継承のみによる一貫したアクセス制御が実現されます。

  • バックアップと復元:
    icacls "C:\share" /save acl_backup.txt /T
    icacls "C:\share" /restore acl_backup.txt

    アクセス制御リスト(権限設定)をファイルに保存しておき、後から復元することも可能です。

  • バッチ内で条件付きで実行:
    @echo off
    setlocal
    set USERNAME=User1
    icacls "C:\share\important.txt" | findstr /C:"%USERNAME%" >NUL
    if errorlevel 1 (
      echo ユーザー %USERNAME% に権限を追加します
      icacls "C:\share\important.txt" /grant %USERNAME%:R
    ) else (
      echo ユーザー %USERNAME% は既に権限を持っています
    )

    findstrifecho を組み合わせて、特定ユーザーに既に権限があるかを確認し、なければ追加するという処理が可能です。

補足事項

  • アクセス制御の設定には管理者権限が必要な場合があります。
  • 変更の際は影響範囲に注意する必要があります。誤って変更するとファイルにアクセスできなくなる場合があります。不安な場合は /save によるバックアップをするのがベターです。
  • /save と /restore を使う場合は、指定したパスの表記(相対パス/絶対パス)によってファイルに書き込まれるフォルダー名が変わります。Icacls のサンプル5もご覧ください。

関連項目