These issues manifest in applications behaving strangely often providing uselessly generic errors messages or even worse, some misleading ones. After a very tedious issue over a weekend which required repeated checkouts across a globally distributed AD integrated DNS zone, I thought I wouldn't do this manually all the time with excel magic but via a script.
Steps needed to be made:
- Take a list of server names (ideally FQDNs)
- Perform a forward lookup to get the IP address(es) of each server
- Take those IPs and perform a reverse lookup on them
- Mark each host and IP with error if either the forward or reverse lookups fail or the reverse lookup provides a different hostname than the server name provided
Forward lookup (filtering on IPv4 only):
[array]$IPAddresses = [System.Net.Dns]::GetHostAddresses($obj.ComputerName) | ?{$_.AddressFamily -eq "InterNetwork"} | %{$_.IPAddressToString}
[array]$IPAddresses = [System.Net.Dns]::GetHostAddresses($obj.ComputerName) | ?{$_.AddressFamily -eq "InterNetwork"} | %{$_.IPAddressToString}
Reverse lookup:
$tmpreverse = [System.Net.Dns]::GetHostByAddress($_).HostName
Output:
The full script (simplified version):
$hostlist = @($input)
# running through the list of hosts
$hostlist | %{
$obj = "" | Select ComputerName,Ping,IPNumber,ForwardLookup,ReverseLookup,Result
$obj.ComputerName = $_
# ping each host
if(Test-Connection $_ -quiet){
$obj.Ping = "OK"
$obj.Result = "OK"
}
else{
$obj.Ping = "Error"
$obj.Result = "Error"
}
# lookup IP addresses of the given host
[array]$IPAddresses = [System.Net.Dns]::GetHostAddresses($obj.ComputerName) | ?{$_.AddressFamily -eq "InterNetwork"} | %{$_.IPAddressToString}
# caputer count of IPs
$obj.IPNumber = ($IPAddresses | measure).count
# if there were IPs returned from DNS, go through each IP
if($IPAddresses){
$obj.ForwardLookup = "OK"
$IPAddresses | %{
$tmpreverse = $null
# perform reverse lookup on the given IP
$tmpreverse = [System.Net.Dns]::GetHostByAddress($_).HostName
if($tmpreverse){
# if the returned host name is the same as the name being processed from the input, the result is OK
if($tmpreverse -ieq $obj.ComputerName){
$obj.ReverseLookup += "$_ : OK `n"
}
else{
$obj.ReverseLookup += "$_ different hostname: $tmpreverse `n"
$obj.Result = "Error"
}
}
else{
$obj.ReverseLookup = "No host found"
$obj.Result = "Error"
}
}
}
else{
$obj.ForwardLookup = "No IP found"
$obj.Result = "Error"
}
# return the output object
$obj
}
t