tech.guitarrapc.cóm

Technical updates

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

という表題ですが、PowerShell純正コマンドレットではどうしようもありません。

guitarrapc/PowerShellUtil - Set-Ace/Set-Ace.ps1 | GitHub

問題の概要

ACE(ファイルの所有者) がない = ACLへのアクセス一切が出来ないのでGet-ACLGet-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