Icaclsは、IT管理者がファイルやフォルダのアクセス制御リストを変更するために使用できるWindowsのコマンドラインユーティリティです。ITプロやシステム管理者が行う最も一般的なタスクの1つは、ファイルサーバー上でアクセス許可を変更することです。icaclsコマンドを使用すると、それを行う非常に効率的な方法があります。このガイドでは、このコマンドの使用方法について説明します。
icaclsコマンドの使用方法
私自身の経験に基づいて、Windowsでファイルのアクセス許可を変更することは通常、ファイルエクスプローラーを使用して行われます。多くのIT関係者にとって、ファイルエクスプローラーを開き、いくつかのユーザーのアクセスに問題を引き起こしているネットワークの場所に移動し、そのアクセス許可を「読み取り」から「読み取り/変更」などに変更することは非常に直感的です。簡単で迅速に使用できます。
ただし、GUIだけでは望むほど堅牢ではないさまざまな範囲のシナリオが数多く存在します。2200万のファイルとフォルダのアクセス許可を変更する場合、それを正しく行いたいです!
アクセス制御リスト(ACL)とは何ですか?
WindowsおよびNTFSファイルシステムでは、各ファイルオブジェクト(ファイル、フォルダ)にはアクセス制御リストがあります。このリストはアクセス制御エントリ(ACE)で構成されています。リストにはファイルオブジェクトに対してあるレベルの許可を持つすべてのユーザーおよび/またはその他のセキュリティコンテナオブジェクト(グループなど)が含まれています。
アクセス制御エントリとは何ですか?ちょっと待ってください…
アクセス制御エントリ(ACE)とは何ですか?
アクセス制御エントリ(ACE)とは、ユーザー/グループがファイルオブジェクトに対する個々の権限レベルを制御する個々のレコードまたは許可ルールです。ACLで利用可能な高レベルの基本権限を列挙します:
- 完全アクセス(F)
- 変更アクセス(M)(’削除’を含む)
- 読み取りおよび実行アクセス(RX)
- 読み取り専用アクセス(R)
- 書き込み専用アクセス(W)
他にも約12以上の「高度な」権限がありますが、それらはこの記事の範囲外です。
ファイルエクスプローラの制限事項
現在、もし私がマイクロソフトのファイルエクスプローラのプログラムマネージャーだったとします(特にそうすることが楽しいとは思いません)、これらが私が加えたい機能です。信じてください、これらを加えることが数十年にもわたって望んでいました!
例えば、ファイルサーバーの移行を行うとします。元のサーバー(サーバーA)からデスティンーション(サーバーB)にデータをコピーすることはできました。しかし、すべてのPermissionが再帰的に正しくありません。
したがって、あなたは树の根に移動し、セキュリティタブに入り、アクセスコントロールリストにいくつかの変更を加えます。根に下のすべての2200万のファイルとフォルダーに再帰的に変更を行うチェックボックスをオンにします。これらの変更を始めると、システムファイル、只读ファイルなどに変更を行うための確認のポップアップをいくつか表示します。
ここに私のリクエストがあります。彼らが作成できる小さな「ウィザード」で、確認のためのすべてのリクエストを単に前提して「はい」をクリックしてください。そうすると、プロセスはエラーによって中断され、終了時に概要を提供し、そのファイルの原始出力をダウンロードするリンクを提供します。そうすることで、エラーや警告が表示された場合に追溯的に確認できます。
しかし、マイクロソフトがこのような素晴らしい、強力な、設定後は忘れる機能セットを提供するかどうか分かりません。しかしながら、この間、私たちはコマンドラインとスクリプティングの力を利用します。そこで、組み込みのicaclsコマンドが役立ちます。
icaclsの構文理解
icaclsの構文は実際には非常にわかりやすく、比較的簡単に学ぶことができます。基本的には、コマンドを使用してからチェックまたは操作したいファイルまたはフォルダーを追加し、次に追加/変更/削除するアクセス許可を指定します。
もちろん、コマンドラインスイッチもあります。すぐにこれについて説明します。以下は、単に次のコマンドを実行しファイル名を入力した場合の例です。
icacls Excellent.txt

