Extending Test-Connection

Using the Test-Connection in an enterprise environment, I often miss the -a parameter of the old ping command, that tells ping to try to resolve IP address to HostName.

So I sat down and created a proxy function for Test-Connection, adding a Resolve parameter. It’s quite simple actually, it’s checks the ComputerName parameter, and if the data is a valid IP address tries to resolve using the Net.Dns class. It then takes the resolved name and injects it back into the ComputerName parameter before calling the original Test-Connection command.

There is one drawback of using proxies with the same name as existing commands though, and that is that Get-Help with not work as you are used to. There is two ways of “fixing” this problem:

  1. Call Get-Help like this:
    Get-Help Test-Connection -Category Function
  2. Add the following line to your PowerShell profile:
    (Get-Command Microsoft.PowerShell.Management\Test-connection).Visibility = 'Private'

Code:


function Test-Connection {
[CmdletBinding(DefaultParameterSetName='Default', HelpUri='http://go.microsoft.com/fwlink/?LinkID=135266', RemotingCapability='OwnedByCommand')]
param(
[Parameter(ParameterSetName='Default')]
[Parameter(ParameterSetName='Source')]
[switch]
${AsJob},
[System.Management.AuthenticationLevel]
${Authentication},
[Alias('Size','Bytes','BS')]
[ValidateRange(0, 65500)]
[int]
${BufferSize},
[Parameter(Mandatory=$true, Position=0, ValueFromPipelineByPropertyName=$true)]
[Alias('CN','IPAddress','__SERVER','Server','Destination')]
[ValidateNotNullOrEmpty()]
[string[]]
${ComputerName},
[ValidateRange(1, 4294967295)]
[int]
${Count},
[Parameter(ParameterSetName='Source')]
[ValidateNotNullOrEmpty()]
[pscredential]
[System.Management.Automation.CredentialAttribute()]
${Credential},
[Parameter(ParameterSetName='Source', Mandatory=$true, Position=1)]
[Alias('FCN','SRC')]
[ValidateNotNullOrEmpty()]
[string[]]
${Source},
[System.Management.ImpersonationLevel]
${Impersonation},
[Parameter(ParameterSetName='Source')]
[Parameter(ParameterSetName='Default')]
[ValidateRange(-2147483648, 1000)]
[int]
${ThrottleLimit},
[Alias('TTL')]
[ValidateRange(1, 255)]
[int]
${TimeToLive},
[ValidateRange(1, 60)]
[int]
${Delay},
[Parameter(ParameterSetName='Quiet')]
[switch]
${Quiet},
[Parameter()]
[switch]
${Resolve})
begin
{
try {
$outBuffer = $null
if ($PSBoundParameters.TryGetValue('OutBuffer', [ref]$outBuffer))
{
$PSBoundParameters['OutBuffer'] = 1
}
if ($PSBoundParameters['Resolve']) {
$null = $PSBoundParameters.Remove('Resolve')
foreach ($item in $ComputerName) {
try {
$item -match [IPAddress]$item
[string[]]$ComputerNameEx += ([System.Net.Dns]::GetHostEntry($item)).HostName
}
catch {
[string[]]$ComputerNameEx += $item
}
}
$PSBoundParameters['ComputerName'] = $ComputerNameEx
}
$wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Microsoft.PowerShell.Management\Test-Connection', [System.Management.Automation.CommandTypes]::Cmdlet)
$scriptCmd = {& $wrappedCmd @PSBoundParameters }
$steppablePipeline = $scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin)
$steppablePipeline.Begin($PSCmdlet)
} catch {
throw
}
}
process
{
try {
$steppablePipeline.Process($_)
} catch {
throw
}
}
end
{
try {
$steppablePipeline.End()
} catch {
throw
}
}
<#
.ForwardHelpTargetName Test-Connection
.ForwardHelpCategory Cmdlet
#>
}

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s