简短版本: 为什么Test-Connection报告“在数据库查找过程中出现不可恢复的错误”,以便在不同子网上的脱机主机上运行?
我使用PowerShell通过Test-Connection cmdlet来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将主机名parsing为IP地址:
Name: computer01.domain.com Address: 192.168.2.153
MS网站上说:
这是一个不可恢复的错误。 这表明在数据库查找期间发生了某种不可恢复的错误。 这可能是因为无法find数据库文件(例如,兼容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.
此消息指出两个问题之一:本地系统没有路由到所需的目标,或远程路由器报告它没有路由到目标…
如果消息是“Reply From <IP address>:Destination Host Unreachable”,则路由问题发生在远程路由器,其地址由“<IP address>”字段指示。 使用相应的实用程序或工具来检查分配有IP地址<IP地址>的路由器的IP路由表。
https://technet.microsoft.com/en-us/library/cc940095.aspx
我看了一下使用WireShark的ICMP数据包。 我可以看到这个路由器的响应是:
Type: 3 (Destination unreachable) Code: 1 (Host unreachable)
目标不可达由主机或其入站网关生成,以通知客户端由于某种原因目标无法访问。无法访问的TCP端口值得注意的是,使用TCP RST进行响应,而不是可能出现的目标无法访问types3。
https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol#Destination_unreachable
我也有单独/独立的确认,目标主机已知不在networking中,这就解释了为什么路由器无法“到达”目标。 我仍然想知道为什么Test-Connection cmdlet会抛出对我来说这样一个误导性的exception消息。
在解决这个问题之后,我的结论就是Test-Connection返回一个非常没有帮助的错误信息和/或曲解从路由器收到的“Destination host unreachable”响应。
如果其他人看到这个,我会build议运行一个tracert来确认路由器中是否有可能返回ping请求的设备。
如果您有任何其他方法来确定主机是否联机,那么将会进行良好的完整性检查,并帮助您确定是否可以忽略这些错误(使用-ErrorAction ),假设主机处于脱机状态:
$Computer = "COMPUTER01" if(Test-Connection -ComputerName $Computer -Count 1 -ErrorAction SilentlyContinue) { "Online" } else { "Offline" }
作为一个方面说明, ping和Test-Connection的唯一区别似乎是ping (128)和Test-Connection (80)之间的ICMP数据包的生存时间(TTL)不同。 后者的cmdlet确实包含一个-TimeToLive开关,如果这对任何人都很重要; 在我的testing中没有任何区别。
感谢分享。 你让我看看文档,因为我有同样的错误。
看起来这是Test-Connection的“特征” 他们似乎知道这个,因为他们提供了一个解决方法。
Test-Connection的帮助说,如果你想它只返回一个布尔值,你应该使用-Quiet开关时,否则它会尝试返回一个对象。 这是逐字的:
当您使用AsJob参数时,该cmdlet将返回一个作业对象。 当你使用Quiet参数时,它返回一个布尔值。 否则,此cmdlet将为每个ping返回一个Win32_PingStatus对象。
所以-Quiet这对我来说是-Quiet ,而不是-ErrorAction SilentlyContinue 。