Get-UACSetting.ps1

function Get-UACSetting {
<#
.SYNOPSIS
    Get UAC settings

.DESCRIPTION
    Get UAC settings

    For each computer specified, extract UAC settings from registry.
    For each registry value, include the value, existing data, default, and boolean for whether existing isDefault
    If specified, revert the value data to default
    
    Note: you can change the defaults and thus specify a new 'default'

.PARAMETER computername
    Computer(s) to test

.PARAMETER RevertToDefault
    Reverts UAC settings to the default values
    Note: you can change the defaults and thus specify a new 'default'

    Default values and further details on them can be found on Technet:
    http://technet.microsoft.com/en-us/library/dd835564(v=ws.10).aspx

.PARAMETER FilterAdministratorTokenD

    Default value used to produce 'isDefault' property and to determine new value when revertToDefault parameter is specified

.PARAMETER EnableUIADesktopToggleD

    Default value used to produce 'isDefault' property and to determine new value when revertToDefault parameter is specified

.PARAMETER ConsentPromptBehaviorAdminD

    Default value used to produce 'isDefault' property and to determine new value when revertToDefault parameter is specified

.PARAMETER ConsentPromptBehaviorUserD

    Default value used to produce 'isDefault' property and to determine new value when revertToDefault parameter is specified

.PARAMETER EnableInstallerDetectionD

    Default value used to produce 'isDefault' property and to determine new value when revertToDefault parameter is specified

.PARAMETER ValidateAdminCodeSignaturesD

    Default value used to produce 'isDefault' property and to determine new value when revertToDefault parameter is specified

.PARAMETER EnableSecureUIAPathsD

    Default value used to produce 'isDefault' property and to determine new value when revertToDefault parameter is specified

.PARAMETER EnableLUAD

    Default value used to produce 'isDefault' property and to determine new value when revertToDefault parameter is specified

.PARAMETER PromptOnSecureDesktopD

    Default value used to produce 'isDefault' property and to determine new value when revertToDefault parameter is specified

.PARAMETER EnableVirtualizationD

    Default value used to produce 'isDefault' property and to determine new value when revertToDefault parameter is specified

.EXAMPLE
    Get-UACSetting -computername computer1, computer2 | format-table -autosize

    #Return all UAC settings from computer1 and computer2.

.EXAMPLE
    Get-UACSetting -computername computer1 -reverttodefault
    
    #Reverts UAC settings on computer1 to default
    
 .EXAMPLE
    'computer1', 'computer2' | Get-UACSetting | ?{$_.isdefault -eq 0}

    #Return non-default UAC settings for computer1 and computer2

.FUNCTIONALITY
    Computers

.NOTES
    Links on UAC:
        Default values and further details on them can be found on Technet:
            http://technet.microsoft.com/en-us/library/dd835564(v=ws.10).aspx
        Inside Windows 7 User Account Control
            http://technet.microsoft.com/en-us/magazine/2009.07.uac.aspx
        Inside Windows Vista User Account Controls
            http://technet.microsoft.com/en-us/magazine/2007.06.uac.aspx
        Engineering Windows 7 � UAC Post 1 through 4
            http://blogs.msdn.com/e7/archive/2008/10/08/user-account-control.aspx
            http://blogs.msdn.com/b/e7/archive/2009/01/15/user-account-control-uac-quick-update.aspx
            http://blogs.msdn.com/b/e7/archive/2009/02/05/update-on-uac.aspx
            http://blogs.msdn.com/b/e7/archive/2009/02/05/uac-feedback-and-follow-up.aspx
        User Account Control Technical Reference
            http://technet.microsoft.com/en-us/library/dd835546%28v=ws.10%29.aspx
#>

[CmdletBinding()]
    param(
        [Parameter( 
            ValueFromPipeline=$true,
            ValueFromPipelineByPropertyName=$true, 
            ValueFromRemainingArguments=$false, 
            Position=0
        )][string[]]$ComputerName = $env:COMPUTERNAME,
        [switch]$RevertToDefault,
        [validaterange(0,1)][int]$FilterAdministratorTokenD = 0,
        [validaterange(0,1)][int]$EnableUIADesktopToggleD = 0,
        [validaterange(0,5)][int]$ConsentPromptBehaviorAdminD = 5,
        [validaterange(0,3)][int]$ConsentPromptBehaviorUserD = 3,
        [validaterange(0,1)][int]$EnableInstallerDetectionD = 1,
        [validaterange(0,1)][int]$ValidateAdminCodeSignaturesD = 0,
        [validaterange(0,1)][int]$EnableSecureUIAPathsD = 1,
        [validaterange(0,1)][int]$EnableLUAD = 1,
        [validaterange(0,1)][int]$PromptOnSecureDesktopD = 1,
        [validaterange(0,1)][int]$EnableVirtualizationD = 1
    )
    Begin {

        function quote-list {$args}

        #Define key for UAC values
        $key = "Software\Microsoft\Windows\CurrentVersion\Policies\System"
    
        #Define UAC Values
        $values = quote-list FilterAdministratorToken EnableUIADesktopToggle ConsentPromptBehaviorAdmin 
        $values += quote-list ConsentPromptBehaviorUser EnableInstallerDetection ValidateAdminCodeSignatures
        $values += quote-list EnableSecureUIAPaths EnableLUA PromptOnSecureDesktop EnableVirtualization

    }
    Process{
        #loop through computers
        foreach($computer in $ComputerName){

            #test the connection
            if(Test-connection $computer -quiet -count 2 -buffersize 16){

                #init results array
                $results = @()

                try{
                    #open the registry key on remote computer
                    $OpenRegistry = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine,$computer)
    
                    #for each value, add value and data pair to a custom object
                    foreach($value in $values) {
        
                        #get the value
                        $subkey = $OpenRegistry.OpenSubKey($key,$true)
                        $data = $subkey.GetValue($value)
                        New-Variable -Name "$value" -Value $data -force
        
                        #Set default value or overridden default value
                        $dataD = (Get-Variable -Name "$value`D").value

                        #create object and set properties
                        $obj = "" | select ComputerName, Value, existingData, defaultData, isDefault
                        $obj.ComputerName = $computer
                        $obj.Value = "$value"
                        $obj.existingData = "$data"
                        $obj.defaultData = "$dataD"
                        $obj.isDefault = 1
        
                        #If data does not match default...
                        if($data -ne $dataD){
            
                            #indicate not default
                            $obj.isDefault = 0

                            #revert to default and set modified and newdata properties
                            if($RevertToDefault){
                                $Subkey.SetValue("$value",$dataD)
                                $obj | Add-Member -MemberType NoteProperty -name newData -Value $dataD -Force
                            }
                        }

                        #add to results array
                        $results += $obj
                    }
        
                    #define properties to return
                    $properties = quote-list ComputerName Value existingData defaultData
    
                    if($RevertToDefault){
                        #If we set revert to default, show newData property
                        $properties += "newData"    
                    } 
                    else{
                        #if we didn't call for revert to default, add the isdefault property
                        $properties += "isDefault"
                    }

                    #output the results
                    $results | select -Property $properties
                }
                Catch{
                    Write-Error "Error pulling UAC settings from $computer"
                }
            }
        }
    }
}