DscResources/DnsServerQueryResolutionPolicies/DnsServerQueryResolutionPolicies.schema.psm1

configuration DnsServerQueryResolutionPolicies
{
    param
    (
        [Parameter(Mandatory)]
        [Hashtable[]]
        $Policies
    )

    Import-DscResource -ModuleName PSDesiredStateConfiguration

    foreach ($dnsPol in $Policies)
    {
        # Remove Case Sensitivity of ordered Dictionary or Hashtables
        $dnsPol = @{}+$dnsPol

        $name   = $dnsPol.Name
        $action = $dnsPol.Action
        $fqdn   = $dnsPol.Fqdn

        Script "dnsQueryPol_$($name)"
        {
            TestScript = {
                $val = Get-DnsServerQueryResolutionPolicy -Name $using:name -ErrorAction SilentlyContinue

                Write-Verbose "Test DNS query policy '$using:name' -> expect Action: '$using:action', FQDN '$using:fqdn'"
                Write-Verbose "Current Values: Action: '$($val.Action)'"

                if ($null -ne $val -and $val.Action -eq $using:action)
                {
                    $critType = $val.Criteria.CriteriaType
                    $critVal  = $val.Criteria.Criteria

                    Write-Verbose "Current Values: $($critType): '$critVal'"

                    # FQDN ends with . -> this character is added by Add/Set function if not present in YAML FQDN definition
                    if( $critType -eq 'Fqdn' -and
                        (($critVal -eq $using:fqdn) -or 
                         ($critVal.EndsWith('.') -and ($critVal.Substring(0, $critVal.Length - 1)) -eq $using:fqdn)) ) 
                    { 
                        return $true
                    }
                }   

                Write-Verbose "Differences found."
                return $false
            }
            SetScript = {      
                $val = Get-DnsServerQueryResolutionPolicy -Name $using:name -ErrorAction SilentlyContinue

                if ($null -eq $val)
                {
                    Write-Verbose "Add DNS query policy '$using:name' with Action: '$using:action', FQDN '$using:fqdn'"
                    Add-DnsServerQueryResolutionPolicy -Name $using:name -Action $using:action -Fqdn $using:fqdn
                }
                else
                {
                    Write-Verbose "Update DNS query policy '$using:name' with Action: '$using:action', FQDN '$using:fqdn'"
                    Set-DnsServerQueryResolutionPolicy -Name $using:name -Action $using:action -Fqdn $using:fqdn                        
                }
            }
            GetScript = { return @{result = 'N/A'}}
        }            
    }
}