如何使用PowerShell检查开放端口?

时间:2013-10-06 20:54:23

标签: powershell port network-scan

我想编写一个脚本来检查radom IP或主机名,看看端口是否打开。这是我到目前为止所拥有的。脚本名称是checkports。

foreach ($xhost in $computername){
    Write-Host $xhost
    foreach ($port in $ports) {
        $Socket = New-Object System.Net.Sockets.TCPClient            
        $Connection = $Socket.BeginConnect($xhost,$port,$null,$null) 

        $Connection.AsyncWaitHandle.WaitOne(5000,$false) | out-null

        if ($Connection -eq $true)
            { write-host = "$xhost port $port is open" }
        else
            { write-host = "port $port is closed" }      

        $Socket.EndConnect($Connection)
        $Socket.Close()
   }
}

我想以下列方式输入值: 。\ checkport'192.186.1.5' 要么 '192.168.1.5','192.168.1.105',192.168.1.110'| checkport

它似乎没有读取IP地址或显示结果。

我想知道是否有人可以指出可以告诉我这个脚本我做错了什么?

1 个答案:

答案 0 :(得分:1)

我已经能够使用Boe Prox的'Test-Port'功能进行类似的扫描/报告功能,代码可以在PoshCode上找到:

http://poshcode.org/2514

当我需要测试目录运行状况的端口时,我构建了一个带有'port'和'protocol'列的csv,然后为每个要检查的端口添加了端口号/协议。这在以下脚本中使用:

. .\test-port.ps1

$computersToCheck = get-content .\computers.txt
$portList = Import-CSV .\portList.csv

foreach($entry in $portList)
{
    $testPortParams = @{
        port = $($entry.port)
    }   
    if( $($entry.protocol) -eq "tcp")
    { $testPortParams += @{ TCP = $true } }
    else
    { $testPortParams += @{ UDP = $true } }

    $outLog = "portTest-$($entry.port)-$($entry.protocol).txt"

    $computersToCheck | 
        Test-Port @testPortParams |
        Sort-Object -Property open,name -descending | 
        format-table -auto -outVariable status
    Add-Content -path $outLog -value $status 
}

您当然可以构建一个支线脚本来构建要扫描的IP地址和端口范围。