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; }
    }