1行ごとに1つのACEが出力されますので、上記の例を使用すると、
- 組み込みの ‘SYSTEM’ アカウントにはInherited (I)とFull (F)のアクセス許可があります。
- 組み込みのAdministratorsグループも同じアクセス権を持っています。
- 組み込みのUsersグループはInherited (I)、Read (R)、およびExecute (X)のアクセス許可があります。
Powershellでicaclsを使用できますか?
上記の例とスクリーンショットからわかるように、確かにPowershellを使用してicaclsコマンドを使用することができます。わずかに異なる方法で参照する必要があるいくつかの環境変数に注意する必要があります。
ファイルオブジェクトのACLを表示および管理するための同等のPowershellコマンドレットは、Get-AclおよびSet-Aclです。これは将来の投稿アイデアのようですね!?
ファイルまたはフォルダーのアクセス許可を設定するためにicaclsを使用する
icaclsコマンドはWindowsに組み込まれているため、基本を理解したらすぐにコマンドを使用できます。コマンドラインで単に「icacls」と入力すると、利用可能なヘルプ情報が表示されます。icaclsコマンドについての類似するMicrosoftドキュメントもこのページで参照できます。
オブジェクトの現在のACLを表示する方法
さて、ここまでの説明で十分です…では、コマンドの使用を開始しましょう。ファイルやディレクトリの現在のACLを表示するには、次のコマンドを使用します:
icacls file or directory
icacls Download

ここでは、「Download」はファイルとサブフォルダを含むフォルダです。ディレクトリオブジェクトに対して、出力が少し異なることに注意してください。ディレクトリにのみ適用される特別なコンテナ継承レベルの権限である(OI)と(CI)が表示されます。
組み込みの管理者グループに対しては、完全な権限と継承された権限があることが分かります。「(OI)」は、このディレクトリ内の他のオブジェクトがこのACEを継承することを示します。「(CI)」は、このディレクトリ内の他のフォルダが再びこのACEを継承することを示します。(このディレクトリには該当しませんが、ある場合は自動的に同じACEが継承されます)。
ファイルやフォルダに権限を付与する
さて、状況が熱くなってきました。/grantスイッチを使用して、Active Directoryドメインの他のユーザーにアクセス許可を設定しましょう。次のコマンドを使用して、Billy Reinders(breinders)にExcellent.txtファイルへの読み取り専用(R)アクセス許可を与えます。
icacls Excellent.txt /grant reinders\breinders:R /t /c

前のコマンドは正常に完了しました。私は許可を確認することで変更を検証しました。今、’REINDERS\breinders’が読み取り専用(R)アクセス許可を持っていることがわかります。そして、’I’がリストされていないため、継承されておらず、明示的であることがわかります。
念のためお知らせしますが、’/t’スイッチはフォルダツリー全体に再帰的にアクセス許可を設定するために使用されます。’/c’スイッチは、エラーが発生した場合もコマンドが続行するように指示します。
ファイルまたはフォルダのアクセス許可の削除
アクセス許可を与える/追加するのに/grantスイッチを使用する代わりに、/removeスイッチを使用してACEからアクセス許可を削除します。さあ、Billyが短命のExcellent.txtファイルへのアクセス権限を削除しましょう。
icacls Excellent.txt /remove:g reinders\breinders /t /c

ここでは、以前にBilly Reindersに付与された許可を削除するために ‘/remove:g’スイッチを使用しています。コマンドを再実行して確認したところ、BillyのACLが消えていることがわかります。素晴らしいですね!?
ファイルまたはフォルダへのアクセス権拒否
一般的には、全体のパーミッションインフラストラクチャに浸透する複雑さのため、明示的な「拒否」権限の使用を避けることが望ましいです。ほとんどの状況では、これらの状況を処理するためにデフォルトである暗黙の拒否に頼ることができます。
ACLにユーザーがリストされておらず、かつACLにリストされている任意のグループのメンバーではない場合、そのユーザーはそのオブジェクトに対して権限を持たないものとしてWindowsによって正しく仮定されます。ただし、次の例は、コントロールが失われる可能性がある方法を示しています。- ユーザーが2つのグループのメンバーであり、1つのグループがアクセス権限を付与され、他のグループが拒否された場合、そのユーザーは拒否されます。これ自体は理にかなっているが、このような状況をトラブルシューティングしようとすると非常に複雑になる可能性があります。
ただし、明示的に拒否権限を追加したい場合は、一般的な「/deny」スイッチを使用してこれを達成できます。
icacls Download /deny reinders\breinders:(OI)(CI)F /t /c

