Functions/ConvertFrom-FsRight.ps1

function ConvertFrom-FsRight {
<#
.SYNOPSIS
    To convert a [uint32] FileSystemRight value into a human readable form
.DESCRIPTION
    To convert a [uint32] FileSystemRight value into a human readable form using normal text
.PARAMETER Rights
    The filesystemrights value determined by: get-acl -Path $Path | select-object -expand access | select-object FileSystemRights
    Alternatively a [uint32] value could be passed from the command line. Hex values need to be enclosed in quotes.
.EXAMPLE
    ConvertFrom-FsRight -Rights "0x1F01FF"
    Would return
    FullControl
.EXAMPLE
    ConvertFrom-FsRight -Rights "0x1301BF"
    Would return
    ReadAndExecute,Modify,Write
.EXAMPLE
    ConvertFrom-FsRight -Rights 268435456
    Would return
    GenericAll
.LINK
    Get-ACL
.OUTPUTS
    A [string] of all the applicable rights in readable form
#>


    #region Parameters
    [CmdletBinding()]
    [OutputType('string')]
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSReviewUnusedParameter', '')]
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', '')]
    param([uint64] $Rights)
    #endregion Parameters

    begin {
        Write-Verbose -Message "Starting [$($MyInvocation.Mycommand)]"
    }

    process {
        $temp = @()
        $fsPermission = Show-FsRight -Verbose:$false
        $MatchFound = $false
        $fsPermission | Where-Object { $_.Type -eq 'Combo' } | ForEach-Object {
            #write-verbose "Name = [$($_.name)], Value = [$($_.Dec)]"
            if ($Rights -eq $_.Dec) {
                $temp += $_.Name
                $MatchFound = $true
                Write-Verbose -Message "Temp now equal to [$($temp -join ',')]"
                Write-Output -InputObject ( $_.Name )
                #break
            }
        }

        if (-not $MatchFound ) {

            # Simple permissions hit a match, output the variable and return
            # if ($temp) {
            # write-output -inputobject ( $temp -join ',' )
            # }
            $fsPermission | Where-Object { $_.Type -eq 'Single' } | ForEach-Object {
                #write-verbose "Name = [$($_.name)], Value = [$($_.Dec)]"
                if ($Rights -band $_.Dec) {
                    $temp += $_.Name
                    $MatchFound = $true
                    Write-Verbose -Message "Temp now equal to [$($temp -join ',')]"
                }
            }
            $MatchFound | Out-Null
            # Simple permissions hit a match, output the variable and return
            if ( $MatchFound ) {
                Write-Output -InputObject ( $temp -join ',' )
            } else {
                Write-Output -InputObject $null
            }
        }
    }

    end {
        Write-Verbose -Message "Ending [$($MyInvocation.Mycommand)]"
    }
}