Programming Field

Icacls - DOS/コマンドプロンプト コマンド一覧

Icaclsプログラムはファイルまたはディレクトリに対するアクセス制御リスト(Access Control List; ACL)の表示や変更を行います。コマンドラインからアクセス権や監査設定などを管理する目的で使用されます。

※ 権限や所有者を変更するコマンドの実行には、各操作対象のファイル/ディレクトリの情報変更操作に必要な権限を持っている必要があります。

構文

icacls[.exe] <name> /save <acl-file> [/T] [/C] [/L] [/Q]
icacls[.exe] <directory> /restore <acl-file>
  [/substitute <old-sid> <new-sid> [...]] [/C] [/L] [/Q]
icacls[.exe] <name> /setowner <user> [/T] [/C] [/L] [/Q]
icacls[.exe] <name> /findsid <sid> [/T] [/C] [/L] [/Q]
icacls[.exe] <name> /verify [/T] [/C] [/L] [/Q]
icacls[.exe] <name> /reset [/T] [/C] [/L] [/Q]
icacls[.exe] <name> [/grant[:r] <sid>:<perm>[...]]
  [/deny <sid>:<perm>[...]] [/remove[:g|:d] <sid>[...]]
  [/setintegritylevel [(CI)][(IO)][(OI)][(NP)]<level>[...]]
  [/inheritance:<e|d|r>] [/T] [/C] [/L] [/Q]

オプション一覧

共通オプション
<name> または <directory>

操作対象のファイル名またはディレクトリ名を指定します(ワイルドカード可、ただし /restore の場合はディレクトリ名のみ(後述))。

※ 代替データストリームを指定しても元のファイル名に対して操作が行われます。

/T <name> がディレクトリである場合、そのディレクトリにあるファイルやサブディレクトリすべてを対象に含めます。
/C 操作中にエラーが発生しても無視して処理を続行します。
/L

操作対象にシンボリックリンクが含まれる場合、リンク先のファイル/ディレクトリではなくリンク自体を操作対象とします。

※ ジャンクションポイントやハードリンクに対しては効果がありません。

/Q

操作中のメッセージを抑止します。

※ 完了時のメッセージは表示されますが、そのメッセージ内のファイル数は 0 と表示されるようです(実際の処理数と異なる場合があります)。

/save <acl-file>
アクセス制御リスト(ACL)の情報をファイルに保存します。
<name> ディレクトリの場合、末尾を「\」で終わる形で指定すると、情報保存時のファイル名がそのディレクトリを起点とした相対パスで保存されます。
<acl-file>

ACLの情報を保存(出力)するファイル名を指定します。SDDL(Security Descriptor Definition Language)が用いられたテキストファイルが生成されます。

※ ファイルはBOM付きUTF-16(LE)フォーマットで保存されます。

/restore <acl-file>
ファイルに保存されたアクセス制御リスト(ACL)の情報をディレクトリ内のファイルに適用(復元)します。復元前のファイルに設定されていたACL情報は無くなります。
<directory>

/restore では <directory> の箇所にディレクトリ名のみ指定できます。このディレクトリは <acl-file> のファイル内に記述された(相対パスで表現された)各ファイルの親ディレクトリとして扱われます。

※ 単体のファイル/ディレクトリをここで指定して情報を復元することはできません。その場合は <acl-file> 内のデータを単体のファイル/ディレクトリのみにしてその親ディレクトリを <directory> に指定します。
※ 単体のディレクトリに対する情報を復元する場合で <directory> にその親ディレクトリを指定できない場合(ルートディレクトリである場合など)は、<acl-file> 内のファイル名部分を「.」にして <directory> に自身のディレクトリを指定します。

<acl-file>

ACLの情報を復元するためにその情報を保持するファイル名(入力ファイル)を指定します。SDDL(Security Descriptor Definition Language)が用いられたテキストファイルを指定します。

※ ファイルはUTF-16(LE)フォーマットである必要があります(BOMは無くても問題ない模様です)。

/substitute <old-sid> <new-sid> [...]