そこに実行したコマンドが表示されます。これは正常に完了しました。次に、ダウンロードフォルダのセキュリティタブを確認しました – このオブジェクトとその内容にBillyが拒否権限を持っていることがわかります。
オブジェクトのACLをリセットする方法
I can’t tell you how many file server migrations or movements of large amounts of file projects I’ve been involved in where I just needed to start from scratch. This invaluable step includes resetting the ACLs on an object in case things get too far gone, or you succumb to a bad idea after being up all night. Maybe a malware attack crippled an entire HR directory that NEEDS to get resolved ASAP. Thankfully, you can use the ‘/reset’ flag to reset the permissions to the default.
icacls Download /reset /t /c
[画像]
ダウンロードフォルダとその内容にBillyに再び「RW」権限を許可した直後に、リセットコマンドを実行しました。その結果、セキュリティタブのACLから名前が再び見当たらないことがわかります。簡単でわかりやすいです。
ACLの保存と復元方法
A wonderfully powerful feature included with icacls is the ability to backup and restore the ACL of an object to a file for safekeeping. Before you start a large script that changes or resets permissions on millions of files, you can first save the current state of those millions of files’ ACLs to a single file.
スクリプトの途中で構文エラーを発見した場合、それを中止し、`/restore` パラメータを使用して一つのコマンドの実行で ACL の全体の状態を復元できます。試してみよう!
icacls Download /save Download_ACL_Backup /t

これは、「Download_ACL_Backup」という名前の单一のファイルに、ダウンロードフォルダの ACL の全体を保存します。今、おそらくそのテキストファイルには触れないでください。はい、それは Linux のようなおかしいもののようですね。冗談ですよ。
これは、現在のダウンロードフォルダの状態です。

今、若い管理者が Billy Reinders にこの場所に完全なアクセスを与えたとします。また、これには Billy にはないべき HR データが含まれているとします。
icacls Download /grant reinders\breinders:F /t /c

コマンドの後で、Billy がこのフォルダに完全な、明示的な控制を持っていることを再次確認しました。このコマンドを一度実行するだけで、 permissions がデフォルトにリセットされることを想定します。
icacls Download /reset /t /c

リセットコマンドを実行した後、Billy の名前が ACL から削除され、彼はこのフォルダにはもはや完全なアクセスを持たないことがわかります。念頭に置いてくださいが、これは全てのフォルダ階層をスキャンします。
ヒント: このシーンで、Billy は只读アクセスを持っていることに気づかれるかもしれません。なぜなら、Billy がメンバーである内置の Users グループにはデフォルトの読み取りと実行 Permissions があるからです。ただの補足です。
icacls を使用して Windows の整性问题を管理する方法
Windowsにはあまり知られていない機能があります。それは強制アクセス制御(MAC)と呼ばれます。かなり前から存在していますが、MicrosoftはWindows Vista/Windows Server 2008で強制整合性制御(MIC)を導入しました。
アクセス許可はポリシーに基づく固定ルールで定義され、一般的にユーザーによって上書きすることはできません。これは一般的にWindows整合性制御(WIC)と呼ばれています。整合性レベルは、Windowsのオブジェクトの保護レベルを決定するために使用されます。基本的に、ユーザーに適切なアクセス許可があることを常に確認したいと思います。
I won’t go into great detail here, but I can show you a few examples of how to use the icacls command with it. If we create a new folder, Test, in the Download directory, we can adjust its integrity level to ‘h’igh.
icacls Test /setintegritylevel h
要するに、高いレベルはタスクやプロセスを管理者として実行するために必要なアクセス許可と同義です。したがって、たとえBilly Reindersがこのフォルダに完全な制御権限を持っていたとしても、何らかの魔法の管理者権限が付与された場合であり、かつファイルエクスプローラーを管理者として実行できた場合にのみ(できませんが…)、このフォルダとその内容にアクセスできないでしょう。
要するに、これは非常に機密性の高いデータを保護するために使用できるセキュリティおよび保護の追加レイヤーです。
icaclsを使用したアクセス許可の継承の管理方法
icaclsコマンドを使用して、ファイルやフォルダの継承権限を表示および変更することもできます。これにより、1つのフォルダに明示的な権限を設定したまま、残りのフォルダを親コンテナのACLを自動的に受け入れるように設定できます。
ファイルとフォルダの継承を無効にする
ファイルまたはフォルダの継承を無効にするには、「/inheritance:d」パラメータを使用します。例として、DownloadフォルダにInstallフォルダがあるとします。ここで、フォルダは上位からすべての権限を継承するように設定されていることがわかります。
icacls Download

Installフォルダから継承を削除しましょう。
icacls Install /inheritance:d /t /c

これで完了です。すべての「(I)」エントリがなくなったことに気付くでしょう。これらはすべて明示的な権限になっています。また、継承を無効にしたため、「継承を有効にする」ボタンが利用可能であることがGUIから確認できます。
結論
icaclsの最も興味深い側面は、このコマンドで複雑なプロジェクトをスクリプト化できる堅実さです。そして、ファイルエクスプローラーの信頼性について心配する必要がないことです。エラーが発生した場合やクラッシュした場合などにも対応できます。
I hope you learned more about using the command line to modify permissions. Please leave a comment or question below. Thank you!
関連記事: