という表題ですが、PowerShell純正コマンドレットではどうしようもありません。
guitarrapc/PowerShellUtil - Set-Ace/Set-Ace.ps1 | GitHub
問題の概要
ACE(ファイルの所有者) がない = ACLへのアクセス一切が出来ないのでGet-ACL
やGet-ChildItem
が実行できなくなります。
icacls
を使ったACL操作もできません。むしろこれができるならSet-ACL
できてます。
このような状況になった場合、方法は2つあります。
- エクスプローラー > ファイルのプロパティ > セキュリティ詳細設定 > ファイルの所有者を設定
takeown
コマンドを利用する
takeown
でフォルダ内の全ファイルからACEを失ったファイルにadministrator所有者を操作するときは、毎回同じコマンドを利用します。
そこで、今回の記事はPowerShellコマンドレットにラップしてちょっと使いやすくしてしまおうというものです。
takeown偉大です。まゆきさんに教えていただき助かりました。
利用する takeown コマンド
そのフォルダ内部のファイルすべての所有者を管理者とする場合は以下のコマンドで決め撃てます。
takeown.exe /F フォルダパス /A /R
ACE 設定後のACL(セキュリティ設定)は?
上位ディレクトリのフォルダにセキュリティ設定をして、内部ファイル、サブディレクトリへ継承するのが一般的でしょう。
今回はその前提ですが、 Set-ACL
などを利用してもいいでしょう。
PowreShell コマンドレットに組み込む
後は普通にStart-Processを使って組み込んでしまいます。 ファイルパスだけ自在に操作出来るようにしておきました。
コード全文です。
function Set-Ace{ [CmdletBinding()] param( [parameter( position = 0, mandatory = 0 )] [string] $path ) if (Test-Path -Path $path) { Start-Process -FilePath takeown -ArgumentList "/F $path /A /R" } else { Write-Warning "File not exist. Please check path you tried." } }
利用する時はさっくり簡単にこのような感じで。
Set-ACE -path d:\hogehoge