NTFSのアクセス権を一括して設定する

対象プラットフォーム

質問

Windows NT の運用を行なっています。新しいサーバを立ちあげる度にフォルダのアクセス権を設定する必要があるのですが, GUI から行なうのは手間がかかる上に, 設定を間違えやすくので困っています。簡単に設定を行なう方法はないのでしょうか。

回答

あまり知られていないのですが。Windows NT には CACLS というコマンドがあります。 このコマンドを使うことで一括してアクセス権の変更を行なうことができ、定型的な設定のスクリプト化することができるようになります。 しかしこのコマンドはヘルプが不完全で不親切な上に、 GUI からの設定と完全に同一の設定を行なうことはできず、ちょっと敷居の高いコマンドであるように感じます。 それでも CACLS コマンドの使用を勧めるのは, Windows NT の GUI で提供されているアクセス権関連の機能があまりにも不十分だからに他なりません。 以下、まずは GUI で提供されている機能について見ていくことから始めましょう。

使い勝手の悪いエクスプローラからのアクセス権の設定

通常セキュリティ情報の参照や変更は、エクスプローラ上から対象のフォルダ (またはファイル) のプロパティを開き、そこから 図1のような画面を開いて行なっている方が多いと思います。


図1: アクセス権を設定する標準の画面

図1の画面が出てくるのにも結構時間がかかることもある上に、沢山あるフォルダの一つ一つについてこうした作業を行なうのは非常に苦痛です。 皆さんの中にも, アクセス権の設定でうんざりした経験をお持ちの方は多いのではないでしょうか。 更にエクスプローラからのアクセス権の設定は、アクセス権の追加や修正ができないという致命的な問題点があります。

例えば、図2のように、既に共有フォルダの下に幾つものフォルダが作成されており、それぞれについていろいろと独自のアクセス権の設定を行なった形で運用されている環境を考えてみましょう。 ここで新しく作成した「Lグループ管理者」グループに、「開発部」フォルダの下に作成されたすべてのファイルに対して「フルコントロール」のアクセス権限を与えるにはどのようにすればよいでしょうか。

D:\-+
    |
  開発部 - L社員: RX  
    |      ← Lグループ管理者: F の権限を追加するには?
    |
    +---プロジェクトA - LプロジェクトA社員: F
    |    |            - LプロジェクトA派遣: RWXD
    |    +------モジュール1 - 高橋: F
    |    |                  - LプロジェクトA社員: RX
    |    |                  - LプロジェクトA派遣: RX 
    |    +------モジュール2
    |    |
    |    +------モジュール3
    |
    |
    +---プロジェクトB 
    |
    +---プロジェクトC
    |

図2: アクセス権の適用例

単純に「開発部」フォルダのプロパティを開き、図3のように「サブディレクトリのアクセス権を置き換える」ボタンをチェックして、「Lグループ管理者」グループにアクセス権を付与すると、アクセス権の設定を行なったフォルダ以下のフォルダのアクセス権が、すべて図3の設定で置き換えられてしまい、「Lグループ管理者:F」と「L社員: RX」というアクセス権になってします。


図3: アクセス権を設定する

結果として、せっかく細かく設定したアクセス権は台無しになってしまい、派遣社員の人は、フォルダへのアクセス自体ができなくなってしまいます。 読者の中にも、不用意にアクセス権の上書きを行なってしまい、「しまった」と思った方もいらっしゃると思います。

エクスプローラからきちんと設定を行なうには、「サブディレクトリのアクセス権を置き換える」ボタンをチェックせずに、開発部フォルダの下にあるすべてのフォルダやファイルについて一つ一つ現在のアクセス権の設定をチェックしては、それに対して新規グループのアクセス権を追加していかないといけません。 これまたうんざりするような作業です。

