「icacls」「subinacl」コマンドでアクセス制御リスト(ACL)からメンバーを削除する【Windows OS】Tech TIPS

ファイルやフォルダ、レジストリなどのオブジェクトに対するアクセス権は、アクセス制御リストACLで管理されている。特定のアカウントに対するACLのエントリを削除するには、icaclsやsubinaclコマンドを利用する。削除済みのアカウントに対するエントリを削除するには、SID形式で指定する。

» 2010年08月13日 05時00分 公開
[打越浩幸デジタルアドバンテージ]
「Tech TIPS」のインデックス

連載目次

「icacls」「subinacl」コマンドでアクセス制御リスト(ACL)からメンバーを削除する【Windows OS】

対象:Windows 2000/Windows XP/Windows Vista/Windows 7、Windows Server 2003/Windows Server 2008/Windows Server 2008 R2


アクセス制御リスト(ACL)から特定のユーザー/グループを削除したい!

 Tech TIPS「icaclsコマンドでアクセス制御リスト中のメンバーを検索する」や「subinaclコマンドでアクセス制御リスト中のメンバーを検索する」では、「icacls」「subinacl」コマンドを使ってアクセス制御リスト(以下ACL)中に含まれる、特定のメンバー名(が含まれるエントリ)を検索する方法を紹介した。

 本Tech TIPSではこの応用として、同じicacls/subinaclコマンドを使って、特定のメンバーが含まれるエントリを削除する方法を紹介する。人事異動などでセキュリティ設定を変更する場合や、すでに削除してしまったユーザーやグループアカウントが含まれるエントリを削除したいといった場合に利用できる。

 Windows Server 2003向けのicaclsコマンドの入手方法については、Tech TIPS「icaclsコマンドでファイルの所有者を変更する」を参照していただきたい。またsubinaclコマンドの入手は、Tech TIPS「subinaclコマンドでオブジェクトのセキュリティ情報を表示させる(subinaclの基本)」を参照するか、以下のリンク先からダウンロードしていただきたい。

 icaclsではなく「cacls」コマンドを利用する場合は、Tech TIPS「caclsコマンドでACLを編集する」を参照していただきたい。

icaclsコマンドで特定のアカウントのACLエントリを削除する

 icaclsコマンドで特定のユーザー/グループアカウントが含まれるエントリを削除するには、「/remove」オプションを利用する。

C:\>icacls /? ……ヘルプの表示
……(中略)……
ICACLS <名前> [/grant[:r] <SID>:perm[...]]
       [/deny <SID>:perm [...]]
       [/remove[:g|:d]] <SID>[...]] [/T] [/C] ……これを利用する

    /grant[:r] <SID>:perm は、指定されたユーザー アクセス権を付与します。
        :r を指定すると、以前に付与されたすべての明示的なアクセス許可は新しい
        アクセス許可に置き換えられます。
        :r を指定しない場合、新しいアクセス許可は以前に付与された明示的な
        アクセス許可に追加されます。

    /deny <SID>:perm は、指定されたユーザー アクセス権を明示的に否定します。
        指定されたアクセス許可の明示的な否定 ACE が追加され、明示的な許可内容
        に含まれた同じアクセス許可は削除されます。

    /remove[:[g|d]] <SID> は、ACL 内にあるすべての <SID> を削除します。
        :g を指定すると、その SID に対して許可されたすべての権限を ACL から
        削除します。
        :d を指定すると、その SID に対して否定されたすべての権限を ACL から
        削除します。
……(以下省略)……

icaclsコマンドのヘルプを表示させる

 今、次のようなアクセス権が設定されたファイルがあるとする。

C:\>icacls x.txt ……icaclsコマンドによる確認。以下の6つのエントリがある
x.txt MYPC12\user01:(W) ……これを削除してみる
      MYPC12\user02:(W)
      BUILTIN\Administrators:(F)
      EXAMPLEDOM\uchikoshi:(F)
      NT AUTHORITY\SYSTEM:(F)
      BUILTIN\Users:(RX)

1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

icaclsコマンドでACLを確認する

 このACLから、例えば先頭の「user01」アカウント(これはローカルPCのアカウント)に対する許可エントリを削除するには、次のように/removeオプションを指定する。

C:\>icacls x.txt /remove user01 ……user01のエントリを削除する
処理ファイル: x.txt
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\>icacls x.txt ……結果の確認
x.txt MYPC12\user02:(W) ……この直前のエントリが削除されている
      BUILTIN\Administrators:(F)
      EXAMPLEDOM\uchikoshi:(F)
      NT AUTHORITY\SYSTEM:(F)
      BUILTIN\Users:(RX)

1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

icaclsコマンドでACLから「user01」アカウントのエントリを削除する

 サブフォルダ全体を処理する場合は、「/t」オプションを追加する。

subinaclコマンドで特定のアカウントのACLエントリを削除する

 subinaclコマンドで特定のユーザー/グループアカウントが含まれるエントリを削除するには、「/revoke」オプションを利用する。

C:\>subinacl /help /revoke ……ヘルプの表示
SubInAcl version 5.2.3790.1180

/REVOKE
-------

/revoke=[DomainName\]User ……削除コマンド

     suppress all Permission Ace(s) for the specified User (or group)

subinaclコマンドのヘルプを表示させる

 先ほどと同じファイル(x.txt)がある場合に、user01アカウントに対するエントリを削除するには次のようにする。

C:\>icacls x.txt ……icaclsコマンドによる確認
x.txt MYPC12\user01:(W) ……以下の6つのエントリがある
      MYPC12\user02:(W)
      BUILTIN\Administrators:(F)
      EXAMPLEDOM\uchikoshi:(F)
      NT AUTHORITY\SYSTEM:(F)
      BUILTIN\Users:(RX)

