先におことわり
どこかに同じような記事が既にあるかもしれませんがご了承ください。
記事を探すよりも試すほうが早かったので。
先に結論
コマンドプロンプトから以下を叩きます。
takeown /F "N:\Target Folder" /R /D Y
icacls "N:\Target Folder" /l /t /grant:r Everyone:(OI)(CI)(F) /inheritance:e
これは N:\Target Folder
配下フォルダの全オブジェクトの所有権を取得し、 Everyone
へのフルコントロールを付与するとともに、継承を有効にします。
そのままコマンドラインから削除したいなら、以下でOK。
rd /s "N:\Target Folder"
プロンプトが出るのがイヤなら以下にします。
rd /s /q "N:\Target Folder"
もちろん既に Everyone
フルコントロール付与されているので、エクスプローラから消せるし、ゴミ箱への移動も可能です。
どういうこと?
ちょっとだけ解説です。
とくにUnix系のファイルシステムに慣れた人にとっては、まず
「管理者:rootで消せないって、どういうこと??」
(SELinuxとかAppArmorとかで保護されているならともかく)
って考えると思います。(自分もそうでした)
NTFSでは、そうではない。
おそらくだけど、こんな感じになっているみたい。
- オブジェクトには「所有者」がある
- 管理者アカウント(Administrators,LOCAL SYSTEM)は、所有者を変更することが可能
- 「所有者」および「定義済みの」権限保持者がACL(DACLsおよびSACLs)を触れる
- 「所有者」「管理者」を含め、すべてのユーザーは、定義済みのACLの制約を受ける
なので、ファイルシステム上でDACLsで管理者に Read/Write
しかついてないようなオブジェクトでは、先にDACLsを書き換えてからじゃないと削除とかの特殊な操作はできない。
定義済み権限の中に含まれていないのならACLの書き換えもできないので、まず所有権も取得しないといけない。
たとえばWindowsのインストール処理なんかだと、管理者とは別の TrustedInstaller
というユーザに握らせている。
親オブジェクト(フォルダ)の継承を切って、ファイルを TrustedInstaller
に握らせると、管理者であってもそう簡単には消せない。
そうではあるけれど、まぁ仕組みさえ分かってしまえば、冒頭のような操作で対応可能。
ちょっと余談
%WINDIR%\System32
配下のファイルは、(全部かどうかは確認できてないけど)上記の仕組みで TrustedInstaller
が握っているように見える。
ところが最近、とある業務システムで、こんな事故があったそうな。
cd /d %WINDIR%\System32
rem (..詳細省略..)
del /f *.*
これでWindows再起動かけたら、起動しなくなってバックアップから復旧させた、とのこと。
先に触れたとおり TrustedInstaller
が握っているはずなら、管理者権限で誤削除されちゃうような事故は回避される(されている)と思うのだが。。
誰かが意図せずに(わけもわからず)権限変更したとか、他の要因もプラスされているのでは??
ちょっと事故の検証が足らないのかもしれない。(ぼそっ)
最後に、おことわり
ちゃんと調べたわけでないので不正確なところがあるかもしれない。マイクロソフトの記事とかを探せば正確な仕様も見つかるはずなので探してください。
コメント欄とかで教えていただけると嬉しいです。