新しいグループに対するアクセス権を追加するという単純な作業すら行なえないエクスプローラの GUI の設計にはあきれてしまいます。 NTFSで細かいアクセス権の設定ができるとはいっても、これでは実質細かい設定はするなといっているようなものでしょう。

CACLS コマンドを使ってみよう

ここで CACLS コマンドの登場です。 CACLS コマンドは /E オプションでアクセス権を置き換えずに追加する機能があります。 この機能を使えば上記のような設定も簡単です。 図4のように、「D:\開発部」にカレントディレクトリを変更して、 CACLS コマンドを実行してみて下さい。嘘のように簡単にアクセス権の追加が行なえます。

D:\開発部> CACLS * /T /E /G Lグループ管理者:F

図4: CACLS コマンドによるアクセス権の追加

また図5のように、ファイル名やフォルダ名を指定して CACLS コマンドを実行することで、ファイルのアクセス権を表示することも可能です。


図5: CACLS コマンドの実行例

ところで、表示した結果を見ていただければわかりますが、フォルダのアクセス権を見ると「(OI)(CI)(IO)」などの文字列が挿入されているのがわかると思います。 これらはそれぞれ「Object Inheritance」、「Container Inheritance」、「Inherit Only」の略語であり、もちろん各々意味を持っています。 本当はこれらについても解説したい所なのですが、説明をはじめると当初の質問から話が外れてしまいますし簡単に説明できるものでもありません。 また Windows NT SP3 までは、 上記の属性を扱う方法自体が提供されていないということもありますので、今回は説明を省略します。

CACLS の応用

もちろん CACLS が有効な場面はまだまだあります。 たとえば共有フォルダを管理している場合、フォルダに対するアクセス権の設定は、何らかのドキュメントを作成して管理していると思います。 でも CACLS を使って現在の共有フォルダのアクセス権を設定するバッチファイルを作れば、誤ってアクセス権の設定を変更してしまった際にすぐ復旧できますし、ドキュメントの代わりにもなります。 今回の質問も, CACLS でアクセス権を適切に設定するバッチファイルを作成した上で、新しくサーバを設定する度にそれを実行するようにすれば解決できます。 バッチファイル内で必要なフォルダなどもすべて作成するようにすれば、つまらないケアレスミスを防ぐとともに、 at コマンドなどを使った自動設定が可能になりますので、管理者がコンソールに張りつく必要がなくなります。

その他 at コマンドと組み合わせることでも面白い設定が可能になります。 例えば、特定のフォルダを誰でも書き込み可能にする代わりに、一定期間毎に at コマンドを用いて CACLS コマンドを実行して、フォルダ内のすべてのファイルを「読み取り」のみに設定するようにすれば、ファイル保管フォルダを簡単に実現できます。

この他にも CACLS コマンドを使った応用はいろいろ考えられると思います。 管理者の方は是非とも CACLS コマンドに精通して欲しいと思います。

このように便利な CACLS コマンドなのですが、設定できるアクセス権が読み取り、変更、フルコントロールという三種類に限られています。 通常の使用であればこれで十分だと思いますが、場合によっては特殊なアクセス権を設定したい場合もあると思います。 その場合はリソースキットについている XCACLS コマンドを使って下さい。 XCACLS コマンドでは図6のように、特殊なアクセス権を個々に設定することが可能になっています。
しかし XCACLS コマンドは英語版のユーティリティのため、日本語のファイル名やフォルダ名には対応しておりません。 使用する際には注意してください。


図6: XCACLS コマンド

注記・補足

  1. CACLS.EXE コマンドの出力の意味も併せて参照してください。
  2. 本文書は、日経 Windows NT 1999 年 7 月号の「トラブル解決 Q&A コーナー」に掲載された「NTFSのアクセス権を一括して設定する」の草稿を筆者の方で HTML 化して掲載しているものです。


Copyright (C) 1998-2009 TAKAHASHI, Motonobu
Last update: 2002-09-28 19:33:00 JST
webmaster@monyo.com