PingList
Pinglist
$StartTime = Get-Date Write-Host "Starting $StartTime" #Import a source list of machines to test must have a column header of DiscoveryComputerName $pinglist = Import-Csv ".\ws.csv" #Filter this list to exclude lines without a value for DiscoveryComputername $pinglist = $pinglist | where {$_.DiscoveryComputername -ne ""} $Counter = $null foreach ($machine in $pinglist) { #Clear variable at the start of each iteration $DNS = $null $Domain = $null $pingable = $null $IPAddress = $null $WMIOS = $null $WMIOSInstallDate = $null $WMIDomain = $null $WMIError = $null $ErrorString = $null $MatchingNames = $null $Counter ++ #add error trapping for DNS # Exception calling "GetHostByName" with "1" argument(s): "The requested name is valid, but no data of the requested type was found" $DNS = [System.Net.Dns]::GetHostByName($machine.DiscoveryComputerName) If ($DNS) { #Check if hostname lenght is longer than computername if so set Domain to hostname - computername If ($dns.HostName.Length -gt $machine.DiscoveryComputerName.Length) {$Domain = $DNS.HostName.Substring(($dns.HostName.Split(".")[0].length + 1))} #get the First IP Address in the list $IPAddress = $DNS.AddressList[0].IPAddressToString $pingable=$(Test-Connection -Quiet -count 2 -ComputerName $IPAddress) If ($pingable) { #get the Computername from WMI via IP address $WMIOS = Get-WmiObject -ErrorVariable WMIError -ErrorAction SilentlyContinue -Class win32_operatingsystem -ComputerName $IPAddress #If there was no error running the previouse line (wmi connection) do this wmi connection too If($?) { $WMIOSInstallDate = (([WMI]'').ConvertToDateTime($WMIOS.InstallDate)).tostring() $WMIDomain = $(Get-WmiObject -Class win32_Computersystem -ComputerName $IPAddress).Domain } #Test if the original computer name matches the name returned by WMI at that IP address if so "True" otherwise #return the WMI errer if it exists or False if not $MatchingNames = IF ($machine.DiscoveryComputerName -eq $WMIOS.CSName) {$true} ElseIf ($WMIError) { $ErrorString = "$WMIError" If($ErrorString -like '*Access is denied*'){"WMI Error - Access is denied"} ElseIf($ErrorString -like '*OutOfMemoryException*'){"WMI Error - OutOfMemoryException"} ElseIf($ErrorString -like '*Server execution failed*'){"WMI Error - Server execution failed"} ElseIf($ErrorString -like '*RPC server is unavailable*'){"WMI Error - RPC server is unavailable"} ElseIf($ErrorString -like '*Not Found*'){"WMI Error - Not Found"} Else { #return the errorstring to MathingName variable and write the new WMI error to a log file $ErrorString $WMIError | Out-File .\$($machine.DiscoveryComputerName)_error.txt } } Else {$false} } } write-host "$Counter testing $($machine.DiscoveryComputerName) Pingable $pingable Names Match $MatchingNames" $machine | Add-Member -membertype noteproperty -name FQDN -Value $DNS.HostName $machine | Add-Member -membertype noteproperty -name DNSDomain -Value $Domain $machine | Add-Member -membertype noteproperty -name DNSIPCount -Value $DNS.AddressList.count $machine | Add-Member -membertype noteproperty -name FirstIPAddress -Value $IPAddress $machine | Add-Member -membertype noteproperty -name Pingable -Value $Pingable $machine | Add-Member -membertype noteproperty -name WMICSName -Value $WMIOS.CSName $machine | Add-Member -membertype noteproperty -name WMIInstallDate -Value $WMIOSInstallDate $machine | Add-Member -membertype noteproperty -name WMIDomain -Value $WMIDomain $machine | Add-Member -membertype noteproperty -name MatchingNames -Value $MatchingNames } $pinglist | Export-Csv -notype ".\Full_Output.csv" #export a list where the name on the list does not match the actual name of the machine. $pinglist | where {$_.MatchingNames -eq $False} | Export-Csv -notype ".\NonMatching_Output.csv" $StopTime = Get-Date $ElapsedTime =$StopTime - $StartTime Write-host "Script completed in $([Math]::Round($ElapsedTime.TotalMinutes,0)) Minutes"
Simplified
$StartTime = Get-Date Write-Host "Starting $StartTime" #Import a source list of machines to test must have a column header of HostName $InputFile = "c:\temp\serverlist.csv" $OutputFile = "c:\temp\serverlist_ouput.csv" $pinglist = Import-Csv $InputFile #Filter this list to exclude lines without a value for HostName $pinglist = $pinglist | where {$_.HostName -ne ""} $Counter = $null foreach ($machine in $pinglist) { #Write-host "$($machine.Hostname)" #Clear variable at the start of each iteration $DNS = $null $Domain = $null $pingable = $null $IPAddress = $null $Counter ++ #add error trapping for DNS # Exception calling "GetHostByName" with "1" argument(s): "The requested name is valid, but no data of the requested type was found" $DNS = [System.Net.Dns]::GetHostByName($machine.Hostname) If ($DNS) { #Check if hostname lenght is longer than computername if so set Domain to hostname - computername If ($dns.HostName.Length -gt $machine.HostName.Length) {$Domain = $DNS.HostName.Substring(($dns.HostName.Split(".")[0].length + 1))} #get the First IP Address in the list $IPAddress = $DNS.AddressList[0].IPAddressToString $pingable=$(Test-Connection -Quiet -count 2 -ComputerName $IPAddress) } write-host "$Counter testing $($machine.Hostname) Pingable $pingable" $machine | Add-Member -membertype noteproperty -name FQDN -Value $DNS.HostName $machine | Add-Member -membertype noteproperty -name DNSDomain -Value $Domain $machine | Add-Member -membertype noteproperty -name DNSIPCount -Value $DNS.AddressList.count $machine | Add-Member -membertype noteproperty -name FirstIPAddress -Value $IPAddress $machine | Add-Member -membertype noteproperty -name Pingable -Value $Pingable } $pinglist | Export-Csv -notype $OutputFile $StopTime = Get-Date $ElapsedTime =$StopTime - $StartTime Write-host "Script completed in $([Math]::Round($ElapsedTime.TotalMinutes,0)) Minutes"