Многие администраторы для отображения информации о сетевых подключениях TCP/IP, открытых TCP портах в Windows привыкли использовать консольную утилиту netstat или графическую TCPView . В PowerShell для замены утилиты netstat можно использовать командлет Get-NetTCPConnection , который можно довольно гибко использовать для получения информации об активных сетевых соединениях в Windows, открытых сетевых портах и запушенных процессах, которые используют TCP протокол. Благодаря тому, что PowerShell это объектно-ориентированный язык, вы можете довольно удобно делать сложные скрипты для получения информации и мониторинга открытых портов, процессах и установленных сетевым соединениях.
Попробуйте запустить командлет Get-NetTCPConnection без параметров.
Команда по аналогии с 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
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 имена, и для каждого соединения указал имя процесса, который его использует.
По имени 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
}
}
Аналогичным образом можно отслеживать и логировать сетевые подключения по любому другому протоколу, например 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.
Как менялся логотип Apple на протяжении многих лет. Логотип Apple — это не просто символ,…
Security Boot Fail при загрузке Acer — решение проблемы При загрузке ноутбука Acer с флешки,…
Ноутбук не включается — варианты решения Если при попытке включить ноутбук вы обнаруживаете, что он…
The AC power adapter wattage and type cannot be determined — причины и решение При…
Свистит или звенит блок питания компьютера — причины и решения Некоторые владельцы ПК могут обратить…
Мигает Caps Lock на ноутбуке HP — почему и что делать? При включении ноутбука HP…