Powershellでリモートサーバに対するL3レベルのネットワーク疎通を確認する

リモートサーバとの疎通確認をPowershellスクリプト内で行いたい場合、
"Test-Connection"コマンドレットを用いると使い勝手が良い。

基本的な使用方法

PS > Test-Connection -ComputerName "dstserver01"

Source        Destination     IPV4Address      IPV6Address                              Bytes    Time(ms)
------        -----------     -----------      -----------                              -----    --------
srcserver01   dstserver01     192.168.0.11                                              32       0
srcserver01   dstserver01     192.168.0.11                                              32       0
srcserver01   dstserver01     192.168.0.11                                              32       0
srcserver01   dstserver01     192.168.0.11                                              32       0

"-ComputerName"オプションには名前解決可能なホスト名かIPアドレスを文字列で指定する。

pingコマンドと同様に、ICMPを用いてリモートサーバとの疎通を確認するのだが、違いは結果がテキストではなくPSObjectで返却されるということ。そのため、疎通確認結果をPowershellスクリプト内で扱うことが容易になる。

通常の出力は例の如く一部情報が省略されているため、Format-Listで返却結果の全てのプロパティを参照してみる。

PS > Test-Connection -ComputerName "dstserver01" | fl *

PSComputerName                 : srcserver01
IPV4Address                    : 192.168.0.10
IPV6Address                    :
__GENUS                        : 2
__CLASS                        : Win32_PingStatus
__SUPERCLASS                   :
__DYNASTY                      : Win32_PingStatus
__RELPATH                      : Win32_PingStatus.Address="dstserver01",BufferSize=32,NoFragmentation=FALSE,RecordRou
                                 te=0,ResolveAddressNames=FALSE,SourceRoute="",SourceRouteType=0,Timeout=4000,Timestamp
                                 Route=0,TimeToLive=80,TypeofService=0
__PROPERTY_COUNT               : 24
__DERIVATION                   : {}
__SERVER                       : srcserver01
__NAMESPACE                    : root\cimv2
__PATH                         : \\srcserver01\root\cimv2:Win32_PingStatus.Address="dstserver01",BufferSize=32,NoFr
                                 agmentation=FALSE,RecordRoute=0,ResolveAddressNames=FALSE,SourceRoute="",SourceRouteTy
                                 pe=0,Timeout=4000,TimestampRoute=0,TimeToLive=80,TypeofService=0
Address                        : dstserver01
BufferSize                     : 32
NoFragmentation                : False
PrimaryAddressResolutionStatus : 0
ProtocolAddress                : 192.168.0.10
ProtocolAddressResolved        :
RecordRoute                    : 0
ReplyInconsistency             : False
ReplySize                      : 32
ResolveAddressNames            : False
ResponseTime                   : 0
ResponseTimeToLive             : 128
RouteRecord                    :
RouteRecordResolved            :
SourceRoute                    :
SourceRouteType                : 0
StatusCode                     : 0
Timeout                        : 4000
TimeStampRecord                :
TimeStampRecordAddress         :
TimeStampRecordAddressResolved :
TimestampRoute                 : 0
TimeToLive                     : 80
TypeofService                  : 0
Scope                          : System.Management.ManagementScope
Path                           : \\srcserver01\root\cimv2:Win32_PingStatus.Address="dstserver01",BufferSize=32,NoFr
                                 agmentation=false,RecordRoute=0,ResolveAddressNames=false,SourceRoute="",SourceRouteTy
                                 pe=0,Timeout=4000,TimestampRoute=0,TimeToLive=80,TypeofService=0
Options                        : System.Management.ObjectGetOptions
ClassPath                      : \\srcserver01\root\cimv2:Win32_PingStatus
Properties                     : {Address, BufferSize, NoFragmentation, PrimaryAddressResolutionStatus...}
SystemProperties               : {__GENUS, __CLASS, __SUPERCLASS, __DYNASTY...}
Qualifiers                     : {dynamic, provider}
Site                           :
Container                      :

上記の通り、結果は"Win32_PingStatus"クラスオブジェクトである。各プロパティの詳細は下記参照のこと。
Win32_PingStatus class (Windows)

疎通確認結果をシンプルにbool値で取得したい場合

Powershellスクリプト内で詳細な疎通確認結果を参照する必要が無く、単純にリモートサーバへの疎通可否をbool値で取得したい場合もある。そういった場合は、"-Quiet"オプションを付与すると良い。

PS > Test-Connection -Computername "dstserver01" -Quiet
True

上記の場合、既定の回数(4回)だけICMPエコー要求をリモートサーバへ送信し、1回でもエコー応答を受信すれば、結果としてTrueを返却する。全て応答が無ければ、Falseが返却される。リモートサーバへエコー要求を送信する回数は"-Count"オプションで変更できる。

その他の詳細情報

TechNetのコマンドレットリファレンスを参照のこと。
Test-Connection