使用PowerShell探测远程主机的开放端口范围
使用PowerShell高效检查指定主机的开放端口
单端口/少量端口检查
直接使用Test-NetConnection命令即可快速验证单个或少量端口的连通性,语法简单直观:
Test-NetConnection 目标IP或主机名 -Port 端口号
执行后会返回端口的连通状态、往返延迟等详细信息,适合快速验证特定端口。
大范围端口高效检查
如果需要扫描大量端口,循环调用Test-NetConnection会因同步执行导致效率极低,推荐使用.NET的TcpClient类实现异步批量检测,通过并发连接大幅提升扫描速度。以下是实用的脚本示例:
function Test-OpenPorts { param( [Parameter(Mandatory=$true)] [string]$ComputerName, [Parameter(Mandatory=$true)] [int[]]$PortRange, [int]$Timeout=1000 ) # 创建异步检测任务 $tasks = $PortRange | ForEach-Object { $port = $_ [System.Threading.Tasks.Task]::Run({ try { $client = New-Object System.Net.Sockets.TcpClient # 异步连接并等待超时 if ($client.ConnectAsync($ComputerName, $port).Wait($Timeout)) { [PSCustomObject]@{ Port = $port; Status = "开放" } } else { [PSCustomObject]@{ Port = $port; Status = "关闭/超时" } } } catch { [PSCustomObject]@{ Port = $port; Status = "连接错误" } } finally { $client.Dispose() } }) } # 等待所有任务完成并返回结果 [System.Threading.Tasks.Task]::WaitAll($tasks) $tasks.Result | Where-Object { $_.Status -eq "开放" } } # 使用示例:扫描192.168.1.1的1-1000端口,超时时间500毫秒 Test-OpenPorts -ComputerName "192.168.1.1" -PortRange (1..1000) -Timeout 500
这个脚本会异步发起所有端口的连接请求,无需等待单个端口检测完成再进行下一个,能显著提升大范围端口扫描的效率。你可以根据需求调整Timeout参数,平衡扫描速度和准确性。
内容的提问来源于stack exchange,提问作者Rafael Borja
相关产品推荐
相关产品推荐

