2013年11月8日金曜日

Windows のオブジェクトのアクセス権を操作するコマンド subinacl が便利だった

Windows のファイル、レジストリ、SAMオブジェクト(ユーザー、グループ)等のアクセス権を操作する MS 製ツール "subinacl" が便利だったのでメモっておく。
当記事ではファイル/フォルダのアクセス権操作についてのみ言及する。
準備
SubInACL は Download SubInACL (SubInACL.exe) from Official Microsoft Download Center からダウンロードできる。
インストールしたら、 C:\Program Files (x86)\Windows Resource Kits\Tools\ にパスを通しておく。
(32bitOSの場合は C:\Program Files\Windows Resource Kits\Tools\)

以下、最近使ってみて便利だった用例を紹介する。
フォルダ/ファイルのACLを表示
こいつのすごいところは、権限の関係でエクスプローラからだとACLを確認できないような場合でも、ちゃんと権限を取得し表示してくれること(当然だけどコマンドプロンプトを管理者権限で立ちあげておく必要がある)。
Figure.1 subinacl は、こういう場合に重宝する
下記はカレントディレクトリ配下の全フォルダ/ファイルのACLを表示する例。
C:\>subinacl.exe /noverbose /subdirectories .\*

==========================================
+File X:\xxxxxxx\yyyyyyy\documents
==========================================
/control=0xc00
/owner             =domainname\ownername
/primary group     =domainname\domain users
/audit ace count   =0
/perm. ace count   =2
/pace =system  Type=0x0 Flags=0x13 AccessMask=0x1f01ff
/pace =domainname\username  Type=0x0 Flags=0x13 AccessMask=0x1f01ff

…(snip)
Elapsed Time: 00 00:00:00
Done:       10, Modified        0, Failed        0, Syntax errors        0
Last Done  : X:\xxxxxx\yyyyyyy\documents\desktop.ini
/pace の Typeはアクセス許可の種類であり、0x0が許可、0x1が拒否。
Flags は継承の設定値であり、各ビットの意味は下記の通り。
値(ビット) 定数名 意味
0x1 OBJECT_INHERIT_ACE (フォルダのみ)下にファイルを作ると、そいつは親(=自分)のアクセス許可を継承する
0x2 CONTAINER_INHERIT_ACE (フォルダのみ)下にサブフォルダを作ると、そいつは親(=自分)のアクセス許可を継承する
0x8 INHERIT_ONLY_ACE (フォルダのみ)自分はこのアクセス許可を使わないが、下に作ったファイルやサブフォルダには継承する
0x10 INHERITED_ACE (ファイル、フォルダとも)親のアクセス権を継承している

AccessMask はアクセス許可の値であり、各ビットの意味は下記の通り。
値(ビット) 定数名 意味
0x1 FILE_READ_DATA フォルダーの一覧/データの読み取り
0x2 FILE_WRITE_DATA ファイルの作成/データの書き込み
0x4 FILE_APPEND_DATA フォルダーの作成/データの追加
0x8 FILE_READ_EA 拡張属性の読み取り
0x10 FILE_WRITE_EA 拡張属性の書き込み
0x20 FILE_EXECUTE フォルダーのスキャン/ファイルの実行
0x40 FILE_DELETE_CHILD 削除
0x80 FILE_READ_ATTRIBUTES 属性の読み取り
0x100 FILE_WRITE_ATTRIBUTES 属性の書き込み
0x10000 DELETE 削除
0x20000 READ_CONTROL アクセス許可の読み取り
0x40000 WRITE_DAC アクセス許可の変更
0x80000 WRITE_OWNER 所有権の取得
0x100000 SYNCHRONIZE このフラグは必ず立っている?

フルコントロールだと 0x1f01ff、変更だと 0x1301bf、読み取りだと 0x1200a9 になると思う。
/noverbose オプションを外せば、"Type of access"という項目にアクセス許可の種類がわかりやすく表示される ("Full Control"とか表示される) けど、出力結果がものすごく長くなってしまう。どっちがいいのか悩みどころ。
アクセス許可の付与
ファイル X:\xxxxxxx\yyyyyyy\documents\file.txt に対して、ユーザー domainname\username にフルコントロールをつける例。
subinacl /file X:\xxxxxxx\yyyyyyy\documents\file.txt /grant=domainname\username=F
末尾のフラグの意味は、下記の通り。
フラグ 意味
F Full Control
C Change
R Read
P Change Permissions
O Take Ownership
X eXecute
E Read eXecute
W Write
D Delete

なお、ドメイン名やユーザー名(グループ名)にスペースが入っている場合は、以下の例のようにダブルクォーテーションで括れば良い。
subinacl /file X:\xxxxxxx\yyyyyyy\documents\file.txt /grant="domainname\Domain Users"=F
アクセス拒否を設定したい時は、/grant の代わりに /deny を使う。

/file の代わりに /subdirectories を使えば、特定のファイル/フォルダ以下の全ファイルにアクセス許可を付与できる(実行時には細心の注意を!)。例えば、カレントディレクトリ以下の全フォルダ・ファイルにアクセス許可を一気につけたい時は、下記のようにする。
subinacl /subdirectories .\* /grant=domainname\username=F
アクセス許可の削除
ファイル X:\xxxxxxx\yyyyyyy\documents\file.txt に付いているユーザー domainname\username のアクセス許可を削除する例。
subinacl /file X:\xxxxxxx\yyyyyyy\documents\file.txt /revoke=domainname\username
アクセス許可の付与と同じく、/subdirectories が使える。
アクセス許可のユーザーの置換
すごく便利なのがこれ。アクセス許可の付け替えがラクラク。
アカウント名やセキュリティグループ名に変更があった時に、既存の設定値そのままで新しいアカウントやセキュリティグループにアクセス権限設定を引き継げるので安全だと思う。
ファイル X:\xxxxxxx\yyyyyyy\documents\file.txt についている domainname1\username1 のアクセス許可設定を domainname2\username2 に付け替えるには、下記のようにする。
subinacl /file X:\xxxxxxx\yyyyyyy\documents\file.txt /replace=domainname1\username1=domainname2\username2
アクセス許可の付与と同じく、/subdirectories が使え(ry
所有者の変更
ファイル X:\xxxxxxx\yyyyyyy\documents\file.txt の所有者を domainname\username に変更する例。
subinacl /file X:\xxxxxxx\yyyyyyy\documents\file.txt /setowner=domainname\username
アクセス許可の付与と同じく、/subdirectories が(ry
Learn More
更に詳しく知りたい人には、subinacl コマンドのヘルプ が参考になると思う。

0 コメント:

コメントを投稿