1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\>subinacl /file x.txt /revoke=user01 ……user01に対するエントリの削除
C:\x.txt : delete Perm. ACE 0 MYPC12\user01 ……処理中
C:\x.txt : 1 change(s) ……結果

Elapsed Time: 00 00:00:00
Done:        1, Modified        1, Failed        0, Syntax errors        0
Last Done  : C:\x.txt

C:\>icacls x.txt ……結果の確認
x.txt MYPC12\user02:(W) ……1つ削除されている
      BUILTIN\Administrators:(F)
      EXAMPLEDOM\uchikoshi:(F)
      NT AUTHORITY\SYSTEM:(F)
      BUILTIN\Users:(RX)

1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\>

subinaclコマンドでACLからuser01アカウントに対するエントリを削除する

 「/file <名前>」は、ファイルを処理する場合の指定である。サブフォルダ全体を指定する場合は「/subdirectories <名前>」のように指定する。レジストリや共有などのオブジェクトを指定する方法については、Tech TIPS「subinaclコマンドでオブジェクトのセキュリティ情報を表示させる(subinaclの基本)」を参照していただきたい。

不明アカウントに対するエントリの削除

 ローカルPCやドメインからユーザーやグループを削除しても、ファイルやフォルダなどのオブジェクトに付けられたACL中のエントリはそのままである。そのようなケースでACLの内容を表示させると、アカウントの代わりに、「<アカウント ドメインが見つかりません>」や「アカウント名とセキュリティ ID の間のマッピングは実行されませんでした。」といったメッセージが表示される。例えば、「user02」アカウントを削除すると次のようになる。

C:\>cacls x.txt ……caclsコマンドによる確認
C:\x.txt MYPC12\user01:(特殊なアクセス:)
                       SYNCHRONIZE
……(中略)……
         <アカウント ドメインが見つかりません>(特殊なアクセス:) ……不明アカウントに対するエントリ
                             SYNCHRONIZE
……(中略)……
         BUILTIN\Administrators:F
         EXAMPLEDOM\uchikoshi:F
         NT AUTHORITY\SYSTEM:F
         BUILTIN\Users:R

前出の例で、「user02」アカウントが削除された場合のcaclsコマンドの表示例

C:\>icacls x.txt ……icaclsコマンドによる確認
x.txt MYPC12\user01:(W)
      アカウント名とセキュリティ ID の間のマッピングは実行されませんでした。
(W) ……不明アカウントに対するエントリ
      BUILTIN\Administrators:(F)
      EXAMPLEDOM\uchikoshi:(F)
      NT AUTHORITY\SYSTEM:(F)
      BUILTIN\Users:(RX)

1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

前出の例で、「user02」アカウントが削除された場合のicaclsコマンドの表示例

 このような場合は、削除されたアカウントをSID文字列形式で指定すればよい。SID文字列とは、オブジェクトの内部名であり、例えば「S-1-1-0」といった形式となっている。詳細はTech TIPS「オブジェクトを識別するSIDとは?」「whoamiコマンドでユーザーのSIDや権利を調査する」を参照していただきたい。subinaclコマンドでは、アカウントが不明な場合はSID形式で表示されるので、これで確認する。

C:\>subinacl /file x.txt ……subinaclによる確認

===============
+File C:\x.txt
===============
……(中略)……
/pace =S-1-5-21-515967499-1637732038-1606110848-1031    ACCESS_ALLOWED_ACE_TYPE-0x0  ……これが削除されたアカウントに対するエントリ
    Type of access:
        Special acccess :
    Detailed Access Flags :
        FILE_WRITE_DATA-0x2         FILE_APPEND_DATA-0x4        FILE_WRITE_EA-0x10
        FILE_WRITE_ATTRIBUTES-0x100 SYNCHRONIZE-0x100000
……(以下省略)……

subinaclコマンドで不明なアカウントのSIDを表示させる

 このリストの中にある、「S-1-5-21-(以下略)」というのが削除されたエントリに対するSID文字列である。これを指定して、エントリを削除すればよい。

 subinaclなら、アカウント名の代わりにSID文字列を直接そのまま記述すればよい。

C:\>subinacl /file x.txt /revoke=S-1-5-21-515967499-1637732038-1606110848-1031 ……削除
C:\x.txt : delete Perm. ACE 1 S-1-5-21-515967499-1637732038-1606110848-1031
C:\x.txt : 1 change(s)

Elapsed Time: 00 00:00:00
Done:        1, Modified        1, Failed        0, Syntax errors        0
Last Done  : C:\x.txt

subinaclコマンドでSIDを指定してエントリを削除する

 なおicaclsコマンドでは、SID文字列の前に「*」を付ければSID形式でアカウントを指定できることになっている。しかし、削除済みアカウント(や存在しないアカウントなど)の場合は利用できないようである(SIDとして正しいかどうか検証できないのでエラーとしているようだ)。icaclsではこの表記方法は、有効なアカウントを使ってACLを編集したり、削除する場合にのみ利用できる。

C:\>icacls x.txt /remove *S-1-5-21-515967499-1637732038-1606110848-1031 ……SID形式で指定してみる
0 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした ……エラー
C:\>icacls x.txt /grant *S-1-1-0:F ……Everyone:Fを追加してみる
処理ファイル: x.txt
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

icaclsコマンドでも有効なアカウントならSID形式で指定できる

「Tech TIPS」のインデックス

Tech TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。