Click here to monitor SSC
SQLServerCentral is supported by Red Gate Software Ltd.
 
Log in  ::  Register  ::  Not logged in
 
 
 

Kyle Neier

Kyle has been working with computers professionally since 1995 in both a development and administrative capacity. For over 10 of those years, SQL Server has been the focus of both a professional and personal passion. Kyle has worked in online retail, manufacturing, EMR software, and pharmaceutical industries. Kyle joined PTI in 2011 as a Senior Microsoft Consultant where he continues to chase his passion of automating DBA processes and doing everything humanly possible to prevent the 0200 page. Kyle serves as the Vice-President of the Indianapolis chapter of PASS (www.indypass.org) and served on the committee to bring SQL Saturday to Indianapolis. He shares his passion for SQL Server with others through speaking and mentoring at local and regional events.

Powershell – Validating an IP Address

 

A task that I have had to do several times over the years is determine if an IP Address string entered from a prompt or imported from a file is indeed valid. Even more, determining if that IP Address is in use once verifying that the IP Address is well formed.

I’ve created the following Powershell function – Test-IPAddressString – to handle both of these tasks.

Either provide a single or several IP Address candidates to this function and it will return a $true if it is valid or a $false if it is not. As an added bonus, if you enable the –FailIfInUse swtich,the function will attempt to ping a valid IP Address. If the address responds to a ping, $false is returned.

function Test-IPAddressString
{
<#
.SYNOPSIS
Tests to see if an IP address string is a valid address and can determine
if IP Address is responding on network.

.DESCRIPTION
Implements the .Net.IPAddress classes to validate that the string provided
can parse into an IP Address. If the parse is successful, the function returns
boolean $true unless the -FailIfInUse switch is provided.

If -FailIfInUse is specified, a $true is only returned if the IP Address
does not respond to a ping three times.

This function supports the -Verbose switch as well.

.PARAMETER IPaddressString
This is a string value representing the address that you want to test.

This value can be passed either from pipeline or as a parameter.

.PARAMETER FailIfInUse
This is a switch parameter. Specifying this in the parameter list will
cause the IP Address, if successfully parsed, to attempt to be pinged.

A successful ping result will result in a $false value being returned
if this switch is used.


.EXAMPLE
Test-IPAddressString -IPAddressString "192.168.1.1"

Using full parameter name

.EXAMPLE
Test-IPAddressString "192.168.1.1" -FailIfInUse

Using Positional parameters and specifiying to fail test if IP Address responds to ping.

.EXAMPLE
("192.168.1.1", "192.123456", "IsThisAnIP") | Test-IPAddressString -Verbose

Passing serveral potential IP Address strings to the function through the pipeline.

FailIfInUse is ommitted, so no ping attempts will be made on valid IP Addresses.

This function supports the verbose switch. Using this switch will provide you with
several indicators of progress through the process.

.NOTES

Author: Kyle Neier
Blog: http://sqldbamusings.blogspot.com
Twitter: Kyle_Neier

.LINK
http://sqldbamusings.blogspot.com/2012/04/powershell-validating-ip-address.html
#>

param(
[parameter(
Mandatory
=$true,
Position
=0,
ValueFromPipeline
= $true
)]
[
string]$IPaddressString,
[parameter(
Mandatory
=$false,
Position
=1,
ValueFromPipeline
= $false
)]
[
switch]$FailIfInUse
)

process
{
[
System.Net.IPAddress]$IPAddressObject = $null
if([System.Net.IPAddress]::tryparse($IPaddressString,[ref]$IPAddressObject) -and
$IPaddressString -eq $IPAddressObject.tostring())
{
Write-Verbose "$IPaddressString successfully parsed."
if($FailIfInUse -eq $true)
{
$Pinger = new-object System.Net.NetworkInformation.Ping
$p = 1
$p_max = 3
do
{
Write-Verbose "Attempting to ping $IPaddressString - Attempt $p of $p_max"
$PingResult = $Pinger.Send("$IPaddressString")
Write-Verbose "Connection Result: $($PingResult.Status)"
$p++
Start-Sleep -Milliseconds 500

}
until ($PingResult.Status -eq "Success" -or $p -gt $p_max)

if($PingResult.Status -eq "Success")
{
Write-Verbose "The IP Address $IPAddressString parsed successfully but is responding to ping."
Write-Output $false
}
else
{
Write-Verbose "The IP Address $IPAddressString parsed successfully and is not responding to ping."
Write-Output $true
}
}
else
{
Write-Verbose "The IP Address $IPAddressString parsed successfull - No ping attempt made."
Write-Output $true
}

}
else
{
Write-Verbose "The IP Address $IPAddressString could not be parsed."
Write-Output $false
}
}
}

About Kyle Neier
Husband of a magnificent woman, father of 5, SQL Server geek, IndyPASS Vice President and Food Guy, DBA automation zealot, amateur Powershell evangelist. Follow Me on Twitter

Comments

Leave a comment on the original post [sqldbamusings.blogspot.com, opens in a new window]

Loading comments...