PowerShell Tip: Getting enum values as names, int and bit


There are a number of samples how to resolve enums and display all the possible values. However, none of those worked for me with the enum System.Security.AccessControl.FileSystemRights. This enum has duplicate values and as most functions listing enum values are based on Enum.GetValues, you see not just the duplicate values but also duplicate names. So while sitting in an airplane in Cologne waiting for the staff to fix some valve, i couldn’t think of a better way to spend my time than writing about this world-changing code snippet.

To solve that, I have created this little helper function, an ideal candidate for your PowerShell profile. It uses Enum.GetNames hence shows the names as defined in the enum regardless if they have the same value. Get-Enum prints the binary values if you pass in a Flags enum. If the enum is not a binary one, the output will be only name and value.

function Get-Enum { 
    param (
        [type]$Type
    )

    if ($Type.BaseType.FullName -ne 'System.Enum')
    {
        Write-Error "Type '$Type' is not an enum"
        return
    }

    if ($Type.CustomAttributes | Where-Object { $_.AttributeType -eq [System.FlagsAttribute] })
    {
        Write-Host "Type '$Type' is a Flags enum"
        Write-Host
        $isFlagsEnum = $true
    }

    $props = @(
        @{ Name = 'Name'; Expression={ [string]$_ } }
        @{ Name = 'Value'; Expression={ [uint32](Invoke-Expression "[$($type.FullName)]'$_'") }}
    )

    if ($isFlagsEnum)
    {
        $props += @{ Name = 'Binary'; Expression={[Convert]::ToString([uint32](Invoke-Expression "[$($type.FullName)]'$_'"), 2)}}
    }

    [enum]::GetNames($Type) | 
    Select-Object -Property $props    
} 

 

You can call the function like this

Get-Enum System.DayOfWeek

to get this output:

Name      Value
----      -----
Sunday        0
Monday        1
Tuesday       2
Wednesday     3
Thursday      4
Friday        5
Saturday      6

 

And this is the example of the enum that made me write this post

Get-Enum -Type System.Security.AccessControl.FileSystemRights

And as this is a flags enum, the function displays the binary representation of the value as well:

Name                           Value Binary               
----                           ----- ------               
ListDirectory                      1 1                    
ReadData                           1 1                    
WriteData                          2 10                   
CreateFiles                        2 10                   
CreateDirectories                  4 100                  
AppendData                         4 100                  
ReadExtendedAttributes             8 1000                 
WriteExtendedAttributes           16 10000                
Traverse                          32 100000               
ExecuteFile                       32 100000               
DeleteSubdirectoriesAndFiles      64 1000000              
ReadAttributes                   128 10000000             
WriteAttributes                  256 100000000            
Write                            278 100010110            
Delete                         65536 10000000000000000    
ReadPermissions               131072 100000000000000000   
Read                          131209 100000000010001001   
ReadAndExecute                131241 100000000010101001   
Modify                        197055 110000000110111111   
ChangePermissions             262144 1000000000000000000  
TakeOwnership                 524288 10000000000000000000 
Synchronize                  1048576 100000000000000000000
FullControl                  2032127 111110000000111111111

Have fun!

Comments (0)

Skip to main content