復元時、<old-sid> が示すユーザー・識別子が復元する情報に含まれている場合、それを <new-sid> のユーザー・識別子に置き換えます。<old-sid> および <new-sid> には「[domain-name\]user-name」の形式で指定するか、「*S-1-...」のように「*」文字とSID文字列を組み合わせて指定します

また、「/substitute <old-sid> <new-sid>」の指定は複数行うことができます。

※ 「old-sid」「new-sid」というプレースホルダー名になっていますが、SIDを直接指定する場合は「*」文字を先頭に付ける必要があります。
<old-sid> が示すユーザー・識別子の権限が親オブジェクトを継承したものである場合、継承はそのままにその権限をコピーしたものが <new-sid> のユーザー・識別子の権限として割り当てられます。その場合、<old-sid> に対する権限はそのまま(継承状態を保持する形で)残ります。

/setowner <user>
ファイル/ディレクトリの所有者を変更します。(Takeown と異なり、現在のユーザー以外にも設定できますが、強制的な変更はできません。)
<user> 新しい所有者のユーザー名/識別子を指定します。「[domain-name\]user-name」の形式で指定しますが、「*S-1-...」のように「*」文字とSID文字列を組み合わせて指定することもできます。
/findsid <sid>
<sid> で指定するユーザー名/識別子に対する権限が明示的に定義されているファイルを検索します。<name> にワイルドカードが指定されているか /T オプションが指定されている場合は、対応する複数のファイル/ディレクトリが検索対象となります。
<sid>

ユーザー名を指定します。「[domain-name\]user-name」の形式で指定するか、「*S-1-...」のように「*」文字とSID文字列を組み合わせて指定します。

※ 「sid」というプレースホルダー名になっていますが、SIDを直接指定する場合は「*」文字を先頭に付ける必要があります。

/verify
ACLの検証を行います。ファイルシステムの破損などでACLの状態に問題が出ているかどうかを確認します。
Chkdskではセキュリティ識別子のチェック自体は行いますが、ACLのチェックまでは行わないため、ACL状態のチェックにはIcaclsを使う必要があります。
/reset
個別に設定されたACLを破棄し、ACLを継承されたもののみにします。
[/grant[:r]] [/deny] [/remove] [/setintegritylevel] [/inheritance]
対象のファイルに権限を設定します。/grant, /deny, /remove, /setintegritylevel, /inheritance のいずれのオプションも指定しない場合、対象のファイルに設定されている権限を表示(画面に出力)します。
※ 「/grant」や「/deny」などで同一ユーザー・識別子に対する権限設定が重なる場合、重なる部分は後に指定されたオプションが優先されます。
/grant[:r] <sid>:<perm>[...]

対象のユーザー・識別子に対する権限(「許可」権限、許可ACE)を付与します。「/grant:r」でオプションを指定した場合、既に対象のユーザー・識別子に権限が設定されていた場合はそれを置き換え、「/grant」でオプションを指定した場合は置き換えずに追加する形で権限を付与します。

<sid>」には対象のユーザー・識別子を示す文字列を「[domain-name\]user-name」の形式か「*S-1-...」(「*」文字とSID文字列)の形式で指定します。

<perm>」には付与したい権限を文字列で指定します。この文字列の書式は後述の「perm で指定する文字列」をご覧ください。

「/grant」は複数指定できます(複数のユーザー・識別子にそれぞれ権限を付与する場合は対応する数の「/grant」を記述します)。

なお、<sid><perm> の間にはスペースを含めず、「:」(コロン)の区切り文字を入れます(User:perm のような形式)。

/deny <sid>:<perm>[...]

対象のユーザー・識別子に対して「拒否」権限(明示的な拒否ACE)を付与します。「<sid>:<perm>」の書式は /grant と同様であり、/deny も複数指定することが可能です。

/deny で拒否権限を付与した場合、既に同じ権限が「許可」されているとそれらは削除されます。

/remove[:g|:d] <sid>[...]

対象のユーザー・識別子に対する権限設定をすべて削除します。「/remove:g」と指定した場合は「許可」の権限すべて、「/remove:d」と指定した場合は「拒否」の権限すべて、単に「/remove」と指定した場合は両方の権限すべてを削除します。

