Trace.ps1
<#PSScriptInfo .VERSION 1.0 .GUID 2bac578f-e37e-45e4-b231-0c3889a92fb4 .AUTHOR saw-friendship .COMPANYNAME .COPYRIGHT .TAGS .LICENSEURI .PROJECTURI .ICONURI .EXTERNALMODULEDEPENDENCIES .REQUIREDSCRIPTS .EXTERNALSCRIPTDEPENDENCIES .RELEASENOTES #> <# .DESCRIPTION Fast alternate tracert.exe Based on http://snoj.us/75/traceroute-with-starting-ttls/ #> param( $HostAddress, [switch]$ResolveDNS, [int]$BeginHop = 1, [int]$EndHop = 31, [int]$timeout = 1000 ) [string[]]$DefaultProperties = @('Hop','Address','RoundtripTime') if($ResolveDNS) {$DefaultProperties += 'Hostname'} $PSPropertySet = New-Object System.Management.Automation.PSPropertySet DefaultDisplayPropertySet,$DefaultProperties $PSStandardMembers = [System.Management.Automation.PSMemberInfo[]]$PSPropertySet if(!($HostAddress -as [ipaddress])){ $HostIP = [net.dns]::GetHostEntry($HostAddress).AddressList | Get-Random if(!$HostIP){write-error "Not resolved dns address"; break} }else{ $HostIP = [ipaddress]$HostAddress } for($i = $BeginHop; $i -le $EndHop; $i++) { $PingReply = $Null $Ping = new-object System.Net.NetworkInformation.Ping; $PingOptions = new-object System.Net.NetworkInformation.PingOptions $i, $true; $sendbytes = @([byte][char]'a'..[byte][char]'z'); $PingReply = $Ping.Send($HostIP, $timeout, $sendbytes, $PingOptions); $rtn = [pscustomobject][ordered]@{ "Hop" = [string]$i; "TTL" = [string]$PingReply.Options.ttl; "Address" = $PingReply.Address; "RoundtripTime" = $PingReply.RoundtripTime; "Status" = $PingReply.Status; } try { if($ResolveDNS) { if($PingReply.Address -as [ipaddress]){ Add-Member -InputObject $rtn -MemberType NoteProperty -Name Hostname -Value ([net.dns]::GetHostEntry($PingReply.Address).hostname) } } } catch{} Add-Member -InputObject $rtn -MemberType MemberSet -Name PSStandardMembers -Value $PSStandardMembers $rtn; if($PingReply.Address -eq $HostIP) { break; } } |