Powershell Поиск TCP-соединений по порту - PullRequest
0 голосов
/ 27 января 2019

Мне не удалось найти какой-либо опубликованный код, который бы делал что-то вроде netstat в PowerShell, а затем искать установленные TCP-соединения по порту.

Я написал следующую функцию, которая работает и надеется получить обратную связь. Есть ли более простой способ? Моя компания все еще работает на Windows 7, поэтому я не могу использовать Get-NetTcpConnection.

<# Get-ESTConnectionByPort
Usage: Pass the port number to the function and it will return a boolian
value of true or false it will also echo an "Connected" or "Not Connected"
output to the console.
Get-ESTConnectionbyPort -Port "443"
#>
function Get-ESTConnectionByPort {
    Param($Port)

    $NetworkProperties = [System.Net.NetworkInformation.IPGlobalProperties]::GetIPGlobalProperties()

    $TcpConnections = $NetworkProperties.GetActiveTcpConnections()

    $TCPOut = $TcpConnections | Select-Object State, RemoteEndPoint

    $TCPTable = @($TCPOut.where({
        $_.RemoteEndPoint -match '.:' + $Port + '\z' -and
        $_.State -eq "Established"
    }))

    $Value = (-not $TCPTable)

    if (-not $Value) {
        Write-Host "Connected"
        $script:TCPConnected = $true
    } else {
        Write-Host "Not Connected"
        $script:TCPConnected = $false
    }

    $script:TCPConnected
}

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Не нужно изобретать велосипед.

Для этого есть командлет, если только вы не используете операционную систему или более раннюю версию PowerShell, в которой ее нет.

# get function / cmdlet details
(Get-Command -Name Test-NetConnection).Parameters
Get-help -Name Test-NetConnection -Examples

<#
    Example 3: Test TCP connectivity and display detailed results

    PS C:\> Test-NetConnection -Port 80 -InformationLevel "Detailed"
    ComputerName            : internetbeacon.msedge.net
    RemoteAddress           : 2a01:111:2003::52
    RemotePort              : 80
    NameResolutionResults   : 2a01:111:2003::52
                            13.107.4.52
    MatchingIPsecRules      : Ipsec/Domain-TrafficFromInternet-v6
    NetworkIsolationContext : Internet
    IsAdmin                 : False
    InterfaceAlias          : Ethernet
    SourceAddress           : 2001:4898:d8:33:81e8:7b49:8bf5:8710
    NetRoute (NextHop)      : fe80::200:5eff:fe00:203
    TcpTestSucceeded        : True

    This command tests TCP connectivity to a default server and sets the InformationLevel parameter to Detailed.
#>

Get-help -Name Test-NetConnection -Full
Get-help -Name Test-NetConnection -Online

Некоторое время назад был опубликован код для этого варианта использования.

Test-NetworkPort 1.0 Скрипт для проверки, открыт ли порт TCP или UDP.

0 голосов
/ 27 января 2019

это делает работу немного по-другому. он использует методы массива .Where() и .ForEach() для небольшого ускорения. если вы используете PS2 или PS3, вам нужно будет заменить их версиями конвейера [Where-Object & ForEach-Object].

позволяет выбирать несколько номеров портов и несколько состояний, затем генерирует [PSCusomtObject], сортирует по порту и, наконец, выводит объекты. других выходов нет.

function Get-TcpConnectionInfo
    {
    <#
    Comment Based Help goes here
    #>

    [CmdletBinding ()]
    Param (
        [Parameter (
            Position = 0
            )]
            [int[]]
            $Port = 443,

        [Parameter (
            Position = 1
            )]
            [ValidateSet (
                'Established',
                'CloseWait',
                'TimeWait'
                )]
            [string[]]
            $State = 'Established'
        )

    begin {}

    process
        {
        $State = @($State).ForEach({$_.ToLower()})

        @([System.Net.NetworkInformation.IPGlobalProperties]::GetIPGlobalProperties().
            GetActiveTcpConnections()).
            Where({
                # include only foreign RemoteEndPoint items
                $_.LocalEndPoint.Address -ne $_.RemoteEndPoint.Address -and
                $_.State.ToString().ToLower() -in $State -and
                $_.RemoteEndPoint.Port -in $Port
                }).
            ForEach({
                [PSCustomObject]@{
                    State = $_.State
                    RemoteEndPoint = $_.RemoteEndPoint
                    }
                }) |
            Sort-Object {$_.RemoteEndPoint.Port}
        }

    end {}

    } # end >> function Get-TcpConnectionInfo

со следующим звонком ...

Get-TcpConnectionInfo -Port 443, 993 -State closewait, established

... возвращает это ...

      State RemoteEndPoint    
      ----- --------------    
  CloseWait 13.33.115.238:443 
Established 151.101.65.69:443 
Established 198.252.206.25:443
Established 23.194.113.80:443 
Established 40.97.120.242:993 
Established 173.194.70.108:993
Established 173.194.70.108:993
Established 40.97.120.242:993
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...