Public/Set-AclItemOwner.ps1

Set-StrictMode -Version Latest

#### <h2 style="color: #DCA657;">Set-AclItemOwner</h2>
####
function Set-AclItemOwner {
    #### Change the owner of one item and return it as read back from disk.
    ####
    #### Requires Administrator. Supports `-WhatIf`.
    ####
    #### <b style="color: #D2A8FF;">Parameters</b>
    ####
    [CmdletBinding(SupportsShouldProcess)]
    param(
        #### - `[PSCustomObject]`: __AclItem__
        #### - *An object from `Get-AclItem`. Accepts pipeline input.*
        [Parameter(Mandatory = $true, ValueFromPipeline)]
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$AclItem,

        #### - `[string]`: __Identity__
        #### - *New owner as `DOMAIN\User`. Defaults to the current user.*
        [Parameter()]
        [ValidateNotNullOrEmpty()]
        [string]$Identity
    )
    begin {
        ####
        #### <b style="color: #C22514;">Throws</b>
        ####
        #### - When the session is not elevated.
        Assert-Administrator
        if ([string]::IsNullOrWhiteSpace($Identity)) {
            $Identity = "$($env:USERDOMAIN)\$($env:USERNAME)"
        }
        $newOwner = [System.Security.Principal.NTAccount]::new($Identity)
    }
    process {
        #### - When `AclItem` did not come from `Get-AclItem`.
        if (-not $AclItem.PSObject.Properties.Match('FullName').Count) {
            throw 'Usage: Get-Item -LiteralPath . | Get-AclItem | Set-AclItemOwner'
        }
        $owner = $AclItem.Owner
        if ($PSCmdlet.ShouldProcess($AclItem.FullName, "Change owner from $owner to $newOwner on $($AclItem.Name)")) {
            $acl = Get-Acl -LiteralPath $AclItem.FullName
            $acl.SetOwner($newOwner)
            Set-Acl -LiteralPath $AclItem.FullName -AclObject $acl

            ####
            #### <b style="color: #369FFF;">Returns</b>
            ####
            #### - `[PSCustomObject]`
            #### - *A fresh `Get-AclItem` read, so the owner reflects disk and not intent.*
            #### - *Nothing under `-WhatIf`.*
            Get-AclItem -LiteralPath $AclItem.FullName
        }
    }
}
####
#### ---
####