需要咨询哪种方法更适合应用于脚本。 接下来是我的问题:我在 PoSh 上编写 Windows 窗体。其中一项功能是扫描可用端口。我尝试两种方法:
结果应输入到 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 ========------#>