Для отображения информации об активных сетевых подключениях TCP/IP, открытых TCP и UDP портах в Windows большинство администраторов использовать консольную утилиту
netstat
или графическую TCPView. В этой статье мы рассмотрим, как использовать PowerShell комадлеты
Get-NetTCPConnection
и
Get-NetUDPEndpoint
как инструменты сетевой диагностики в Windows в качестве замены команды netstat. Эти командлеты позволяют получить информацию об активных сетевых соединениях в Windows, открытых портах и запущенных процессах, которые используют TCP или UDP протокол. Благодаря тому, что PowerShell это объектно-ориентированный язык, в выводе он содержит готовые объекты, а не плоский текст (как в результатах netstat). Это позволяет намного гибче обрабатывать и фильтровать результаты, перенаправлять их в конвейеры и использовать в сложные скриптах для получения информации и мониторинга открытых портов, процессах и установленных сетевых соединениях в Windows.
Get-NetTCPConnection: просмотр TCP сессий и портов
Итак, в отличии от команды netstat, в PowerShell инструменты для работы с TCP и UDP протоколами разделены на две команды. Командлет Get-NetTCPConnection позволяет получить информацию о TCP соединениях. Запустите команду без параметров:
Get-NetTCPConnection

Команда по аналогии с netstat выводит список всех активных TCP сессий с указанием локального и удаленного IP адреса, номера локального и удаленного TCP порта, состояния подключения (Listen, Established Internet, TimeWait, Bound, CloseWait, SynReceived, SynSent, TimeWait) и идентификатор процесса (PID), которые использует это TCP подключение.
Далее перечислен список полезных PowerShell команд для просмотра информации о TCP/IP сессиях и портах.
Вывести список локальных портов, которые слушаются (открыты) на вашем компьютере (вывод дополнительно отсортирован):
Get-NetTCPConnection -State Listen | Select-Object -Property LocalAddress, LocalPort, RemoteAddress, RemotePort, State | Sort-Object LocalPort |ft

Количество подключений к порту:
(Get-NetTCPConnection -LocalPort 443).count
Вывести список удаленных подключений по определенному порту (протоколу):
Get-NetTCPConnection -RemotePort 445
Список сессий с определенным удаленным IP адресом:
Get-NetTCPConnection -RemoteAddress 192.168.123.2
Какой процесс/программа слушает указанный порт:
Get-Process -Id (Get-NetTcpConnection -LocalPort 443).OwningProcess |Format-Table Id, ProcessName, UserName, Path
Можно вывести только внешние (Интернет) подключения:
Get-NetTCPConnection -AppliedSetting Internet
Вывести DNS имена вместо IP адресов удаленных хостов и имена процессов для всех сетевых TCP подключений.
Get-NetTCPConnection -State Established |Select-Object -Property LocalAddress, LocalPort,@{name='RemoteHostName';expression={(Resolve-DnsName $_.RemoteAddress).NameHost}},RemoteAddress, RemotePort, State,@{name='ProcessName';expression={(Get-Process -Id $_.OwningProcess). Path}},OffloadState,CreationTime |ft
Данный PowerShell скрипт выполняет разрешение всех IP адресов хостов в DNS имена (с помощью командлета
Resolve-DnsName
), и для каждого соединения указал имя процесса, который его использует.

По PID родительского процесса можно вывести список связанных имен служб Windows, которые используют сеть:
Get-WmiObject Win32_Service | Where-Object -Property ProcessId -In (Get-NetTCPConnection).OwningProcess | Where-Object -Property State -eq Running | Format-Table ProcessId, Name, Caption, StartMode, State, Status, PathName
Вывести только сетевые подключения, которые инициированы определенным процессом. Например, список удаленных TCP сессий процессами браузера Firefox можно вывести таким PowerShell скриптом:
$ProcessName="firefox"
Get-NetTCPConnection -State Established | ?{$_.OwningProcess -in (Get-Process $ProcessName -ea 0).Id} | ft LocalAddress, LocalPort, @{n='Host';e={(Resolve-DnsName $_.RemoteAddress -ea 0).NameHost}}, RemoteAddress, RemotePort, @{n='Path';e={(Get-Process -Id $_.OwningProcess).Path}}
С помощью командлета Get-NetTCPConnection можно строить сложные сценарии обработки сетевой активности в Windows.
Например, можно сделать PowerShell скрипт, который отслеживает появление соединения с определенного IP адреса на локальный порт и выводит всплывающее уведомление. Следующий PowerShell скрипт проверяет, когда появится соединение с указанного IP адреса по порту RDP порту 3389. Если такое подключение появится в списке, он выведет всплывающее уведомление и логирует в текстовый файл дату и время подключения:
$TrackingIP = "192.168.10.50"
$TrackingPort = "3389"
$log = "C:\ps\rdp_connection_log.txt"
$Connection = Get-NetTCPConnection -State Established | Where-Object { $_.RemoteAddress -eq $TrackingIP -and $_.LocalPort -eq $TrackingPort }
if ($Connection) {
Add-Type -AssemblyName System.Windows.Forms
$global:balmsg = New-Object System.Windows.Forms.NotifyIcon
$path = (Get-Process -id $pid).Path
$balmsg.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($path)
$balmsg.BalloonTipIcon = [System.Windows.Forms.ToolTipIcon]::Warning
$balmsg.BalloonTipText = "К вашему компьютеру подключились по RDP c $($Connection.RemoteAddress)"
$balmsg.BalloonTipTitle = "Новое RDP подключение с $($Connection.RemoteAddress)"
$balmsg.Visible = $true
$balmsg.ShowBalloonTip(10000)
"$(Get-Date) + $($Connection.RemoteAddress) + установлено RDP подключение" >> $log
}

