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

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

xcacls.vbsを使って詳細なACL(NTFSアクセス権)を変更する

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

上記記事の cacls.exe だと細かい詳細なアクセス権の設定ができません。

詳細なアクセス権を設定したいときはMSが提供している xcacls.vbs というスクリプトを使うことができるようです。

これは別途ダウンロードが必要となります。

ダウンロードと使い方はMSサポート:Xcacls.vbs を使用して NTFS アクセス許可を変更する方法から可能です。

この Xcacls.vbs スクリプトは Cscript で最適に動作するらしいので、使うときは下記のように使います。

cscript.exe xcacls.vbs 引数

基本的な書式や使い方は calcs と同じですが、より細かくできるになっています。(ユーザーの既存のアクセス許可にアクセス権を追加する /G や、指定されたユーザーのアクセス許可を置き換える /P などはそのまま使えます。)

例えば、特殊なアクセス権の設定やどのファイルフォルダオブジェクトに適用するかなどが指定できます。

上記のMSのページに使い方を載っていますが、一部載ってない情報もあるので、下記コマンドでヘルプを表示してから使うといいかもしれません。(ただヘルプは英語ですが..)

cscript.exe xcacls.vbs /?

下記のようにすると、対象フォルダ・ファイルの現在のアクセス権が表示できます。

>cscript Xcacls.vbs d:\test2

Microsoft (R) Windows Script Host Version 5.7

Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

Starting XCACLS.VBS (Version: 5.2) Script at 2010/06/15 14:05:04

Arguments Used:

Filename = "d:\test2"

**************************************************************************

Directory: D:\test2

Permissions:

Type Username Permissions Inheritance

Allowed BUILTIN\Administrators Full Control This Folder, Subfolde

Allowed \CREATOR OWNER Full Control Subfolders and Files

Allowed domain\hoge Full Control This Folder Only

Allowed NT AUTHORITY\SYSTEM Full Control This Folder, Subfolde

Allowed BUILTIN\Users Read and Execute This Folder, Subfolde

Allowed BUILTIN\Users Special (E32) This Folder and Subfo

No Auditing set

Owner: domain\hoge

**************************************************************************

Operation Complete

Elapsed Time: 0.21875 seconds.

よく使うと思われるアクセス権の細かな設定は下記のような書式で可能です。

/G ユーザ名:Perm;Spec

(/P や /D も同じ書式になります。)

Perm:"ファイルのみ" に適用されるアクセス権を表すようです。

Spec:"フォルダとサブディレクトリのみ" に適用されるアクセス権を表すようです。

ただ、Perm,Specで適用先を決めるは微妙みたいですし、分かりずらいので、適用先は後述する /SPEC を使う方がいいです。

Perm,Specで使用できるアクセス権 は下記のように細かく設定可能です。(複数のアクセス権を適用するには加算します。)

D - 所有権の取得

C - アクセス許可の変更

B - アクセス許可の読み取り

A - 削除

9 - 属性の書き込み

8 - 属性の読み取り

7 - サブフォルダとファイルの削除

6 - フォルダのスキャンとファイルの実行

5 - 拡張属性の書き込み

4 - 拡張属性の読み取り

3 - フォルダの作成/データの追加

2 - ファイルの作成/データの書き込み

1 - フォルダの一覧/データの読み取り

また、「/SPEC 適用先 」と指定することで、適用先も下記のように指定できます。

A - このフォルダのみ

B - このフォルダ、サブフォルダおよびファイル (デフォルト)

C - このフォルダとサブフォルダ

D - このフォルダとファイル

E - サブフォルダとファイルのみ

F - サブフォルダのみ

G - ファイルのみ

いくつか例をあげてみます。

test フォルダのみユーザ hoge に対してフォルダの一覧/データの読み取り,フォルダのスキャンとファイルの実行 とするには下記のようにします。

cscript Xcacls.vbs d:\test2 /E /G domain\hoge:16 /SPEC A

test フォルダとサブフォルダのみユーザ hoge に対してフォルダの一覧/データの読み取り,フォルダのスキャンとファイルの実行,ファイルの作成/データの書き込み,フォルダの作成/データの追加 とするには下記のようにします。

cscript Xcacls.vbs d:\test2 /E /G domain\hoge:1236 /SPEC C

testフォルダ配下ファイル・フォルダについて、指定したユーザのアクセス権を無にするには下記のようにします。

cscript Xcacls.vbs d:\test2 /E /R domain\hoge /SPEC B

また /L オプションでログファイルを残すこともできます。同じファイルがある場合は追記になるようです。

cscript Xcacls.vbs d:\test2 /E /R domain\hoge /SPEC B /L log.txt

特にアクセス拒否については、cacls コマンドだと、/D オプションで指定したユーザの全てのアクセスを拒否することしかできませんでしたが、xcacls.vbs を使うと、下記のようにどのアクセス権に対して拒否をするかが設定できます。

下記は test フォルダ配下のフォルダ・ファイルに対してユーザ hoge は削除を拒否という指定になります。

cscript Xcacls.vbs d:\test /E /D domain\hoge:A /SPEC B

下記はフォルダの所有権を administrators グループに変更する指定になります。

cscript Xcacls.vbs d:\test2 /E /O "administrators"

Xcacls.vbs は成功すると、Completed successfully. と表示され、失敗すると Error:xxx となるのでこれで処理の成否が分かります。

ただ、/E を付け忘れると cacls コマンドと同じように一旦ACLが全てクリアされてから適用されちゃうので注意しましょう。

また、コマンドリファレンスにはファイル・フォルダパスの指定でワイルドカードが使えると有るのですが、なぜかワイルドカード指定できませんでした。

余談ですが、このような処理は大抵バッチファイルで行うことが多いと思います。

ということで、ユーザ名のフォルダを作成し、そのユーザのアクセス権を設定するということを実現するために下記のようなバッチとしてみました。

外部ファイル user.txt に設定すべきユーザ名が1行ずつ入っているとし、dドライブ直下に各ユーザ名のフォルダを作成することとします。

@echo off

rem user.txtにユーザ名が入ってる。

FOR /F "delims=" %%a IN (user.txt) DO (

rem %%a に読み込んだ一行のデータが入っている。

rem フォルダ作成

md "d:\%%a"

rem アクセス権設定

cscript Xcacls.vbs "d:\%%a" /E /G "hogedomain\%%a":F /SPEC B

@ECHO %%a

)

pause

user.txtの中身は下記のような感じ

user1

user2

user3

補足:

xcaclsでも、caclsと同じように共有フォルダ(UNCパス)のACLを設定できます。

caclsでは共有フォルダのトップはダメでしたが、xcaclsはOKでした。

こんな感じです。

cscript Xcacls.vbs \\filesv\share /E /D domain\hoge:A

ユーザ・グループの指定について、ローカルユーザやビルトイングループの場合は cacls と同じようです。

詳しくは、3流プログラマのメモ書き : cacls.exe を使ってACL(NTFSアクセス権)を設定するの補足を参照。

参考:

MSサポート:Xcacls.vbs を使用して NTFS アクセス許可を変更する方法

MSサポート:[HOWTO] Xcacls.exe を使用して NTFS アクセス許可を変更する方法

XCACLS.vbs:ある nakagami の日記

開発メモ: Windows バッチファイルでファイルの内容を読み込みたいバッチファイルを読み込み一行ずつ処理する方法が参考になります。