icacls.exe を使ってACL(NTFSアクセス権)を設定する
以前に、cacls.exe を使ってACL(NTFSアクセス権)を設定すると、xcacls.vbsを使って詳細なACL(NTFSアクセス権)を変更するでACLを設定する方法を書きました。
今回は、WindowsServer2003 SP2 から使えるようになった。icacls での設定方法です。
現在では、caclsよりも、icaclsを使うことが推奨されているようです。
(XPでicaclsを動かすには、xcaclsが使えないため、icaclsをXPで動かすようにしたを参照)
使い方は、icacls コマンドを叩くと、以下のヘルプが出てくるので、これを見れば大抵わかります。
>icacls
ICACLS <名前> /save
[/T] [/C] [/L] [/Q] 名前が一致するすべてのファイルとフォルダーの DACL を
に 格納して、後で /restore で指定できるようにします。SACL、所有者、整合性
ラベルは保存されません。
ICACLS <ディレクトリ> [/substitute <旧 SID> <新 SID> [...]] /restore:
イル> [/C] [/L] [/Q]
格納されている DACL を <ディレクトリ> 内のファイルに適用します。
ICACLS <名前> /setowner <ユーザー> [/T] [/C] [/L] [/Q]
すべての一致する名前の所有者を変更します。このオプションは所有権の変更を
強制しません。所有権の変更を行うには、takeown.exe ユーティリティを使用し
ます。
ICACLS <名前> /findsid
[/T] [/C] [/L] [/Q]
が明示されている ACL を含むすべての一致する名前を検索します。 ICACLS <名前> /verify [/T] [/C] [/L] [/Q]
ACL が正規の形式ではないか長さが ACE 数と一致しないすべてのファイルを
検索します。
ICACLS <名前> /reset [/T] [/C] [/L] [/Q]
すべての一致するファイルについて、ACL を継承された既定の ACL と置換します。
ICACLS <名前> [/grant[:r]
:perm[...]] [/deny
:perm [...]] [/remove[:g|:d]]
[...]] [/T] [/C] [/L] [/Q] [/setintegritylevel Level:policy[...]]
/grant[:r]
:perm は、指定されたユーザー アクセス権を付与します。 :r を指定すると、以前に付与されたすべての明示的なアクセス許可は新しい
アクセス許可に置き換えられます。
:r を指定しない場合、新しいアクセス許可は以前に付与された明示的な
アクセス許可に追加されます。
/deny
:perm は、指定されたユーザー アクセス権を明示的に否定します。 指定されたアクセス許可の明示的な否定 ACE が追加され、明示的な許可内容
に含まれた同じアクセス許可は削除されます。
/remove[:[g|d]]
は、ACL 内にあるすべての を削除します。 :g を指定すると、その SID に対して許可されたすべての権限を ACL から
削除します。
:d を指定すると、その SID に対して否定されたすべての権限を ACL から
削除します。
/setintegritylevel [(CI)(OI)] レベルは、すべての一致するファイルに整合性
ACE を追加します。このレベルは次の 1 つとして指定されます。
L[ow]
M[edium]
H[igh]
整合性 ACE の継承オプションは、レベルの前に配置でき、
ディレクトリに対してのみ適用されます。
/inheritance:e|d|r
e - 継承を有効にします。
d - 継承を無効にし、ACE をコピーします。
r - 継承された ACE をすべて削除します。
注意:
は数値形式またはフレンドリ名形式で指定できます。数値形式の場合は、 SID の始めに * を付けます。
/T は、<名前> で指定されたディレクトリ以下のすべての一致するファイルと
ディレクトリに対してこの処理が実行されることを指定します。
/C は、どのようなファイル エラーが発生してもこの処理が続行されることを
指定します。ただしエラー メッセージは表示されます。
/L は、この処理がターゲットではなくシンボリック リンク自体に対して実行
されることを指定します。
/Q は、icacls が成功のメッセージを抑制することを指定します。
ICACLS は、ACE エントリの正規の順序を維持します:
明示的な否定内容
明示的な許可内容
継承された否定内容
継承された許可内容
perm はアクセス許可マスクであり、次の 2 種類の方法で指定できます:
単純な権限を列挙:
N - アクセス権なし
F - フル アクセス権
M - 変更アクセス権
RX - 読み取りと実行のアクセス権
R - 読み取り専用アクセス権
W - 書き込み専用アクセス権
D - 削除アクセス権
特定の権限をコンマ区切りでかっこ内に列挙:
DE - 削除
RC - 読み取り制御
WDAC - DAC の書き込み
WO - 所有者の書き込み
S - 同期
AS - システム セキュリティへのアクセス
MA - 無制限
GR - 一般的な読み取り
GW - 一般的な書き込み
GE - 一般的な実行
GA - 一般的なすべての操作
RD - データ読み取り/ディレクトリの一覧表示
WD - データ書き込み/ファイルの追加
AD - データの追加/サブディレクトリの追加
REA - 拡張属性の読み取り
WEA - 拡張属性の書き込み
X - 実行/スキャン
DC - 子の削除
RA - 属性の読み取り
WA - 属性の書き込み
継承権限はどちらの形式の前にも配置でき、ディレクトリにのみ適用され
ます:
(OI) - オブジェクト継承
(CI) - コンテナー継承
(IO) - 継承のみ
(NP) - 継承を適用しない
(I) - 親コンテナーから継承した権限
例:
icacls c:\windows\* /save
/T - c:\windows より下にあるすべてのファイルとサブディレクトリの ACL を
に保存します。 icacls c:\windows\ /restore
-
内のファイルのうち c:\windows とそのサブディレクトリ 内に存在するすべてのファイルの ACL を復元します。
icacls <ファイル> /grant Administrator:(D,WDAC)
- Administrator ユーザーに、<ファイル> に対する削除および DAC 書き込み
のアクセス許可を与えます。
icacls <ファイル> /grant *S-1-1-0:(D,WDAC)
- SID S-1-1-0 によって定義されたユーザーに、<ファイル> に対する削除
および DAC 書き込みのアクセス許可を与えます。
アクセス許可
アクセス許可を与えるは、/grant オプションを使います。
例えば、\\server\test に hodomain\user1 ユーザで"変更"の権限を加えるには以下のようにします。
icacls \\server\test /grant hodomain\user1:(OI)(CI)M
(OI)(CI)は継承をするという設定です。これを付けないと指定したフォルダのみにアクセス権が付与され、そのフォルダ配下は変更されません。
アクセス拒否
アクセス拒否の場合は、/deny オプションを使います。
以下の例は、user1の削除アクセス権を拒否する設定です。
icacls \\server\test /grant hodomain\user1:(OI)(CI)D
ACL削除
設定されたアクセス権を削除する場合は、/remove オプションを使います。
icacls \\server\test /remove hodomain\user1
アクセス許可マスク
一般的というか単純な権限のアクセス許可マスクは以下のようになります。
N - アクセス権なし
F - フル アクセス権
M - 変更アクセス権
RX - 読み取りと実行のアクセス権
R - 読み取り専用アクセス権
W - 書き込み専用アクセス権
D - 削除アクセス権
次は特殊なアクセス許可の指定ですが、以下のアクセス許可マスクが利用できるようです。
カッコ内に書き、複数指定する場合は、カンマ区切りになるようです。
DE - 削除
RC - 読み取り制御
WDAC - DAC の書き込み
WO - 所有者の書き込み
S - 同期
AS - システム セキュリティへのアクセス
MA - 無制限
GR - 一般的な読み取り
GW - 一般的な書き込み
GE - 一般的な実行
GA - 一般的なすべての操作
RD - データ読み取り/ディレクトリの一覧表示
WD - データ書き込み/ファイルの追加
AD - データの追加/サブディレクトリの追加
REA - 拡張属性の読み取り
WEA - 拡張属性の書き込み
X - 実行/スキャン
DC - 子の削除
RA - 属性の読み取り
WA - 属性の書き込み
例えば、あるフォルダの "データ読み取り/ディレクトリの一覧表示" と "削除" のみを許可する権限を付け、配下のフォルダにも継承させる場合は以下のようにします。
icacls \\server\test /grant hodomain\user1:(OI)(CI)(RD,DE)
継承
普通、フォルダは親フォルダのアクセス権を継承されています。
なので、トップフォルダがEveryoneのアクセス許可があって、配下のフォルダは特定のアカウントしかアクセスさせないようにするには、ACLを変更する前に継承を無効にしないといけません。
その為の設定が、/inheritance です。(なぜかWindowsServer2003版のicaclsではヘルプに無いですが、利用は出来ます)
例えば親フォルダの継承を解除し、親から設定されたアクセス権を削除するには以下のようにします。
icacls C:\test /inheritance:r
また、親フォルダの継承を解除し、親から設定されたアクセス権をコピーするには以下のようにします。
icacls C:\test /inheritance:d
eを指定すると継承が有効になります。
また、上述したとおり、/grant や /deny でACL編集する場合、(OI)(CI) を指定しないと、継承が有効にならないため、サブフォルダに適用されません。
ACLの表示、保存、復元
ACLの一覧表示は、パスを指定するだけでOKです。
icacls \\server\test /t
\\server\test HOGEDOMAIN\alluser:(RX)
HOGEDOMAIN\administrator:(I)(OI)(CI)(F)
\\server\test1 HOGEDOMAIN\user01:(OI)(CI)(M)
HOGEDOMAIN\administrator:(OI)(CI)(F)
HOGEDOMAIN\devlop:(OI)(CI)(F)
\\server\test2 HOGEDOMAIN\administrator:(I)(OI)(CI)(F)
HOGEDOMAIN\devlop:(I)(OI)(CI)(F)
/t オプションを指定すると、サブフォルダ,ファイルも再帰的に表示してくれます。
/save オプションをつけると、ファイルに保存ができます。(ただ保存されたファイルは、SDDL形式で保存されるため編集には不向きかもしれません)
/saveで保存したACLは /restore オプションで復元ができます。
icacls \\server\test /restore e:\acl.txt
ACLのバックアップ、復元ができるのは非常に運用面から言うとありがたいですね。
参考:
ICACLSを使ってアクセス権限をコマンドラインで変更する方法 - http://pnpk.net