icaclsコマンドで削除できないファイルを作る


概要

ファイルの削除失敗時の処理を実装する場合など、動作の検証用として削除できないファイルを作りたいことがあると思います。
Windowsのファイルのプロパティのアクセス許可からGUIの操作で削除を禁止することもできますが、本記事ではicaclsコマンドを使用した方法を紹介します。

icaclsコマンドとは

Integrity Control Access Control Listの頭文字を取ったWindowsのネイティブコマンドです。
ファイルやフォルダーのセキュリティ記述子の表示や変更を行うことができます。
このコマンドはWindows Server 2003以降であれば使用できます。

ファイルの削除を禁止するための手順

1. ファイルの所有者を確認する

PowerShellのGet-Aclコマンドが便利ですので、このコマンドを使用して削除を禁止したいファイルの所有者を確認します。
コマンドプロンプトから以下のコマンドを実行します。

PowerShell Get-Acl (削除を禁止したいファイルのフルパス)

コマンドを実行すると以下のような内容が表示されます。

C:\>PowerShell Get-Acl C:\test\can_not_delete.txt


    ディレクトリ: C:\test


Path               Owner          Access
----               -----          ------
can_not_delete.txt test           BUILTIN\Administrators Allow  FullControl...

Ownerの列を確認することでファイルの所有者が分かります。
この例ではtestユーザーがファイルの所有者となっています。

2. icaclsコマンドで削除のアクセス許可を拒否する

ファイルの所有者が確認できたらicaclsコマンドを使用して削除のアクセス許可を拒否します。
コマンドプロンプトから以下のコマンドを実行します。

icacls (削除を禁止したいファイルのフルパス) /deny (ファイルの所有者):D /T /C /L /Q

コマンドを実行すると以下のような内容が表示されます。

icacls C:\test\can_not_delete.txt /deny test:D /T /C /L /Q
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

コマンドが正常に処理されると削除のアクセス許可が拒否となり、ファイルの削除が行えなくなります。
試しにエクスプローラーからファイルの削除を行うと、アクセスの拒否が発生することが確認できます。
ファイルの削除を行うためには管理者の権限が必要となり、現在のログインユーザーではファイルの削除が行えません。

PowerShellのGet-Aclコマンドからも削除が禁止されていることが確認できます。

C:\>PowerShell Get-Acl C:\test\can_not_delete.txt


    ディレクトリ: C:\test


Path               Owner          Access
----               -----          ------
can_not_delete.txt test           test Deny  Delete, Synchronize...

3. 削除のアクセス許可を元に戻す

削除の禁止を解除する場合は以下のコマンドを実行します。
/remove:dオプションによってアクセスの拒否が設定された権限がすべて解除されます。

icacls (削除を禁止を解除したいファイルのフルパス) /remove:d (ファイルの所有者) /T /C /L /Q

コマンドを実行すると以下のような内容が表示されます。

icacls C:\test\can_not_delete.txt /remove:d test /T /C /L /Q
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

ファイルのアクセス許可がフルコントロールに戻りました。

C:\>PowerShell Get-Acl C:\test\can_not_delete.txt


    ディレクトリ: C:\test


Path               Owner          Access
----               -----          ------
can_not_delete.txt test           BUILTIN\Administrators Allow  FullControl...

オプションリファレンス

アクセス許可

オプション 説明
/grant:r アクセス許可を新しいアクセス許可に置き換えます
/grant 既存のアクセス許可に許可を追加します
/deny 既存のアクセス許可に拒否を追加します
/remove:g アクセス許可のうち許可された権限をすべて削除します
/remove:d アクセス許可のうち拒否された権限をすべて削除します

権限の種類

単純な権限

オプション 説明
N アクセス権なし
F フルアクセス権
M 変更アクセス権
RX 読み取りと実行のアクセス権
R 読み取り専用アクセス権
W 書き込み専用アクセス権
D 削除アクセス権

特定の権限

オプション 説明
DE 削除
RC 読み取り制御
WDAC DAC の書き込み
WO 所有者の書き込み
S 同期
AS システムセキュリティへのアクセス
MA 無制限
GR 一般的な読み取り
GW 一般的な書き込み
GE 一般的な実行
GA 一般的なすべての操作
RD データの読み取り/ディレクトリの一覧表示
WD データの書き込み/ファイルの追加
AD データの追加/サブディレクトリの追加
REA 拡張属性の読み取り
WEA 拡張属性の書き込み
X 実行/スキャン
DC 子の削除
RA 属性の読み取り
WA 属性の書き込み

特定の権限を使用する場合は括弧内にカンマ区切りで指定します。

その他

オプション 説明
/T 指定されたディレクトリ以下のすべての一致するファイルとディレクトリに対してアクセス許可を設定します
/C エラー発生時はエラーメッセージを表示して処理を継続します
/L シンボリックリンクに対して処理を行います
/Q 処理が成功した際にメッセージを抑制します