Public/Network/Test-Network.ps1
function Test-Network { <# .SYNOPSIS Wrapper function for Get-IpRange, Test-ConnectionAsync, and Get-DNSHostEntryAsync to give summary table of ip addresses that either resolve to a host name or respond to a ping .DESCRIPTION Wrapper function for Get-IpRange, Test-ConnectionAsync, and Get-DNSHostEntryAsync to give summary table of ip addresses that either resolve to a host name or respond to a ping .PARAMETER Subnet A string or string array of subnets listed in CIDR format (e.g. 10.100.10.0/24). Can either be specified with -Subnet parameter or fed from the pipeline .EXAMPLE '10.100.40.0/29' | Test-Network IpAddress ComputerName Result --------- ------------ ------ 10.100.40.1 UNKNOWN Success 10.100.40.2 UNKNOWN Success 10.100.40.3 server-102094.contosco.com Success 10.100.40.4 server-101811.contosco.com Success 10.100.40.5 server-102372.contosco.com TimeOut 10.100.40.6 server-101875.contosco.com Success #> [cmdletbinding()] param( [Parameter(Mandatory, HelpMessage = 'Please enter a network in CIDR format (ex. 192.168.1.0/24)', Position = 0, ValueFromPipeline)] [string[]] $Subnet ) begin { Write-Invocation $MyInvocation } process { foreach ($curSubnet in $Subnet) { Out-Verbose "Getting ip addresses in range [$curSubnet]" $net = Get-IpRange -Subnet $curSubnet -Verbose:$false Out-Verbose "Testing connectivity to [$($net.count)] ip addresses in range [$curSubnet]" $result = Test-ConnectionAsync -ComputerName $net -Timeout 5000 -ErrorAction SilentlyContinue -Verbose:$false | Select-Object -Property @{Name = 'IpAddress'; Expr = { $_.ComputerName } }, @{Name = 'ComputerName'; Expr = { $null } }, Result Out-Verbose "Getting host names to [$($net.count)] ip addresses in range [$curSubnet]" $Name = Get-DNSHostEntryAsync -ComputerName $net -ErrorAction SilentlyContinue -Verbose:$false Out-Verbose 'Consolidating data' foreach ($curResult in $Result) { $tmp = $Name | Where-Object { $_.ComputerName -eq $curResult.IpAddress } if ($tmp) { if ($tmp.Result -eq 'No such host is known') { $curResult.ComputerName = 'UNKNOWN' } else { $curResult.ComputerName = $tmp.Result.ToLower() } } if ($curResult.Result -ne 'Success') { $curResult.Result = 'TimeOut' } } $result = $result | Where-Object { !($_.ComputerName -eq 'UNKNOWN' -and $_.Result -eq 'TimeOut') } Write-Output -InputObject $result } } end { Out-Verbose $fxn "Complete." } } |