読者です 読者をやめる 読者になる 読者になる

tech.guitarrapc.cóm

C#, PowerShell, Unity, Cloud, Serverless Technical Update and Features

PowerShell で ACE (ファイルの所有者) がないファイルを操作する

という表題ですが、PowerShell 純正コマンドレットではどうしようもありません。 ACE(ファイルの所有者) がない = ACL へのアクセス 一切が出来ないので、 Get-ACL も Get-ChildItem も一切できずほげります。 icacls を使ってACL 操作も.... 当然できません。むしろこれができるなら Set-ACLできてます。 このような状況になった場合、方法は2つあります。
  1. エクスプローラー > ファイルのプロパティ > セキュリティ詳細設定 > ファイルの所有者を設定
  2. takeown コマンドを利用する
takeown でフォルダ内の全ファイルから ACEを失ったファイルにadministrator所有者を操作するときは、毎回同じコマンドを利用します。 そこで、今回の記事は PowerShell コマンドレットにラップしてちょっと使いやすくしてしまおうというものです。 takeown偉大です。まゆきさんに教えていただき助かりました。

利用する takeown コマンド

そのフォルダ内部のファイルすべての所有者を administrator (管理者) とする場合は以下のコマンドで決め撃てます。
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

GitHub

一応コードおいておきますね。 https://github.com/guitarrapc/PowerShellUtil/blob/master/Set-Ace/Set-Ace.ps1