当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 使用 Test-ConnectionLocalSubnet (ping,arp) 查明主机是否确实已关闭

作者:精品下载站 日期:2024-12-14 07:23:45 浏览:14 分类:玩电脑

使用 Test-ConnectionLocalSubnet (ping,arp) 查明主机是否确实已关闭


Ping 是检查计算机是否可用的可靠方法吗?意见不一……这篇博文主要是关于 ping 和 arp。当然是使用 PowerShell。即将推出的脚本可以帮助您确定主机是否真正启动。记住 Windows 防火墙。如果 ping 不成功,这实际上意味着什么?楼主挂了?不是真的……让我们深入探讨……

介绍

执行 ping 操作的方法有很多种。有超级 ping、“正常”ping、其他 ping ?,最后是 PowerShell cmdlet Test-Connection 和 Test-NetConnection。以上只能告诉你ping是否成功。但他们不会告诉你主机是否启动。

[玩转系统] 使用 Test-ConnectionLocalSubnet (ping,arp) 查明主机是否确实已关闭

目标

上周我有一个主意。我的一些想法对我来说是危险的,因为我知道将它们付诸实践会给我带来很多工作——但也会带来快乐。这个想法绝对是危险的;-)。我的想法是创建一个函数来告诉我 ping 成功或失败的原因。所以,ARP就必须发挥作用了。

只有当 ping 失败但相应的 ARP 请求成功时,才可以确定目标主机已启动!前提是两者位于同一子网中。

回到我的想法:为什么不创建一个函数来向我展示这种行为呢?这里是:

主机已启动(ICMP 和 ARP 成功)

[玩转系统] 使用 Test-ConnectionLocalSubnet (ping,arp) 查明主机是否确实已关闭

防火墙可能阻止流量(ARP 成功,但 ICMP 失败)

[玩转系统] 使用 Test-ConnectionLocalSubnet (ping,arp) 查明主机是否确实已关闭

主机在子网之外(ICMP 成功,ARP 不成功)

可以 ping 通子网之外的主机。这意味着 ICMP 成功而 ARP 不成功,因为源主机将向其默认网关发送 ICMP Echo 请求。我对 cnn.com 的 IP 地址执行 ping 操作,该地址绝对不在我的子网中。

[玩转系统] 使用 Test-ConnectionLocalSubnet (ping,arp) 查明主机是否确实已关闭

主机关闭(ICMP、ARP 故障)

[玩转系统] 使用 Test-ConnectionLocalSubnet (ping,arp) 查明主机是否确实已关闭

哦,趁我忘了:这是函数。 ?

功能测试-ConnectionLocalSubnet

如果您喜欢,请复制 PowerShell ISE 会话中的代码。

function Test-ConnectionLocalSubnet {
param ([Parameter(Mandatory=$True,Position=1)]
[System.Net.IPAddress]$IPAddress)
arp -d
$entry= Write-Host "Testing $IPAddress ..."
$line="_____________________________________________________________"
$ping=Test-Connection -ComputerName $IPAddress -Count 3 -Quiet
$arp=[boolean](arp -a | Select-String "$IPAddress")
If ($ping -and $arp)
{$line; Write-Host "ICMP: successful" -ForegroundColor Green`n; Write-Host "ARP : successful" -ForegroundColor Green`n; $line; Write-Host "Host ${IPAddress} is up" -ForegroundColor Green; Write-Host ""}
elseif ($ping -and !$arp)
{$line; Write-Host "ICMP: successful" -ForegroundColor Green`n; Write-Host "ARP : failure" -ForegroundColor Red`n; $line; Write-Host "Host ${IPAddress} is up, but possibly not on local subnet"; Write-Host ""}
elseif (!$ping -and $arp)
{$line; Write-Host "ICMP: failure" -ForegroundColor Red`n; Write-Host "ARP : successful" -ForegroundColor Green`n; $line; Write-Host "Possible Cause on ${IPAddress}: Windows Firewall is blocking traffic"; Write-Host ""}
else
{$line; Write-Host "ICMP: failure" -ForegroundColor Red`n; Write-Host "ARP : failure" -ForegroundColor Red`n; $line; Write-Host "Host ${IPAddress} is down" -ForegroundColor Red; Write-Host ""
}
}

注意事项:

  • 这是在 PowerShell 5.1 上测试的
  • 您只能使用 IP 地址(参数:IPAddress),不能使用主机名
  • 该脚本用于测试本地子网内主机的可达性,也可以测试自己子网外的主机

使其永久化

在 C:\Program Files\Windows PowerShell\Modules 中创建一个文件夹。将文件夹命名为 Test-ConnectionLocalSubnet。将脚本保存为 psm1 文件。 确保目录名和文件名相同。

[玩转系统] 使用 Test-ConnectionLocalSubnet (ping,arp) 查明主机是否确实已关闭

关闭 Windows PowerShell。再次打开 PowerShell。该命令现在可供所有用户使用。

[玩转系统] 使用 Test-ConnectionLocalSubnet (ping,arp) 查明主机是否确实已关闭

有关 Powershell 模块的更多信息,请参见:PowerShell 函数:如何创建您的第一个 PowerShell 模块命令

享受 Test-ConnectionLocalSubnet 带来的乐趣!

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