private/helper/dns/Invoke-DnsRequest.ps1
function Invoke-DnsRequest { <# .SYNOPSIS Invoke DNS over HTTPS. .DESCRIPTION Uses Google API to resolve DNS. .PARAMETER Domain Domain to resolve. .PARAMETER Type DNS record type. .EXAMPLE # Get TXT record for domain. Invoke-DnsRequest -Domain 'example.com' -Type 'TXT'; .EXAMPLE # Get A record for domain. Invoke-DnsRequest -Domain 'example.com' -Type 'A'; #> [cmdletbinding()] param ( # Domain to lookup. [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)] [ValidateNotNullOrEmpty()] [string]$Domain, # DNS record type. [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)] [ValidateSet('A', 'AAAA', 'CNAME', 'MX', 'NS', 'PTR', 'SOA', 'SRV', 'TXT')] [string]$Type = 'A' ) BEGIN { # Write to log. Write-CustomLog -Category 'DNS' -Subcategory $Type -Message ("Resolving record of type '{0}' for domain '{1}'" -f $Type, $Domain) -Level Verbose; # Base URL to query. $baseUrl = 'https://dns.google.com/resolve'; # Construct the query string. $queryString = ('?name={0}&type={1}' -f $Domain, $Type); # Construct the URI. $uri = ($baseUrl + $queryString); } PROCESS { # Try to invoke the DNS request. try { # Write to log. Write-CustomLog -Category 'DNS' -Subcategory $Type -Message ("Calling API endpoint '{0}'" -f $uri) -Level Verbose; # Invoke the request. $response = Invoke-RestMethod -Method Get -Uri $uri -ErrorAction Stop; # If the response status is not 0. if ($response.Status -ne 0) { # Write to log. Write-CustomLog -Category 'DNS' -Subcategory $Type -Message ("DNS lookup failed for '{0}'" -f $domain, $_) -Level Verbose; } # Write to log. Write-CustomLog -Category 'DNS' -Subcategory $Type -Message ("DNS lookup succeeded for '{0}'" -f $domain) -Level Verbose; } # Something went wrong invoking the DNS request. catch { # Throw exception. throw ("Something went wrong while invoking DNS request for '{0}', exception is '{1}'" -f $domain, $_); } } END { # If the response have an answer for the DNS request. if ($null -ne $response.Answer) { # Return the response. return $response.Answer; } } } |