<sid>」に指定する値は /grant や /deny と同様です。

/setintegritylevel [(CI)][(IO)][(OI)][(NP)]<level>

ファイルに「整合性レベル」(Integrity level)を設定します。<level> には「Low」「Medium」「High」またはそれらの頭文字を指定します。なお、Icacls のコマンドラインでの整合性レベル設定は「NW」(SYSTEM_MANDATORY_LABEL_NO_WRITE_UP)のみ設定可能であり、解除することはできません(/reset や /restore でも解除されません)。

<name> がディレクトリである場合、「(CI)」「(IO)」「(OI)」「(NP)」の中から1つまたは複数を「<level>」の前に指定することができます(「(CI)」「(IO)」などの指定は「perm で指定する文字列」で指定できるものと同様です)。

※ Icaclsのヘルプでは「<level>:<policy>」とありますが、現在 <level> しか使用されておらず、「L」「M」「H」のいずれかの文字で始まっていれば以降のスペース区切り以外の文字は何であっても無視されるようです。
※ 「/setintegritylevel」も複数指定可能ですが、最後の指定のみ効果があります。
※ 解除するにはファイル・ディレクトリを作り直すか整合性レベルを取り扱うようなツールを利用する必要があります。

/inheritance:<e|d|r>

権限データ(ACEデータ)の継承について設定します。「:」のあとに e, d, r のいずれかを指定しますが、それらの意味は以下の通りです。

/inheritance:e親オブジェクトの権限を継承します。
/inheritance:d親オブジェクトの権限を継承せず、親の権限をコピーして自分に割り当てます。
/inheritance:r親オブジェクトの権限を継承せず削除します。既に個別に割り当てられている権限は(同一であるかにかかわらず)そのままにします。

解説

Icacls使用例1

Windowsのセキュリティシステムにおいては、「オブジェクト」という抽象的な概念に「セキュリティ記述子」(Security Descriptor)というものが紐づけられ、その中にアクセス制御エントリ(Access Control Entry; ACE)を複数持った「アクセス制御リスト」(Access Control List; ACL)が含まれます。ACLは「DACL (Discretionary ACL; 任意に扱えるACL)」と「SACL (System ACL)」の2種類がセキュリティ記述子に含まれ、通常はDACLを適切に設定してアクセス権の制御などを行います。

ファイルやディレクトリはこのシステムにおける「オブジェクト」に該当しており、それぞれセキュリティ記述子およびACL、ACEを持っています。ファイルやディレクトリに対してACLを設定することにより、ファイルの読み書きや実行などの権限を制御します。Icaclsプログラムは、これらファイルやディレクトリのACL(DACL)制御をコマンドラインで操作するツールとして提供されています。

※ 他にはレジストリも「オブジェクト」に含まれ、プロセスやスレッドも作成時や実行時などには(ファイルとは別の)「オブジェクト」として扱われます。
※ Windows XPまではCaclsプログラムが提供されていましたが、現在はIcaclsプログラムの使用が推奨されています(Caclsも使用することはできます)。

perm で指定する文字列

「/grant」「/deny」「/remove」の各オプションにおける「<perm>」には、単純な権限を指定するか「( )」内に詳細な権限をコンマ区切りで指定します。また、ディレクトリに対しては継承に関する権限の指定も組み合わせることができます。

