ネットワーク内の全端末にPowerShellでPingをしてみる

こんにちは、こんばんは、テトリです。

私の仕事のなかで色々なネットワーク内の状況を調べる事があるのですが
ネットワーク内の全部の端末にPingで応答を調べたいときに使っている方法を紹介します。

会社や自分の家のネットワークのIPアドレス192.168.0.1から254までの範囲で何が使用されているかを調べたい時があると思います。
そんなときにPing 192.168.0.1を実行して、終わったらPing 192.168.0.2という形で繰り返すと大変です。
このような場合にフリーのツールで「Advanced IP Scanner v2」という優れたツールもあるのですが、アプリのインストールが必要なのでインストールできない場合には困ってしまいます。

そこでWindows10やWindows11で標準インストールされているWindows PowerShell 5.1を使った方法を紹介します。

調べる範囲が192.168.0.xxxならコードをコピーして、Windows PowerShellに右クリックで貼り付けてコードを実行してみてください。
IPアドレスが192.168.0.xxxじゃ無い場合は面倒ですがメモ帳などに一度コピーして最初の方の “192.168.0.$_” の部分を書き換えてからPowerShellにコピペください。

Invoke-Command {
$job = (1..254|ForEach-Object {"192.168.0.$_"}|
ForEach-Object {Test-connection $_ -count 1 -asjob})

While (((Get-Job $Job.Id).State -ne "Completed").count -gt 0) {
Write-Host "Job Running.."
Start-Sleep 1
}
Get-Job -Command "Test-Connection"|
ForEach-Object {Receive-job $_;Remove-Job $_}|
Select-Object Address,ResponseTime
}

実行結果は以下のような感じで”Job Running..”が数秒表示された後にIPアドレスと応答時間が並ぶようなシンプルな感じで出ます。(TimeoutしたIPは応答時間が無しになります。)

Job Running..
Job Running..
Job Running..
Job Running..
Address ResponseTime
------- ------------
192.168.0.1 3
192.168.0.2
192.168.0.3 5
192.168.0.4

コードの内容についてはTest-Connectionの-asjobオプションを使ってバックグラウンドで一気にPingを並列実行するという手法を使っています。

ただ-asjobオプションがPowerShell7では廃止されているのでこのコードは使えません。
PowerShell7では正式に並列処理が実装されたのでStart-ThreadJobを使った形に書き換える必要があります。この辺は機会があれば紹介しようかなと思います。

この方法なら254個のIPを調べるのに5秒~20秒ぐらいで普通にPingを連続で打ち込んでいくのに比べてかなり高速なので自分でも重宝しています。

上記のようなPowerShellの-asjobを使ったping例が見当たらなかったので紹介しました。

PowerShellはWindows標準ツールですが活用すると役に立ちますので是非使ってみる事をお勧めします。



One thought on “ネットワーク内の全端末にPowerShellでPingをしてみる

コメントを残す