短いバージョン:なぜTest-Connection
は、別のサブネット上のオフラインホストに対して「データベースの検索中に回復不可能なエラーが発生しました」と報告するのですか?
PowerShellを使用して、Test-Connection
コマンドレットでリモートホストにpingしています。
$Computer = "COMPUTER01"
Test-Connection -ComputerName $Computer -Count 3
次のエラーメッセージが表示されます。
System.Net.NetworkInformation.PingException: Testing connection to computer
'COMPUTER01' failed: A non-recoverable error occurred during a database
lookup ---> System.ComponentModel.Win32Exception: A non-recoverable error
occurred during a database lookup.
私のDNSサーバーは、DNSサービスを実行しているすべてのWindows ADコントローラーです。 nslookup
を使用してホスト名をIPアドレスに解決できます。
Name: computer01.domain.com
Address: 192.168.2.153
MSのWebサイトは次のように述べています。
これは回復不可能なエラーです。これは、データベースのルックアップ中になんらかの回復不可能なエラーが発生したことを示します。これは、データベースファイル(たとえば、BSD互換のHOSTS、SERVICES、またはPROTOCOLSファイル)が見つからなかったか、サーバーからDNS要求が返され、重大なエラーが発生したことが原因である可能性があります。
https://msdn.Microsoft.com/en-us/library/windows/desktop/ms740668(v = vs.85).aspx
質問:どの「データベースルックアップ」が失敗する可能性がありますか?
同じホストをping
しようとしましたが、これも失敗しますが、より馴染みのあるメッセージが表示されます。
C:\> ping COMPUTER01
Pinging COMPUTER01.domain.com [192.168.2.153] with 32 bytes of data:
Reply from 192.168.0.220: Destination Host unreachable.
ターゲットIPアドレスに対してtracert
を実行すると、これが確認されます。
C:\> tracert -d 192.168.2.153
7 40 ms 40 ms 40 ms 192.168.0.220
8 192.168.0.220 reports: Destination Host unreachable.
このメッセージは、ローカルシステムに目的の宛先へのルートがないか、リモートルーターが宛先へのルートがないことを報告するという2つの問題のいずれかを示しています...
メッセージが「<IPアドレス>からの返信:宛先ホストに到達できません」である場合、「<IPアドレス>」フィールドでアドレスが示されているリモートルーターでルーティングの問題が発生しました。適切なユーティリティまたはファシリティを使用して、<IPアドレス>のIPアドレスが割り当てられているルーターのIPルーティングテーブルを確認します。
WireSharkを使用してICMPパケットを確認しました。このルーターからの応答は次のとおりです。
Type: 3 (Destination unreachable)
Code: 1 (Host unreachable)
Destination unreachableはホストまたはそのインバウンドゲートウェイによって生成され、何らかの理由で宛先に到達できないことをクライアントに通知します... Unreachable TCP ports特に期待どおりに、宛先到達不能タイプ3ではなくTCP RSTで応答します。
https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol#Destination_unreachable
また、ターゲットホストがネットワーク外にあることがわかっているという個別の/独立した確認があります。これは、ルーターがターゲットに「到達」できない理由を説明しています。なぜTest-Connection
コマンドレットがそのような誤解を招くような例外メッセージ(私にとって)をスローしたのか、まだ疑問に思っています。
私がこれに入れたトラブルシューティングの後、私の結論は、_Test-Connection
_が非常に役に立たないエラーメッセージを返しているか、ルーターから受信した "宛先ホストに到達できません"応答を誤って解釈していることです。
他の誰かがこれを見ている場合は、tracert
を実行して、ping要求への応答を返す可能性があるデバイスがルートにあるかどうかを確認することをお勧めします。
Ping以外の方法でホストがオンラインかどうかを判断する場合は、適切な健全性チェックが行われ、ホストが次の条件であるという前提でこれらのエラーを無視できるかどうか(_-ErrorAction
_を使用)を確認できるオフライン:
_$Computer = "COMPUTER01"
if(Test-Connection -ComputerName $Computer -Count 1 -ErrorAction SilentlyContinue) {
"Online"
} else {
"Offline"
}
_
補足として、ping
と_Test-Connection
_の唯一の違いは、ICMPパケットの存続可能時間(TTL)がping
(128)で異なることでした。および_Test-Connection
_(80)。後者のコマンドレットには、_-TimeToLive
_スイッチが含まれていることが重要です。私のテストでは何の違いもありませんでした。
共有いただきありがとうございます。私が同じエラーを抱えていたので、あなたは私にドキュメントを見させました。
これはTest-Connection
の「機能」のようです。彼らは回避策を提供するので、これについて知っているようです。
Test-Connection
のヘルプでは、ブール値のみを返す場合は、-Quiet
スイッチを使用してオブジェクトを返そうとする必要があります。ここでは逐語的です:
AsJobパラメーターを使用すると、コマンドレットはジョブオブジェクトを返します。 Quietパラメータを使用すると、ブール値が返されます。それ以外の場合、このコマンドレットは、pingごとにWin32_PingStatusオブジェクトを返します。
したがって、-Quiet
ではなく-ErrorAction SilentlyContinue
が私のためです。