Last active
August 7, 2020 09:00
-
-
Save moddingg33k/67662cef2acce1fee8b964b83f0e490d to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# https://community.idera.com/database-tools/powershell/powertips/b/tips/posts/final-super-fast-ping-command | |
Function Test-OnlineFast | |
{ | |
param | |
( | |
# make parameter pipeline-aware | |
[Parameter(Mandatory,ValueFromPipeline)] | |
[string[]] | |
$ComputerName, | |
$TimeoutMillisec = 1000 | |
) | |
begin | |
{ | |
# use this to collect computer names that were sent via pipeline | |
[Collections.ArrayList]$bucket = @() | |
# hash table with error code to text translation | |
$StatusCode_ReturnValue = | |
@{ | |
0='Success' | |
11001='Buffer Too Small' | |
11002='Destination Net Unreachable' | |
11003='Destination Host Unreachable' | |
11004='Destination Protocol Unreachable' | |
11005='Destination Port Unreachable' | |
11006='No Resources' | |
11007='Bad Option' | |
11008='Hardware Error' | |
11009='Packet Too Big' | |
11010='Request Timed Out' | |
11011='Bad Request' | |
11012='Bad Route' | |
11013='TimeToLive Expired Transit' | |
11014='TimeToLive Expired Reassembly' | |
11015='Parameter Problem' | |
11016='Source Quench' | |
11017='Option Too Big' | |
11018='Bad Destination' | |
11032='Negotiating IPSEC' | |
11050='General Failure' | |
} | |
# hash table with calculated property that translates | |
# numeric return value into friendly text | |
$statusFriendlyText = @{ | |
# name of column | |
Name = 'Status' | |
# code to calculate content of column | |
Expression = { | |
# take status code and use it as index into | |
# the hash table with friendly names | |
# make sure the key is of same data type (int) | |
$StatusCode_ReturnValue[([int]$_.StatusCode)] | |
} | |
} | |
# calculated property that returns $true when status -eq 0 | |
$IsOnline = @{ | |
Name = 'Online' | |
Expression = { $_.StatusCode -eq 0 } | |
} | |
# do DNS resolution when system responds to ping | |
$DNSName = @{ | |
Name = 'DNSName' | |
Expression = { if ($_.StatusCode -eq 0) { | |
if ($_.Address -like '*.*.*.*') | |
{ [Net.DNS]::GetHostByAddress($_.Address).HostName } | |
else | |
{ [Net.DNS]::GetHostByName($_.Address).HostName } | |
} | |
} | |
} | |
} | |
process | |
{ | |
# add each computer name to the bucket | |
# we either receive a string array via parameter, or | |
# the process block runs multiple times when computer | |
# names are piped | |
$ComputerName | ForEach-Object { | |
$null = $bucket.Add($_) | |
} | |
} | |
end | |
{ | |
# convert list of computers into a WMI query string | |
$query = $bucket -join "' or Address='" | |
Get-WmiObject -Class Win32_PingStatus -Filter "(Address='$query') and timeout=$TimeoutMillisec" | | |
Select-Object -Property Address, $IsOnline, $DNSName, $statusFriendlyText | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 255.255.255.0 | |
$iprange = 1..254 | ForEach-Object { "10.10.101.$_" } | |
$result = Test-OnlineFast -ComputerName $iprange | |
$result | Format-Table -AutoSize | |
# 255.255.0.0 | |
$result = $null | |
for ($i=1; $i -lt 255; $i++) { | |
$iprange = 1..254 | ForEach-Object { "10.10.$i.$_" } | |
$result += Test-OnlineFast -ComputerName $iprange | |
} | |
$result | Where-Object {$_.Status -eq 'Success'} | Sort-Object {$_.Address} | Format-Table -AutoSize |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment