icacls - アクセス権の確認・変更
フォルダを開こうとして「このフォルダーにアクセスする許可がありません」と表示されたり、ファイルを削除しようとして「アクセスが拒否されました」と表示されたりすることがあります。
これは、ファイルやフォルダに設定されたアクセス権(ACL: アクセス制御リスト)が原因です。コマンドプロンプトでは、icaclsコマンドでアクセス権を確認・変更でき、takeownコマンドで所有権を取得できます。
ここでは、この 2 つのコマンドの使い方を、よく使う手順を中心に説明します。
icaclsコマンドの基本構文
icacls <ファイル or フォルダ> [オプション]
オプションを付けずに実行すると、現在のアクセス権を表示します。
icacls "C:\work"
1 行が 1 つのユーザー(またはグループ)の設定で、ユーザー:(権限)の形式で表示されます。
権限の種類
(F)や(M)は、付与されている権限を表します。よく使うものは以下の 5 つです(これらを「基本アクセス権」と呼びます)。
| 記号 | 意味 |
|---|---|
F | フルコントロール(すべての操作、権限の変更も可) |
M | 変更(読み取り・書き込み・削除) |
RX | 読み取りと実行 |
R | 読み取り専用 |
W | 書き込み専用 |
そのほか、D(削除)などの個別の権限もありますが、まずは上の 5 つを覚えておけば十分です。
継承を表す記号
フォルダに設定したアクセス権を、中のファイルやサブフォルダに引き継ぐかどうかは、権限の前に付く記号で表されます。
| 記号 | 意味 |
|---|---|
(OI) | オブジェクト継承。フォルダ内のファイルに引き継ぐ |
(CI) | コンテナー継承。フォルダ内のサブフォルダに引き継ぐ |
(IO) | 継承のみ。そのフォルダ自身には適用しない |
(NP) | 継承の伝達禁止。直下にだけ引き継ぎ、それより下には伝えない |
(I) | 親フォルダから継承された設定であることを表す |
フォルダ全体にアクセス権を与えたいときは、(OI)(CI)を両方付けるのが基本です。
アクセス権を付与する(/grant)
/grantで、ユーザーやグループにアクセス権を追加します。
icacls "C:\work" /grant "Users:(OI)(CI)M"
上記は、C:\workとその中身に対して、Usersグループに「変更」の権限を与えます。
ユーザー名は、ログイン中のユーザーであれば環境変数%USERNAME%が使えます。
icacls "C:\work" /grant "%USERNAME%:(OI)(CI)F"
/grantは既存の設定を残したまま追加します。既存の設定を置き換えたい場合は/grant:rを使います。
icacls "C:\work" /grant:r "%USERNAME%:(OI)(CI)RX"
/grant:rを使うと、指定したユーザーに対する既存の許可設定が、新しい設定に置き換わります(継承された設定や拒否設定は置き換わりません)。
グループ名は OS の言語によって表記が変わる場合があります。確実に指定したいときは、SID を使い*を前に付けて指定します。たとえば、Administrators は*S-1-5-32-544、Everyone は*S-1-1-0です。
icacls "C:\work" /grant "*S-1-5-32-544:(OI)(CI)F"
アクセス権を拒否・削除する
特定のユーザーを禁止するには/denyを使います。
icacls "C:\work\secret.txt" /deny "Guest:(R)"
設定そのものを取り除くには/removeを使います。
icacls "C:\work\secret.txt" /remove "Guest"
同じ階層に設定された拒否(/deny)は、基本的に許可の設定よりも優先されます。自分自身やUsersグループを拒否に設定すると、自分でも操作できなくなる可能性があります。使うのは、本当に必要な場面だけにしましょう。
サブフォルダやファイルもまとめて変更する(/T)
/Tを付けると、指定したフォルダ以下のすべてのファイルとサブフォルダに対して処理を行います。/Cを付けると、エラーが発生しても処理を続けます。
icacls "C:\work" /grant "%USERNAME%:F" /T /C
継承を制御する(/inheritance)
| オプション | 動作 |
|---|---|
/inheritance:e | 継承を有効にする |
/inheritance:d | 継承を無効にし、継承されていた設定を明示的な設定としてコピーする |
/inheritance:r | 継承を無効にし、継承されていた設定をすべて削除する |
/inheritance:rは継承されていた設定をすべて削除するため、明示的な設定を付けていないと、実行後に誰もアクセスできなくなることがあります。迷うときは/inheritance:dを使いましょう。
アクセス権を初期状態(親フォルダの継承設定)に戻したいときは、/resetが便利です。
icacls "C:\work" /reset /T /C
自分で付与したユーザーの権限や拒否設定は失われ、親フォルダから継承した設定に置き換わります。/Tを付けると配下のすべてに及ぶため、実行前に/saveでバックアップしておきましょう。
「アクセスが拒否されました」を解消する
他のユーザーが作成したフォルダや、以前のPCから移したデータなどにアクセスできない場合、所有権を取得してから、自分にアクセス権を付与するのが基本の手順です。管理者として実行したコマンドプロンプトで行います。
1. 所有権を取得する(takeown)
takeown /f "D:\old-data" /r /d y
| オプション | 意味 |
|---|---|
/f | 対象のファイルまたはフォルダ(ワイルドカードも可) |
/r | サブフォルダとファイルも対象にする |
/d y | フォルダの内容を一覧表示する権限がないとき、確認せず「はい」で続行する |
/a | 所有者を Administrators グループにする(付けない場合は現在のユーザーが所有者になる) |
/rを使うときは、/d y(または/d n)をあわせて指定すると、確認が出ずに処理が進みます。
2. アクセス権を付与する(icacls)
所有者になっても、自動的にアクセス権が付くわけではありません。続けてicaclsで自分に権限を付与します。
icacls "D:\old-data" /grant "%USERNAME%:(OI)(CI)F" /T /C
この 2 行を実行すれば、多くの場合、フォルダを開いたり削除したりできるようになります。
C:\WindowsやC:\Program Files、ドライブのルート(C:\)などに対して所有権やアクセス権を変更すると、Windows が正常に動作しなくなる恐れがあります。変更するのは、自分のデータが入ったフォルダだけにしましょう。
アクセス権のバックアップと復元
変更する前に、現在の設定を保存しておくと安心です。
icacls "C:\work\*" /save "%USERPROFILE%\work-acl.txt" /T
元に戻すときは、保存した項目が入っているフォルダを指定して/restoreを実行します。
icacls "C:\work" /restore "%USERPROFILE%\work-acl.txt"
/restoreには、保存したときの対象が入っているフォルダを指定します。上の例では、C:\work\*(C:\workの中身)を保存したので、C:\workを指定します。
バッチファイルでの使い方
icaclsとtakeownは、成功するとERRORLEVELが0、失敗すると0以外になります。結果に応じた処理が書けます。if errorlevel 1は直前のコマンドの結果しか見ないため、コマンドごとに判定します。なお、> nulは通常の出力だけを隠し、エラーメッセージは表示されます。
@echo off
setlocal
set "TARGET=D:\old-data"
takeown /f "%TARGET%" /r /d y > nul
if errorlevel 1 (
echo 所有権の取得に失敗しました。管理者として実行しているか確認してください。
exit /b 1
)
icacls "%TARGET%" /grant "%USERNAME%:(OI)(CI)F" /T /C > nul
if errorlevel 1 (
echo アクセス権の変更に失敗しました。
exit /b 1
)
echo アクセス権を変更しました。
endlocal