単純な権限
以下の文字を1つまたは(「RWRX」のように)繋げて指定します。ただし「N」のみは単体で指定する必要があります。
Nアクセス権無し
Fフルコントロール
M変更
R読み取り(専用)
RX読み取りと実行
W書き込み(専用)
D削除
※ フルコントロールを除き、アクセス権変更を許可する指定はないため、アクセス権変更の権限を扱う場合は以下の詳細権限設定を利用する必要があります。
詳細な権限
以下の文字を1つまたはコンマ区切りで複数繋げ、全体を「( )」で括って指定します。(例: 「(RD,WD,AD)」)
RDデータの読み取り、またはディレクトリ内の一覧表示(取得・列挙)
RA属性の取得
REA拡張属性の取得
RCアクセス権の読み取り
GR一般的な「読み取り」権(RD, RA, RC, REAを組み合わせた値です)
WDデータの書き込み、またはディレクトリ内へのファイルの追加
ADデータの追加書き込み、またはディレクトリ内へのサブディレクトリの追加
WA属性の変更
WEA拡張属性の変更
GW一般的な「書き込み」権(WD, AD, WA, WEAを組み合わせた値です)
Xファイルの実行、またはディレクトリのスキャン(走査)
GE一般的な「実行」権(RA, RC, Xを組み合わせた値です)
DE削除
DC子の削除
WO所有者の設定(変更)
WDACDAC(アクセス権設定)の変更
GA一般的な全アクセス権(フルコントロール)
ASシステムACL(SACL)の変更
S同期処理(待機関数)への利用
MA最大限のアクセス許可
Attribで変更できる属性の変更は「WA」で制御しますが、「RA」が無くてもこの属性の取得は可能です。
※ 多くのアプリケーションはファイル書き込みに「GW」(GENERIC_WRITE; WD + AD + WA + WEA)を要求しており、その場合は WD, AD, WA, WEA のいずれかが欠けると書き込みできなくなります。
※ 「ディレクトリのスキャン(走査)」権は、既定のユーザーの権限では無視する設定になっています。
※ 「MA」(Maximum Allowed)の指定はアクセス権を要求する際に使用されるものであり、ファイルやディレクトリなどのアクセス権として指定する場合は何も意味を持ちません。(参考: [MS-DTYP]: ACCESS_MASK (英語))
※ 「AS」(Access System Security)はファイルやディレクトリに対しては特に効果を持ちません。
継承に関する権限
対象がディレクトリである場合、指定した権限を子に継承できるかどうか追加で指定することができます。上記の単純な権限または詳細な権限の手前に「( )」付きで1つまたは複数指定します。(例: 「(OI)(CI)F」「(OI)(IO)(GR,GE)」
(OI)子オブジェクト(ファイル)に継承
(CI)子コンテナー(サブディレクトリ・サブフォルダー)に継承
(IO)継承のみ行い、自身には権限を与えない
(NP)直下のオブジェクト(ファイル)やコンテナー(サブディレクトリ・サブフォルダー)には継承するが、さらに下(孫)のオブジェクトやコンテナーには継承させない
※ 「(NP)」の指定は、エクスプローラーのファイルセキュリティ詳細設定(アクセス許可エントリ)における「これらのアクセス許可を、このコンテナーの中にあるオブジェクトやコンテナーにのみ適用する」の設定に該当します。
※ 「(I)」(親から継承)は現在の状態を表示する際にその状態に該当していると表示されますが、設定パラメーターに含めることはできません(代わりに「/inheritance」を使います)。

Security Descriptor Definition Language (SDDL)

Security Descriptor Definition Language (SDDL; セキュリティ記述子定義言語)はセキュリティ記述子(アクセス権などの情報)を文字列として定義した言語です(その文字列は「Security Descriptor String Format」と呼ばれます)。Icaclsの /save オプションと /restore オプションで指定するファイルでは奇数行目にファイル(ディレクトリ)名を記述し、偶数行目にそのファイルに対応するセキュリティ記述子をSDDLで記述します。

SDDLの概要についてはMicrosoft Learnの『Security Descriptor Definition Language』(英語)、文字列の具体的な書式についてはMicrosoft Learnの『Security Descriptor String Format』(英語)をご覧ください。

※ Security Descriptor String FormatはWin32APIのConvertStringSecurityDescriptorToSecurityDescriptor関数(英語)およびConvertSecurityDescriptorToStringSecurityDescriptor関数(英語)の入出力でも用いられます。

整合性レベル

Icacls使用例2

Icaclsは限定的ながら「整合性レベル」(Integrity level)の設定が可能です。整合性レベルは、LowやHighなどの段階(Level)と「NO_WRITE_UP」や「NO_EXECUTE_UP」などの権限の組み合わせで設定されます。整合性レベル「High」に設定された権限の種類に対応するアクセスを行う場合、UACによる権限の昇格が必要になったり、「Medium」に設定された権限のアクセスは保護モード(Lowに相当)のユーザーやプロセスから拒否されるなど、通常の権限設定とは異なる権限管理に利用されます。また、「Low」に設定されているプログラムからはMedium以上または未設定のファイルへの書き込みができません(ブラウザーなど不用意にプログラムが実行されるのを防止する目的などで利用されます)。

※ 「%USERPROFILE%\AppData\LocalLow」ディレクトリは整合性レベルがLowに設定されており、Low設定のプログラムから書き込みを行いたい場合などに利用されます(そのようなプログラムでは「%USERPROFILE%\AppData\Local」と使い分けが行われます)。

サンプル1

icacls MyFile.txt

「MyFile.txt」のアクセス権情報(ACLが保持しているエントリ)を画面に出力します。

サンプル2

icacls . /reset /T /C /L /Q

現在のディレクトリとその中にあるファイル・ディレクトリ(サブディレクトリなども含む)のACLをリセットし、親ディレクトリの権限を継承する形にします。ディレクトリ内に意図しない権限が設定されている場合にこのコマンドでリセットすることができます。なお、リセット時にエラーが出ても継続するように「/C」オプションを付加しています。

※ アクセス権設定を変更する権限を持っていないファイルやディレクトリがあり、それらが現在のセッションのユーザーが所有しているものではない場合、それらのファイル・ディレクトリへのリセットはエラーになります。

サンプル3

icacls PrivateSchedule /reset
icacls PrivateSchedule /grant:r Luminas:F /grant:r BUILTIN\Administrators:F /inheritance:r

「PrivateSchedule」のACLを一旦リセットしたのち、「Luminas」と「BUILTIN\Administrators」(システム組み込みの管理者グループ)に対してアクセス権をフルコントロールに設定します(それ以外のユーザー・グループには何も設定しません)。また、親ディレクトリの権限は継承せず適用もされないように設定、すなわち「/grant」で指定したユーザー・グループ以外は何も権限を持たないようにします。

※ 1行目のリセットを省略すると、既に「PrivateSchedule」に個別のACEが設定されているとそれらが残る状態になり、2行目の指定では意図しなかったアクセス権が残ることになる場合があります。

サンプル4

icacls ProtectedDir /setintegritylevel (OI)(CI)Low
start ProtectedDir\MyProgram.exe

「ProtectedDir」ディレクトリの整合性レベルを「Low」に設定します(「(OI)」「(CI)」により設定を継承させます)。このディレクトリおよびサブディレクトリ内にあるプログラムはLowレベルで実行されるため、「ProtectedDir\MyProgram.exe」は原則としてLowレベル指定のあるファイルやディレクトリにしか書き込みができないようになります。

[Windows 8以降] Windows SmartScreenが有効になっている場合(既定では有効です)、Lowレベルのプログラムの実行時に確認のダイアログが表示されます。

サンプル5

icacls MyDir\. /save MyDirAcls.dat

「MyDir」ディレクトリ自身のACLデータを「MyDirAcls.dat」ファイルに保存します。これを復元するには以下のようにします。

icacls MyDir /restore MyDirAcls.dat

※ /save において「MyDir\.」を「MyDir\」で指定すると、「MyDirAcls.dat」内の記述においてファイル・ディレクトリ名が入るべき場所が空欄になり、/restore での解析に失敗します。「MyDir\.」とすることによりそこが空欄ではなく「.」となり、/restore で正しく解析できるようになります。

ACLデータの保存・復元は以下のようなコマンド指定でも行うことができます。

(保存)

icacls MyDir /save MyDirAcls.dat

(復元)

icacls . /restore MyDirAcls.dat

※ /save において「MyDir\.」を「MyDir」で指定することで、「MyDirAcls.dat」内の記述においてファイル・ディレクトリ名が入るべき場所が「MyDir」となります。この場合、/restore で指定すべきディレクトリは「MyDir」ではなくその親ディレクトリにあたる「.」となります。これは、「/restore」がファイルを解析する際に読み取るファイル・ディレクトリ名は /restore で指定したディレクトリを起点としたものとして扱うためです。

関連項目