Revisiting the Test-Online Fast Function In the previous tip series, we developed a new function called Test-OnlineFast that can ping multiple computers in record time....
In the previous tip series, we developed a new function called Test-OnlineFast that can ping multiple computers in record time. For some reason, the final version of this function did not include the pipeline support we promised. Here is the complete function again for you:
functionTest-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-eq0 }
}
# do DNS resolution when system responds to ping
$DNSName=@{
Name='DNSName'Expression= { if ($_.StatusCode-eq0) {
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-ClassWin32_PingStatus-Filter"(Address='$query') and timeout=$TimeoutMillisec"|Select-Object-PropertyAddress,$IsOnline,$DNSName,$statusFriendlyText
}
}
Testing Test-OnlineFast: Pinging Computers
Let’s first check how Test-OnlineFast works. Here are some examples. Let’s first ping a number of computers. You can use both computer names and IP addresses:
Let’s now ping an entire IP segment. The below example was taken from our public hotel WLAN (make sure you adjust the IP range to the network you are located in):
The amazing thing is the tremendous speed. Pinging an entire subnet takes only a few seconds.
Discover PowerShell Conference EU 2018
Do you know PowerShell Conference EU 2018, taking place April 17-20 in Hanover, Germany? If you are an advanced PowerShell professional, you shouldn’t miss this year’s agenda: www.psconf.eu: Hover over a session to view its abstract.
With 45 international top speakers including PowerShell inventor Jeffrey Snover, 80 sessions, and workshops, this event is much more than just a conference. It is a one-of-a-kind Advanced PowerShell Training and a very unique opportunity to meet friendly PowerShell gurus, get authoritative answers to even the trickiest PowerShell questions, and bring home fresh ideas.
This conference is not profit-driven, and all speakers volunteer. The delegate fee basically covers venue, food and drinks throughout the conference, evening events with grand dinner, and workshops.