Public/Test-CWAAPort.ps1
function Test-CWAAPort { [CmdletBinding()] [Alias('Test-LTPorts')] Param( [Parameter(ValueFromPipelineByPropertyName = $true, ValueFromPipeline = $True)] [string[]]$Server, [Parameter(ValueFromPipelineByPropertyName = $true)] [int]$TrayPort, [Parameter(ValueFromPipelineByPropertyName = $true)] [switch]$Quiet ) Begin { $Mediator = 'mediator.labtechsoftware.com' function Private:TestPort { Param( [parameter(Position = 0)] [string] $ComputerName, [parameter(Mandatory = $False)] [System.Net.IPAddress] $IPAddress, [parameter(Mandatory = $True , Position = 1)] [int] $Port ) $RemoteServer = if ([string]::IsNullOrEmpty($ComputerName)) { $IPAddress } else { $ComputerName }; if ([string]::IsNullOrEmpty($RemoteServer)) { Write-Error "ERROR: Line $(LINENUM): No ComputerName or IPAddress was provided to test."; return } $test = New-Object System.Net.Sockets.TcpClient; Try { Write-Output "Connecting to $($RemoteServer):$Port (TCP).."; $test.Connect($RemoteServer, $Port); Write-Output 'Connection successful'; } Catch { Write-Output 'ERROR: Connection failed'; $Global:PortTestError = 1 } Finally { $test.Close(); } } Clear-Variable CleanSvr, svr, proc, processes, port, netstat, line -EA 0 -WhatIf:$False -Confirm:$False #Clearing Variables for use Write-Debug "Starting $($myInvocation.InvocationName) at line $(LINENUM)" } Process { if (-not ($Server) -and (-not ($TrayPort) -or -not ($Quiet))) { Write-Verbose 'No Server Input - Checking for names.' $Server = Get-CWAAInfo -EA 0 -Verbose:$False -WhatIf:$False -Confirm:$False -Debug:$False | Select-Object -Expand 'Server' -EA 0 if (-not ($Server)) { Write-Verbose 'No Server found in installed Service Info. Checking for Service Backup.' $Server = Get-CWAAInfoBackup -EA 0 -Verbose:$False | Select-Object -Expand 'Server' -EA 0 } } if (-not ($Quiet) -or (($TrayPort) -ge 1 -and ($TrayPort) -le 65530)) { if (-not ($TrayPort) -or -not (($TrayPort) -ge 1 -and ($TrayPort) -le 65530)) { #Learn LTTrayPort if available. $TrayPort = (Get-CWAAInfo -EA 0 -Verbose:$False -WhatIf:$False -Confirm:$False -Debug:$False | Select-Object -Expand TrayPort -EA 0) } if (-not ($TrayPort) -or $TrayPort -notmatch '^\d+$') { $TrayPort = 42000 } [array]$processes = @() #Get all processes that are using LTTrayPort (Default 42000) Try { $netstat = & "$env:windir\system32\netstat.exe" -a -o -n | Select-String -Pattern " .*[0-9\.]+:$($TrayPort).*[0-9\.]+:[0-9]+ .*?([0-9]+)" -EA 0 } Catch { Write-Output 'Error calling netstat.exe.'; $netstat = $null } Foreach ($line In $netstat) { $processes += ($line -split ' {4,}')[-1] } $processes = $processes | Where-Object { $_ -gt 0 -and $_ -match '^\d+$' } | Sort-Object | Get-Unique if (($processes)) { if (-not ($Quiet)) { Foreach ($proc In $processes) { if ((Get-Process -Id $proc -EA 0 | Select-Object -Expand ProcessName -EA 0) -eq 'LTSvc') { Write-Output "TrayPort Port $TrayPort is being used by LTSvc." } else { Write-Output "Error: TrayPort Port $TrayPort is being used by $(Get-Process -Id $proc|Select-Object -Expand ProcessName -EA 0)." } } } else { return $False } } Elseif (($Quiet) -eq $True) { return $True } else { Write-Output "TrayPort Port $TrayPort is available." } } foreach ($svr in $Server) { if ($Quiet) { $CleanSvr = ($Svr -replace 'https?://', '' | ForEach-Object { $_.Trim() }) Test-Connection $CleanSvr -Quiet return } if ($Svr -match '^(https?://)?(([12]?[0-9]{1,2}\.){3}[12]?[0-9]{1,2}|[a-z0-9][a-z0-9_-]*(\.[a-z0-9][a-z0-9_-]*)*)$') { Try { $CleanSvr = ($Svr -replace 'https?://', '' | ForEach-Object { $_.Trim() }) Write-Output 'Testing connectivity to required TCP ports:' TestPort -ComputerName $CleanSvr -Port 70 TestPort -ComputerName $CleanSvr -Port 80 TestPort -ComputerName $CleanSvr -Port 443 TestPort -ComputerName $Mediator -Port 8002 } Catch { Write-Error "ERROR: Line $(LINENUM): There was an error testing the ports. $($Error[0])" -ErrorAction Stop } } else { Write-Warning "WARNING: Line $(LINENUM): Server address $($Svr) is not a valid address or is not formatted correctly. Example: https://automate.domain.com" } } } End { if ($?) { if (-not ($Quiet)) { Write-Output 'Test-CWAAPorts Finished' } } Else { $Error[0] } Write-Debug "Exiting $($myInvocation.InvocationName) at line $(LINENUM)" } } |