Багато адміністратори для відображення інформації про мережеві підключення TCP / IP, відкритих TCP портах в Windows звикли використовувати консольную утиліту netstat або графічну TCPView. У PowerShell для заміни утиліти netstat можна використовувати командлет Get-NetTCPConnection, Який можна досить гнучко використовувати для отримання інформації про активні мережевих з’єднаннях в Windows, відкритих мережевих портах і запушених процесах, які використовують TCP протокол. Завдяки тому, що PowerShell це об’єктно-орієнтована мова, ви можете досить зручно робити складні скрипти для отримання інформації та моніторингу відкритих портів, процесах і встановлених мережевих з’єднаннях.

Спробуйте запустити командлет Get-NetTCPConnection без параметрів.

Get-NetTCPConnection - powershell командлет для отримання списку мережевих підключень

Команда по аналогії з netstat вивела список всіх активних підключень із зазначенням локального і віддаленого адреси, порту, стану підключення (Listen, Established Internet, TimeWait, Bound, CloseWait, SynReceived, SynSent, TimeWait) і ідентифікатор процесу (PID), які використовує це TCP підключення.

Можна вивести список локальних портів, які слухаються (відкриті) на вашому комп’ютері:

Get-NetTCPConnection -State Listen | Select-Object -Property LocalAddress, LocalPort, RemoteAddress, RemotePort, State | Sort-Object LocalPort |ft

вивести список відкритий портів в windows

Для отримання інформації про використання протоколу UDP, відкритих портів використовується командлет Get-NetUDPEndpoint.

Можна вивести тільки зовнішні (Інтернет) підключення:

Get-NetTCPConnection -AppliedSetting Internet

Для всіх мережевих TCP підключень можна вивести DNS імена віддалених хостів і імена процесів.

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 імена, і для кожного з’єднання вказав ім’я процесу, який його використовує.

список активних мережевих підключень і процесів в Windows 10 за допомогою powershell

На ім’я 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

Можна вивести тільки мережеві підключення, які ініційовані певними процесом. Для цього можна використовувати такий PowerShell скрипт:

$TrackProcessName = “*firefox*”
$EstablishedConnections = 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
Foreach ($Connection in $EstablishedConnections)
{
If ($Connection.ProcessName -like $TrackProcessName)
{
$Connection|ft
}
}

Ареал застосування командлет Get-NetTCPConnection дуже широкий. Наприклад, ви можете створити простий PowerSHell скрипт, який повинен відслідковувати установку з’єднання з певного IP адреси на вказаний локальний порт і виводити спливаюче повідомлення адміністратору.

У наступному прикладі PowerShell скрипт перевіряє, коли з’явиться з’єднання з зазначеного IP адреси по порту RDP порту 3389. Якщо таке підключення з’явиться в списку, він виведе спливаюче повідомлення і логірует дату і час підключення в текстовий файл:

$TrackingIP = “192.168.10.50”
$TrackingPort =”3389”
$log = "C:psrdp_connection_log.txt"
$EstablishedConnections = Get-NetTCPConnection -State Established
Foreach ($Connection in $EstablishedConnections)
{
If (($Connection.RemoteAddress -eq $TrackingIP) -and ($Connection.LocalPort -eq $TrackingPort))
{
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).ToString() + ' ' + $Connection.RemoteAddress + ' установлено RDP подключение ' >> $log
}
}

powershell скрипт для оповіщення про віддаленому підключенні до комп'ютера windows

Аналогічним чином можна відстежувати і Залогуватися мережеві підключення по будь-якому іншому протоколу, наприклад 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.

Leave a Reply

Your email address will not be published. Required fields are marked *