数据库查找期间发生不可恢复的错误

Cha*_*ynt 7 domain-name-system powershell ping icmp

简短版本:为什么Test-Connection在不同子网上的离线主机会报告“数据库查找期间发生不可恢复的错误”?


我正在使用 PowerShell 通过Test-Connectioncmdlet 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

问题:什么“数据库查找”可能会失败?


故障排除 pt。1

我试过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 路由表。

https://technet.microsoft.com/en-us/library/cc940095.aspx


故障排除 pt。2

我使用 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-Connectioncmdlet 会抛出(对我而言)如此具有误导性的异常消息。

Cha*_*ynt 1

在我对此进行故障排除后,我的结论很简单,就是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开关(如果这对任何人都很重要);在我的测试中这没有任何区别。