Аналогичным образом можно отслеживать и логировать сетевые подключения по любому другому протоколу, например SSH, SMB, FTP, SMTP и т.д. Такой PowerShell скрипт можно запустить в виде службы Windows для работы в фоновом режиме или запускать скрипт через планировщик.
С помощью PowerShell remoting командлетов (Enter-PSSession и Invoke-Command) вы можете получить список открытых TCP портов и подключений на удаленных компьютерах.
Invoke-Command -ComputerName host1 {Get-NetTCPConnection -State Established}
Командлет Get-NetTCPConnection (также как и Test-NetConnection) может быть крайне полезен для мониторинга и диагностики сетевых подключений в Windows.
Get-NetUDPEndpoint: просмотр конечных точек UDP и портов
Командлет Get-NetUDPEndpoint выводит статистику о конечных точках UDP. При запуске без параметров, команда выводит список открытых UDP портов на компьютере.
В поле LocalAddress содержится локальный IP-адрес сетевого интерфейса, на котором открыт порт. Значение 0.0.0.0 (для IPv4) или :: (для IPv6) означает, что порт слушается на всех доступных сетевых адаптерах. В LocalPort поле указан номер локального UDP-порта, который слушается приложением.
Можно дополнительно вывести в таблице значение OwningProcess, это идентификатор процесса (PID), который создал UDP точку.
Get-NetUDPEndpoint | Select-Object LocalAddress,LocalPort,OwningProcess | Sort-Object -Property LocalPort|

Вместо ID идентификатора процесса-владельца, можно вывести его имя:
Get-NetUDPEndpoint | Select-Object LocalAddress,LocalPort,OwningProcess,@{Name="Process";Expression={(Get-Process -Id $_.OwningProcess).ProcessName}} | Sort-Object -Property LocalPort

Определить какой процесс слушает определенный UDP порт:
Get-Process -Id (Get-NetUDPEndpoint -LocalPort 53).OwningProcess


Листинг повершела из серии засунуть очевидною в невороятное!!!
как изменить запись балона где указано «Windows Powershell ISE»
Там отображается процесс, который вывел это уведомление.
Как убрать — не знаю, не интересовался. Возможно нужно внимательно про класс System.Windows.Forms.NotifyIcon почитать.
Проясните пожалуйста. По поводу последнего скрипта «скрипт проверяет, когда появится соединение с указанного IP адреса по порту»
Скрипт разово сделает проверку на наличие установленного подключения. А за счет чего он должен далее осуществлять проверку ? появилось подключение или нет ?
P.S. И зачем Foreach ? Get-NetTCPConnection -State Established -localport $TrackingPort -localaddress $TrackingIP -State Established
Этот кусок кода делает разовую проверку. Если нужно проверять постоянно, нужно обернуть в цикл? можно даже сделать службу. Или запускать с нужной частотой через планировщик.
PS. Вы правы, можно без цикла.
Вывести процессы, которые использют сеть, удаленные IP адреса и имена пользователей, запустившие процессы:
Get-NetTCPConnection -State Established | Select-Object LocalPort, RemoteAddress, RemotePort, @{n="ProcessName";e={(Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).ProcessName}}, @{n="User";e={(Get-Process -Id $_.OwningProcess -IncludeUserName -ErrorAction SilentlyContinue).UserName}} | Format-Table -AutoSize📚 В качестве альтернативы утилите netstat для получения списка активных TCP сессий и портов можно использовать PowerShell командлет Get-NetTCPConnection (или Get-NetUDPEndpoint для UDP). В отличии от netstat, PowerShell возвращает не плоский текстовый список, который нужно дополнительно грепать текстовыми фильтрами, а список объектов. Благодаря этому в PowerShell намного проще фильтровать, сортировать и группировать списки активных TCP подключений и портов, а затем обрабатывать полученные результаты по определенному вами сценарию 💪.
Ниже несколько примеров типовых команд:
Список открытых портов:
Get-NetTCPConnection -State Listen
Вывести список TCP сессий с локальным портом 443:
Get-NetTCPConnection -LocalPort 443 | Format-Table -AutoSize
Посчитать количество активных TCP сессий:
(Get-NetTCPConnection -LocalPort 443 -State Established).count
Вывести имя процесса, который слушает определенный TCP порт и имя пользователя, от которого запущен процесс:
Get-Process -Id (Get-NetTcpConnection -LocalPort 80).OwningProcess -IncludeUserName
Сколько сессий открыто на каждый IP (топ 10):
Get-NetTCPConnection -State Established | Group-Object RemoteAddress | Sort-Object Count -Descending | Select-Object -First 10 Count, Name
Непрерывный мониторинг сессий на порту:
while ($true) { Clear-Host; Get-NetTCPConnection — LocalPort 443 -State Established; Start-Sleep -Seconds 5 }
✅ В статье рассмотрены эти и другие примеры использования командлета Get-NetTCPConnection для просмотра TCP сессий в Windows, получения списка открытых портов, информации о сетевых процессах.