Private/ResolveHost.ps1
function ResolveHost { [CmdletBinding()] Param( [Parameter(Mandatory=$True)] [string]$HostNameOrIP ) ##### BEGIN Main Body ##### $RemoteHostNetworkInfoArray = @() if (!$(TestIsValidIPAddress -IPAddress $HostNameOrIP)) { try { $HostNamePrep = $HostNameOrIP [System.Collections.ArrayList]$RemoteHostArrayOfIPAddresses = @() $IPv4AddressFamily = "InterNetwork" $IPv6AddressFamily = "InterNetworkV6" $ResolutionInfo = [System.Net.Dns]::GetHostEntry($HostNamePrep) $ResolutionInfo.AddressList | Where-Object { $_.AddressFamily -eq $IPv4AddressFamily } | foreach { if ($RemoteHostArrayOfIPAddresses -notcontains $_.IPAddressToString) { $null = $RemoteHostArrayOfIPAddresses.Add($_.IPAddressToString) } } } catch { Write-Verbose "Unable to resolve $HostNameOrIP when treated as a Host Name (as opposed to IP Address)!" if ($HostNameOrIP -match "\.") { try { $HostNamePrep = $($HostNameOrIP -split "\.")[0] Write-Verbose "Trying to resolve $HostNameOrIP using only HostName: $HostNamePrep!" [System.Collections.ArrayList]$RemoteHostArrayOfIPAddresses = @() $ResolutionInfo = [System.Net.Dns]::GetHostEntry($HostNamePrep) $ResolutionInfo.AddressList | Where-Object { $_.AddressFamily -eq $IPv4AddressFamily } | foreach { if ($RemoteHostArrayOfIPAddresses -notcontains $_.IPAddressToString) { $null = $RemoteHostArrayOfIPAddresses.Add($_.IPAddressToString) } } } catch { Write-Verbose "Unable to resolve $HostNamePrep!" } } } } if (TestIsValidIPAddress -IPAddress $HostNameOrIP) { try { $HostIPPrep = $HostNameOrIP [System.Collections.ArrayList]$RemoteHostArrayOfIPAddresses = @() $null = $RemoteHostArrayOfIPAddresses.Add($HostIPPrep) $ResolutionInfo = [System.Net.Dns]::GetHostEntry($HostIPPrep) [System.Collections.ArrayList]$RemoteHostFQDNs = @() $null = $RemoteHostFQDNs.Add($ResolutionInfo.HostName) } catch { Write-Verbose "Unable to resolve $HostNameOrIP when treated as an IP Address (as opposed to Host Name)!" } } if ($RemoteHostArrayOfIPAddresses.Count -eq 0) { Write-Error "Unable to determine IP Address of $HostNameOrIP! Halting!" $global:FunctionResult = "1" return } # At this point, we have $RemoteHostArrayOfIPAddresses... [System.Collections.ArrayList]$RemoteHostFQDNs = @() foreach ($HostIP in $RemoteHostArrayOfIPAddresses) { try { $FQDNPrep = [System.Net.Dns]::GetHostEntry($HostIP).HostName } catch { Write-Verbose "Unable to resolve $HostIP. No PTR Record? Please check your DNS config." continue } if ($RemoteHostFQDNs -notcontains $FQDNPrep) { $null = $RemoteHostFQDNs.Add($FQDNPrep) } } if ($RemoteHostFQDNs.Count -eq 0) { $null = $RemoteHostFQDNs.Add($ResolutionInfo.HostName) } [System.Collections.ArrayList]$HostNameList = @() [System.Collections.ArrayList]$DomainList = @() foreach ($fqdn in $RemoteHostFQDNs) { $PeriodCheck = $($fqdn | Select-String -Pattern "\.").Matches.Success if ($PeriodCheck) { $HostName = $($fqdn -split "\.")[0] $Domain = $($fqdn -split "\.")[1..$($($fqdn -split "\.").Count-1)] -join '.' } else { $HostName = $fqdn $Domain = "Unknown" } $null = $HostNameList.Add($HostName) $null = $DomainList.Add($Domain) } if ($RemoteHostFQDNs[0] -eq $null -and $HostNameList[0] -eq $null -and $DomainList -eq "Unknown" -and $RemoteHostArrayOfIPAddresses) { [System.Collections.ArrayList]$SuccessfullyPingedIPs = @() # Test to see if we can reach the IP Addresses foreach ($ip in $RemoteHostArrayOfIPAddresses) { try { $null = [System.Net.NetworkInformation.Ping]::new().Send($ip,1000) $null = $SuccessfullyPingedIPs.Add($ip) } catch { Write-Verbose "Unable to ping $ip..." continue } } } $FQDNPrep = if ($RemoteHostFQDNs) {$RemoteHostFQDNs[0]} else {$null} if ($FQDNPrep -match ',') { $FQDN = $($FQDNPrep -split ',')[0] } else { $FQDN = $FQDNPrep } $DomainPrep = if ($DomainList) {$DomainList[0]} else {$null} if ($DomainPrep -match ',') { $Domain = $($DomainPrep -split ',')[0] } else { $Domain = $DomainPrep } $IPAddressList = [System.Collections.ArrayList]@($(if ($SuccessfullyPingedIPs) {$SuccessfullyPingedIPs} else {$RemoteHostArrayOfIPAddresses})) $HName = if ($HostNameList) {$HostNameList[0].ToLowerInvariant()} else {$null} if ($SuccessfullyPingedIPs.Count -eq 0 -and !$FQDN -and !$HostName -and !$Domain) { Write-Error "Unable to resolve $HostNameOrIP! Halting!" $global:FunctionResult = "1" return } [pscustomobject]@{ IPAddressList = $IPAddressList PingSuccess = $($SuccessfullyPingedIPs.Count -gt 0) FQDN = $FQDN HostName = $HName Domain = $Domain } ##### END Main Body ##### } |