3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援→開発戻り浦島太郎状態の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。

cacls.exe を使ってACL(NTFSアクセス権)を設定する

NTFSアクセス権(ACL)を一括で大量のフォルダに設定したいときはGUIで行うのはかなり手間です。

で、cacls.exeを使えばCUIで使えるため、バッチファイル等にしておけばかなり簡単にACLが設定できます。

簡単に cacls.exe の使い方をメモリます。

ACLの表示

cacls ファイルorフォルダパス

例:

>cacls d:\test2

d:\test2 BUILTIN\Administrators:(OI)(CI)F

CREATOR OWNER:(OI)(CI)(IO)F

domain\hoge:F

NT AUTHORITY\SYSTEM:(OI)(CI)F

BUILTIN\Users:(OI)(CI)R

BUILTIN\Users:(CI)(特殊なアクセス:)

SYNCHRONIZE

FILE_WRITE_DATA

FILE_APPEND_DATA

このアクセス権の表示ですが、ちょっと分かりずらいです。

(OI)とか(CI)とかはACEの適用先を表すようですね。下記のような意味になるようです。

(OI):このフォルダとファイル

(CI):サブフォルダにのみ適用

(IO):ファイルとフォルダにのみ適用する

(IO)(CI):このフォルダにのみ適用する

(OI)(CI)(IO):このフォルダ、サブフォルダ、およびファイルに適用

(CI)(IO):サブフォルダにのみ適用

(OI)(IO):ファイルにのみ適用

アクセス権については代表的なものは下記のように省略表記となるようです。

F:フルコントロール

W:書き込み可能

R:読み出しのみ可能

C:変更(書き込み)可能

N:アクセス権なし(拒否)

使い方の詳細は cacls と叩けば出てきます。

D:\>cacls

ファイルのアクセス制御リスト(ACL) を表示または変更します。

CACLS ファイル名 [/T] [/E] [/C] [/G ユーザー名:アクセス権]

[/R ユーザー名 [...]] [/P ユーザー名:アクセス権 [...]]

[/D ユーザー名 [...]]

ファイル名 ACL を表示します。

/T 現在のディレクトリとすべてのサブディレクトリにある

指定されたファイルの ACL を変更します。

/E ACL を置き換えずに、ACL を編集します。

/C アクセス拒否エラーを無視して、ACL の変更を続行します。

/G ユーザー名:アクセス権

指定されたユーザーにアクセス権を与えます。

アクセス権: R 読み取り

W 書き込み

C 変更 (書き込み)

F フル コントロール

/R ユーザー名 指定されたユーザーのアクセス権を失効させます。

(/E オプションと共に使用)。

/P ユーザー名:アクセス権

指定されたユーザーのアクセス権を置き換えます。

アクセス権: N なし

W 書き込み

R 読み取り

C 変更 (書き込み)

F フル コントロール

/D ユーザー名 指定されたユーザーのアクセスを拒否します。

複数のファイルを指定するには、ワイルドカードを使用できます。

複数のユーザーを指定できます。

省略形:

CI - コンテナ継承。

ACE はディレクトリに継承されます。

OI - オブジェクト継承。

ACE はファイルに継承されます。

IO - 継承のみ。

ACE は現在のファイル/ディレクトリに適用されません。

ACLの設定

cacls.exe ファイルorフォルダ名 /E /Gor/P ユーザ名:アクセス権

主なオプションは下記のようになります。

/G:指定したユーザの、既存のアクセス権に対してアクセス権を追加する。

/P:指定したユーザの、既存のアクセス権は削除してから新たにアクセス権を追加し直す(すべて置換する)。

/E:既存のACLの内容はそのままにして、新しくACLを追加したり、既存のACLを編集する。(これと指定しないと既存ACLは一旦クリアされ、指定したアクセス権のみ設定される)

/T:指定したフォルダ以下の全てのファイルフォルダに適用

D:\test2 に対して既存のACLに加え、hogeに対する読み取りと実行、フォルダの内容の一覧表示、読み取り権限を与える場合は下記のように指定すればいいようです。

>cacls d:\test2 /E /G domain\hoge:R

処理ディレクトリ: d:\test2

D:\test2配下のすべてのファイル・フォルダに対して既存のACLに加え、hogeに対する読み取りと実行、フォルダの内容の一覧表示、読み取り権限を与える場合は下記のように指定すればいいようです。

>cacls d:\test2 /E /T /G domain\hoge:R

D:\test2配下のすべてのファイル・フォルダに対して domain\hoge のアクセス権を削除(失効)するには下記のように /R オプションを使います。

cacls "d:\test2" /T /E /R "domain\hoge"

ファイル・フォルダ名のパスにワイルドカードが指定できるのも便利ですし、UNCパス(\\サーバ名)で共有フォルダのアクセス権も設定できます。

ただし、下記のように共有フォルダのルートを指定した時だけはなぜか「ネットワークパスが見つかりません。」というエラーになります。

cacls "\\filesv\share" /E /P "domain\hoge":W

ネットワーク パスが見つかりません。

共有フォルダルートのNTFSアクセス権を変えたいときは、CACLSの上位版、XCACLSを使えばできました。

XCACLSについては、3流プログラマのメモ書き : xcacls.vbsを使って詳細なACL(NTFSアクセス権)を変更するを参照。

また、ユーザ・グループ名の指定についてですが、上記本文ではドメインユーザ・ドメイングループを前提にしてますが、ローカルユーザやビルトイングループの場合下記のようになります。

ローカルユーザ: ユーザ名のみ

ローカルユーザ: グループ名のみ

ローカルビルトイングループ: BUILTIN\グループ名

↑UsersとかPower Usersなどのローカルにあらかじめ入ってるグループ名です。

ドメインユーザ・グループ: ドメイン名\ユーザorグループ名

↑ビルトインドメインローカルグループもこの指定でできます。(ドメインのAdministratorsとか、Domain Usersとか)

Everyoneだけは、Everyoneと指定すればいいようです。

ただ、cacls は細かいアクセス権が設定できません。

細かなアクセス権を設定するには、xcacls.vbs というものを使えばいいようです。

これについては、別記事で書きたいと思います。

(ちなみに、Windows Vista,Server 2008以上だと ICACLS というコマンドを使う方がいいみたいですね。)

参考:

caclsコマンドの出力の見方 - @IT

caclsコマンドでACLを編集する - @IT

Windows のグループとアクセス権について:ある nakagami の日記

Windows/ACL cacls - きよえりPukiWiki