LoginSignup
0
0

NTFSファイルシステム上で、管理者でも消せないフォルダを消したい

Last updated at Posted at 2023-11-12

先におことわり

どこかに同じような記事が既にあるかもしれませんがご了承ください。
記事を探すよりも試すほうが早かったので。

先に結論

コマンドプロンプトから以下を叩きます。

01_reset_inheritance_recursive.cmd

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。

02a_remove_directory_recursive.cmd

rd /s "N:\Target Folder"

プロンプトが出るのがイヤなら以下にします。

02_remove_directory_recursive_quiet.cmd

rd /s /q "N:\Target Folder"

もちろん既に Everyone フルコントロール付与されているので、エクスプローラから消せるし、ゴミ箱への移動も可能です。

どういうこと?

ちょっとだけ解説です。

とくにUnix系のファイルシステムに慣れた人にとっては、まず

「管理者:rootで消せないって、どういうこと??」
(SELinuxとかAppArmorとかで保護されているならともかく)

って考えると思います。(自分もそうでした)

NTFSでは、そうではない。
おそらくだけど、こんな感じになっているみたい。

  1. オブジェクトには「所有者」がある
  2. 管理者アカウント(Administrators,LOCAL SYSTEM)は、所有者を変更することが可能
  3. 「所有者」および「定義済みの」権限保持者がACL(DACLsおよびSACLs)を触れる
  4. 「所有者」「管理者」を含め、すべてのユーザーは、定義済みのACLの制約を受ける

なので、ファイルシステム上でDACLsで管理者に Read/Write しかついてないようなオブジェクトでは、先にDACLsを書き換えてからじゃないと削除とかの特殊な操作はできない。
定義済み権限の中に含まれていないのならACLの書き換えもできないので、まず所有権も取得しないといけない。

たとえばWindowsのインストール処理なんかだと、管理者とは別の TrustedInstaller というユーザに握らせている。
親オブジェクト(フォルダ)の継承を切って、ファイルを TrustedInstaller に握らせると、管理者であってもそう簡単には消せない。

そうではあるけれど、まぁ仕組みさえ分かってしまえば、冒頭のような操作で対応可能。

ちょっと余談

%WINDIR%\System32 配下のファイルは、(全部かどうかは確認できてないけど)上記の仕組みで TrustedInstaller が握っているように見える。
ところが最近、とある業務システムで、こんな事故があったそうな。

crash_job.cmd

cd /d %WINDIR%\System32

rem (..詳細省略..)

del /f *.*

これでWindows再起動かけたら、起動しなくなってバックアップから復旧させた、とのこと。

先に触れたとおり TrustedInstaller が握っているはずなら、管理者権限で誤削除されちゃうような事故は回避される(されている)と思うのだが。。
誰かが意図せずに(わけもわからず)権限変更したとか、他の要因もプラスされているのでは??
ちょっと事故の検証が足らないのかもしれない。(ぼそっ)

最後に、おことわり

ちゃんと調べたわけでないので不正確なところがあるかもしれない。マイクロソフトの記事とかを探せば正確な仕様も見つかるはずなので探してください。
コメント欄とかで教えていただけると嬉しいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0