Cha*_*ynt 7 domain-name-system powershell ping icmp
简短版本:为什么Test-Connection
在不同子网上的离线主机会报告“数据库查找期间发生不可恢复的错误”?
我正在使用 PowerShell 通过Test-Connection
cmdlet ping 远程主机:
$Computer = "COMPUTER01"
Test-Connection -ComputerName $Computer -Count 3
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息:
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.
Run Code Online (Sandbox Code Playgroud)
我的 DNS 服务器都是运行 DNS 服务的 Windows AD 控制器。我能够使用nslookup
以下方法将主机名解析为 IP 地址:
Name: computer01.domain.com
Address: 192.168.2.153
Run Code Online (Sandbox Code Playgroud)
MS 网站说如下:
这是一个不可恢复的错误。这表明在数据库查找期间发生了某种不可恢复的错误。这可能是因为找不到数据库文件(例如,与 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.
Run Code Online (Sandbox Code Playgroud)
运行tracert
目标 IP 地址确认了这一点:
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.
Run Code Online (Sandbox Code Playgroud)
此消息指示两个问题之一:本地系统没有到所需目的地的路由,或者远程路由器报告它没有到目的地的路由...
如果消息是“Reply From < IP address >:Destination Host Unreachable”,则路由问题发生在远程路由器上,其地址由“<IP address>”字段指示。使用适当的实用程序或工具检查分配了 < IP 地址 > 的 IP 地址的路由器的 IP 路由表。
我使用 WireShark 查看了 ICMP 数据包。我可以看到这个路由器的响应是:
Type: 3 (Destination unreachable)
Code: 1 (Host unreachable)
Run Code Online (Sandbox Code Playgroud)
Destination unreachable由主机或其入站网关生成,以通知客户端由于某种原因无法到达目标...... Unreachable TCP 端口特别响应 TCP RST 而不是 Destination Unreachable type 3,正如预期的那样。
https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol#Destination_unreachable
我也有单独/独立的确认目标主机已知不在网络上,这解释了路由器无法“到达”目标的原因。我仍然想知道为什么Test-Connection
cmdlet 会抛出(对我而言)如此具有误导性的异常消息。
在我对此进行故障排除后,我的结论很简单,就是Test-Connection
返回一条非常无用的错误消息和/或误解从路由器收到的“目标主机无法访问”响应。
如果其他人看到此情况,我建议运行 atracert
来确认路由中是否有任何设备可能返回对 ping 请求的响应。
如果您有除 ping 之外的任何方法来确定主机是否在线,这将进行良好的健全性检查,并帮助您确定是否可以-ErrorAction
在主机离线的情况下忽略这些错误(使用 ):
$Computer = "COMPUTER01"
if(Test-Connection -ComputerName $Computer -Count 1 -ErrorAction SilentlyContinue) {
"Online"
} else {
"Offline"
}
Run Code Online (Sandbox Code Playgroud)
附带说明一下,ping
和之间的唯一区别Test-Connection
似乎是 ICMP 数据包的生存时间 (TTL) 在ping
(128) 和Test-Connection
(80) 之间不同。后一个 cmdlet 确实包含一个-TimeToLive
开关(如果这对任何人都很重要);在我的测试中这没有任何区别。
归档时间: |
|
查看次数: |
15043 次 |
最近记录: |