简洁版本:为什么Test-Connection
对于不同子网上的离线主机,会报告“数据库查找期间发生不可恢复的错误”?
我正在使用 PowerShell 通过以下 cmdlet ping 远程主机Test-Connection
:
$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 控制器。我可以使用以下命令将主机名解析为 IP 地址nslookup
:
Name: computer01.domain.com
Address: 192.168.2.153
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.
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.
此消息表明存在以下两个问题之一:本地系统没有到达所需目的地的路由,或者远程路由器报告它没有到达目的地的路由...
如果消息为“回复自 < IP 地址 >:目标主机无法访问”,则路由问题发生在远程路由器上,其地址由“< IP 地址 >”字段指示。使用适当的实用程序或工具检查分配了 IP 地址 < IP 地址 > 的路由器的 IP 路由表。
故障排除第 2 部分
我使用 WireShark 查看了 ICMP 数据包。我可以看到来自此路由器的响应是:
Type: 3 (Destination unreachable)
Code: 1 (Host unreachable)
无法到达目的地由主机或其入站网关生成,以通知客户端由于某种原因无法访问目标...无法访问的 TCP 端口特别以 TCP RST 进行响应,而不是如预期的那样以“目标无法访问类型 3”进行响应。
https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol#Destination_unreachable
最后
我还单独/独立地确认目标主机已脱离网络,这解释了路由器无法“到达”目标的原因。我仍然想知道为什么 cmdlet 会Test-Connection
抛出(对我来说)如此误导性的异常消息。
答案1
谢谢分享。你让我看了文档,因为我遇到了同样的错误。
看起来这是的一个“功能” Test-Connection
;他们似乎知道这一点,因为他们提供了一种解决方法。
的帮助中Test-Connection
说,如果您希望它仅返回布尔值,则应-Quiet
在调用时使用 switch,否则它会尝试返回一个对象。以下是逐字逐句的:
使用 AsJob 参数时,此 cmdlet 将返回一个作业对象。使用 Quiet 参数时,它将返回一个布尔值。否则,此 cmdlet 将为每个 ping 返回一个 Win32_PingStatus 对象。
-Quiet
对我来说也是如此-ErrorAction SilentlyContinue
。
答案2
在我对此进行故障排除后,我的结论很简单,它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) 之间有所不同。如果这对任何人来说都很重要,那么后一个 cmdlet 确实包含一个-TimeToLive
开关;在我的测试中,它没有任何区别。