2015-09-07 13 views
10

Tôi đang sử dụng PSVersion 2.0 và tôi đã tự hỏi là có tương đương với traceroute cho nó?Có một tracert tương đương PowerShell hoạt động trong phiên bản 2 không?

Tôi biết rằng trên PowerShell v4 có lệnh ghép ngắn Test-NetConnection để thực hiện tracert nhưng v2 ?! Nó có thể được thực hiện như:

Test-NetConnection "IPaddress/HOSTaname" -TraceRoute 

Cảm ơn

+1

Bạn có thể sử dụng 'tracert.exe' gốc từ PowerShell, bạn chỉ cần phân tích đầu ra của mình –

+0

Cảm ơn người đàn ông, bạn đã giúp tôi rất nhiều !!! – Sylca

Trả lời

17

Như đã đề cập trong các bình luận, bạn có thể làm của riêng "nghèo-mans-PowerShell-tracert" của bạn bằng cách phân tích các kết quả từ tracert.exe:

function Invoke-Tracert { 
    param([string]$RemoteHost) 

    tracert $RemoteHost |ForEach-Object{ 
     if($_.Trim() -match "Tracing route to .*") { 
      Write-Host $_ -ForegroundColor Green 
     } elseif ($_.Trim() -match "^\d{1,2}\s+") { 
      $n,$a1,$a2,$a3,$target,$null = $_.Trim()-split"\s{2,}" 
      $Properties = @{ 
       Hop = $n; 
       First = $a1; 
       Second = $a2; 
       Third = $a3; 
       Node = $target 
      } 
      New-Object psobject -Property $Properties 
     } 
    } 
} 

Theo mặc định, PowerShell định dạng đối tượng có từ 5 thuộc tính trở lên trong danh sách, nhưng bạn có thể nhận được kết quả giống như tracert với Format-Table:

enter image description here

+0

Bạn chắc chắn đã đi thêm dặm ở đây. Lam tôt lăm! –

+0

Cảm ơn người đàn ông! tôi đồng ý với @MikeShepard – Sylca

3

Tôi phải thừa nhận rằng tôi muốn xem liệu có ai đó đã thực hiện việc này hay không.

Bạn có thể sử dụng .Net Framework để thực hiện một không-để-nghèo-mans-traceroute như một Powershell Script

Dưới đây là một mồi, làm việc nhanh chóng, nhưng nguy hiểm. Ngoài ra, không có thống kê.

# 
# Mid-Waged-Mans-Tracert 
# 

$ping = new-object System.Net.NetworkInformation.Ping 
$timeout = 5000 
$maxttl = 64 
$address = [string]$args 
$message = [System.Text.Encoding]::Default.GetBytes("MESSAGE") 
$dontfragment = false 
$success = [System.Net.NetworkInformation.IPStatus]::Success 

echo "Tracing $address" 
for ($ttl=1;$i -le $maxttl; $ttl++) { 
    $popt = new-object System.Net.NetworkInformation.PingOptions($ttl, $dontfragment) 
    $reply = $ping.Send($address, $timeout, $message, $popt) 


    $addr = $reply.Address 
    $rtt = $reply.RoundtripTime 
    try { 
     $dns = [System.Net.Dns]::GetHostByAddress($addr) 
    } catch { 
     $dns = "-" 
    } 

    $name = $dns.HostName 

    echo "Hop: $ttl`t= $addr`t($name)" 
    if($reply.Status -eq $success) {break} 
} 

Edit:

Removed một số nguy bằng cách thêm một lệnh catch. Chỉ nguy hiểm vẫn còn hiện diện là chúng tôi chỉ gửi một yêu cầu duy nhất cho mỗi hop, điều này có nghĩa là chúng tôi không đạt được một bước nhảy do một gói giảm giá vô tội. Giải quyết vấn đề đó vẫn là một bài tập đọc. Gợi ý: (Hãy suy nghĩ về các vòng trong vòng lặp)

Tiền thưởng: Bây giờ chúng tôi cố gắng để có được mục nhập dns của mỗi hop!

+0

Cách tiếp cận "gốc" tốt, tuyệt vời! Có lẽ giải thích "nguy hiểm" có liên quan? :-) –

+1

Vâng sự nguy hiểm liên quan, là thiếu sự thừa (nếu một tin nhắn icmp duy nhất bị mất, chúng tôi không nhận được kết quả cho rằng hop nào cả) + chúng tôi đã không bắt PingException. – MrPaulch

4

Sửa một số lỗi trong phiên bản "Mid-Waged-Mans-Tracert", đã mô đun hóa và thêm một số phần tùy chỉnh. @MrPaulch có một PoC tuyệt vời.

function Invoke-Traceroute{ 
    [CmdletBinding()] 
    Param(
     [Parameter(Mandatory=$true,Position=1)] 
     [string]$Destination, 

     [Parameter(Mandatory=$false)] 
     [int]$MaxTTL=16, 

     [Parameter(Mandatory=$false)] 
     [bool]$Fragmentation=$false, 

     [Parameter(Mandatory=$false)] 
     [bool]$VerboseOutput=$true, 

     [Parameter(Mandatory=$false)] 
     [int]$Timeout=5000 
    ) 

    $ping = new-object System.Net.NetworkInformation.Ping 
    $success = [System.Net.NetworkInformation.IPStatus]::Success 
    $results = @() 

    if($VerboseOutput){Write-Host "Tracing to $Destination"} 
    for ($i=1; $i -le $MaxTTL; $i++) { 
     $popt = new-object System.Net.NetworkInformation.PingOptions($i, $Fragmentation) 
     $reply = $ping.Send($Destination, $Timeout, [System.Text.Encoding]::Default.GetBytes("MESSAGE"), $popt) 
     $addr = $reply.Address 

     try{$dns = [System.Net.Dns]::GetHostByAddress($addr)} 
     catch{$dns = "-"} 

     $name = $dns.HostName 

     $obj = New-Object -TypeName PSObject 
     $obj | Add-Member -MemberType NoteProperty -Name hop -Value $i 
     $obj | Add-Member -MemberType NoteProperty -Name address -Value $addr 
     $obj | Add-Member -MemberType NoteProperty -Name dns_name -Value $name 
     $obj | Add-Member -MemberType NoteProperty -Name latency -Value $reply.RoundTripTime 

     if($VerboseOutput){Write-Host "Hop: $i`t= $addr`t($name)"} 
     $results += $obj 

     if($reply.Status -eq $success){break} 
    } 

    Return $results 
} 
Các vấn đề liên quan