Public/Network/Connectivity/Test-NetworkPort.ps1
<# .DESCRIPTION A script to test if a TCP or UDP port is open. #> function Test-NetworkPort { [CmdletBinding(DefaultParameterSetName = 'TCP')] [OutputType([System.Management.Automation.PSCustomObject])] param ( [Parameter(Mandatory)] [string]$ComputerName, [Parameter(Mandatory)] [int]$Port, [Parameter()] [ValidateSet('TCP', 'UDP')] [string]$Protocol = 'TCP', [Parameter(ParameterSetName = 'TCP')] [int]$TcpTimeout = 1000, [Parameter(ParameterSetName = 'UDP')] [int]$UdpTimeout = 1000 ) process { if ($Protocol -eq 'TCP') { $TcpClient = New-Object System.Net.Sockets.TcpClient $Connect = $TcpClient.BeginConnect($ComputerName, $Port, $null, $null) $Wait = $Connect.AsyncWaitHandle.WaitOne($TcpTimeout, $false) if (!$Wait) { $TcpClient.Close() } else { $TcpClient.EndConnect($Connect) $TcpClient.Close() $result = $true } $TcpClient.Close() $TcpClient.Dispose() } elseif ($Protocol -eq 'UDP') { $UdpClient = New-Object System.Net.Sockets.UdpClient $UdpClient.Client.ReceiveTimeout = $UdpTimeout $UdpClient.Connect($ComputerName, $Port) $a = New-Object system.text.asciiencoding $byte = $a.GetBytes("$(Get-Date)") [void]$UdpClient.Send($byte, $byte.length) #IPEndPoint object will allow us to read datagrams sent from any source. Write-Verbose "$($MyInvocation.MyCommand.Name) - Creating remote endpoint" $remoteendpoint = New-Object system.net.ipendpoint([system.net.ipaddress]::Any, 0) try { #Blocks until a message returns on this socket from a remote host. Write-Verbose "$($MyInvocation.MyCommand.Name) - Waiting for message return" $receivebytes = $UdpClient.Receive([ref]$remoteendpoint) [string]$returndata = $a.GetString($receivebytes) If ($returndata) { $result = $true } } catch { Write-Error "$($MyInvocation.MyCommand.Name) - '$ComputerName' failed port test on port '$Protocol`:$Port' with error '$($_.Exception.Message)'" } $UdpClient.Close() $UdpClient.Dispose() } if ($result) { $true } else { $false } } } |