扫描端口结果添加到DataGridView。 PowerShell

问题描述 投票:0回答:0

需要咨询哪种方法更适合应用于脚本。 接下来是我的问题:我在 PoSh 上编写 Windows 窗体。其中一项功能是扫描可用端口。我尝试两种方法:

  1. 测试网络连接
  2. System.Net.Sockets.TcpClient.

结果应输入到 DataGridView 区域,有 3 列:Remote Address、Remote Port、Status(Connected)。 如果在Test-Connection 方法中打开的端口没有任何问题。一切都很好。 在打开端口的方法 System.Net.Sockets.TcpClient 中,我没有收到 Status(Connected)。 这是第一个问题。

如果端口关闭,在 Test-Connection 方法中,当 ping 步骤开始时,所有脚本都冻结。不得不强行终止PoSh。 在方法 System.Net.Sockets.TcpClient 中保存打开端口的问题(不接收状态(已连接)端口)。

那么,我很感兴趣哪种方法更好用,以及如何解决出现的问题?

部分代码出现以下问题:

$Portlist = [System.Collections.ArrayList]::new()
<#------======== DataGrid Result Port Scan ========------#>
$DataGridResultScan = New-Object System.Windows.Forms.DataGridView
$DataGridResultScan.Location = '225,30'
$DataGridResultScan.Size = '400,130'
$DataGridResultScan.AutoSize = $true
$DataGridResultScan.AutoSizeColumnsMode = 'AllCells'
$DataGridResultScan.AutoSizeRowsMode = 'AllCells'
$CommonForm.Controls.Add($DataGridResultScan)
<#------======== DataGrid Result Port Scan ========------#>
<#------======== Button Port Scan ========------#>
$ButtonPortScan = New-Object System.Windows.Forms.Button
$ButtonPortScan.Location = '400, 5'
$ButtonPortScan.Text = 'Check'
$ButtonPortScan.AutoSize = $true
$ButtonPortScan.add_Click({
                if (($ListboxListeServers.SelectedItem -ne $null) -and ($TextBoxPortScan.Text -eq '')){                
                    $SelectedServer = $ListboxListeServers.SelectedItem.ToString()
                    foreach ($NetworkPort in $NetworkPorts){
                             $listBoxResultScan.BeginUpdate()
                             $Result = New-Object System.Net.Sockets.TcpClient
                             $Result.Connect($SelectedServer,$NetworkPort)
                             $ScanPortStatus = "Имя хоста:"+ " "+ $SelectedServer + $t +"Адрес :" + " "+([System.Net.DNS]::GetHostAddresses($SelectedServer)).IpAddressToString +  $t + "Порт :" + " " + $NetworkPort + $t + "Статус :" + " " + $Result.Client.Connected
                             $listBoxResultScan.Items.Add($ScanPortStatus)
                             $listBoxResultScan.EndUpdate()
                             Start-Sleep -Seconds 1
                     }
                 }
                 elseif (($ListboxListeServers.SelectedItem -ne '') -and ($TextBoxPortScan.Text -ne '')){
                        $SelectedServer = $ListboxListeServers.SelectedItem
                        $SelectedPorts = $TextBoxPortScan.Text -split ','
                        foreach ($SelectedPort in $SelectedPorts){
**<#---- Here is the first Method ----#>**
                        #$Portlist.AddRange(@(Test-NetConnection -ComputerName $SelectedServer -Port $SelectedPort -WarningAction SilentlyContinue -ErrorAction SilentlyContinue | select ComputerName,RemoteAddress,RemotePort,TcpTestSucceeded))
**<#---- Here is the Second Method ----#>**
                                $Portlist.AddRange(@(New-Object System.Net.Sockets.TcpClient($SelectedServer, $SelectedPort) | select @{Label = 'Remote Address';E={$_.Client.RemoteEndPoint.Address}}, @{Label = 'Remote Port';Expression = {$_.Client.RemoteEndPoint.Port}},@{Label = 'Connected';E = {$_.Client.Connected}}))
                                $DataGridResultScan.DataSource = $null
                                $DataGridResultScan.DataSource = $Portlist
                                Start-Sleep -Seconds 1                            
                         }
                 }
})
$CommonForm.Controls.Add($ButtonPortScan)
<#------======== Button Port Scan ========------#>
powershell winforms datagrid port tcpclient
© www.soinside.com 2019 - 2024. All rights reserved.