НейроАгент

Как определить процесс, слушающий порт в Windows

Узнайте несколько методов определения, какой процесс слушает определенные TCP или UDP порты в Windows с помощью netstat, командлетов PowerShell и продвинутых скриптов для эффективного сетевого устранения неполадок.

Вопрос

Как определить, какой процесс слушает определенный TCP или UDP порт в Windows?

НейроАгент

Вы можете определить, какой процесс прослушивает определенный TCP или UDP порт в Windows с помощью нескольких методов, включая традиционную команду netstat с фильтрацией, современные командлеты PowerShell, такие как Get-NetTCPConnection и Get-NetUDPEndpoint, или путем комбинации этих инструментов с tasklist для получения подробной информации о процессе. Наиболее эффективный подход зависит от версии Windows и вашего знакомства с инструментами командной строки, при этом PowerShell обычно предлагает более структурированные и удобные для фильтрации результаты.

Содержание


Использование команды netstat

Традиционная команда netstat доступна в Windows уже несколько десятилетий и остается надежным методом для определения процессов, прослушивающих порты. Чтобы найти, какой процесс прослушивает определенный порт, можно использовать следующие команды:

Базовый netstat с PID

cmd
netstat -aon | findstr ":80"

Эта команда показывает все подключения, связанные с портом 80, включая идентификатор процесса (PID) в последнем столбце. Параметр -a показывает все подключения, -o - идентификатор процесса, а -n - адреса в числовом формате.

Фильтрация прослушиваемых портов

cmd
netstat -aon | findstr "LISTENING" | findstr ":80"

Для совместимости с PowerShell v2.0 нужно добавить пробел после критерия поиска:

cmd
netstat -aon | find /i "listening" | find "1234 "

Полный вывод netstat

Команда netstat -aon отображает comprehensive список всех активных TCP-подключений, включая:

  • Тип протокола (TCP/UDP)
  • Локальный адрес и порт
  • Внешний адрес и порт
  • Состояние (Установлено, Прослушивается и т.д.)
  • Идентификатор процесса (PID)

Примечание: Формат вывода netstat может незначительно отличаться между версиями Windows, но PID всегда отображается в последнем столбце при использовании параметра -o.

Использование командлетов PowerShell

PowerShell предоставляет более современные и структурированные подходы для определения прослушивающих процессов. В операционной системе Windows включены специализированные командлеты для этой цели.

Get-NetTCPConnection для TCP-портов

Для TCP-портов используйте командлет Get-NetTCPConnection:

powershell
# Получить все прослушиваемые TCP-подключения
Get-NetTCPConnection -State Listen | Select-Object -Property LocalAddress, LocalPort, RemoteAddress, RemotePort, State, OwningProcess

# Получить процесс, прослушивающий определенный порт
Get-Process -Id (Get-NetTCPConnection -LocalPort 80).OwningProcess

Get-NetUDPEndpoint для UDP-портов

Для UDP-портов используйте командлет Get-NetUDPEndpoint:

powershell
# Получить все UDP-конечные точки
Get-NetUDPEndpoint | Select-Object -Property LocalAddress, LocalPort, CreationTime, OwningProcess

# Получить процесс, прослушивающий определенный UDP-порт
Get-Process -Id (Get-NetUDPEndpoint -LocalPort 53).OwningProcess

Расширенная фильтрация в PowerShell

Вы можете создавать более комплексные запросы:

powershell
# Получить TCP-подключения с именами процессов
Get-NetTCPConnection -State Listen | 
    Select-Object LocalAddress, LocalPort, State, OwningProcess,
    @{Name="ProcessName"; Expression={(Get-Process -Id $_.OwningProcess).ProcessName}}

# То же самое для UDP
Get-NetUDPEndpoint | 
    Select-Object LocalAddress, LocalPort, CreationTime, OwningProcess,
    @{Name="ProcessName"; Expression={(Get-Process -Id $_.OwningProcess).ProcessName}}

Примечание: Согласно документации Microsoft Learn, Get-NetTCPConnection поддерживает различные параметры, включая -LocalPort, -State, -RemoteAddress и -OwningProcess для точной фильтрации.

Использование Tasklist с идентификаторами процессов

После определения идентификатора процесса из netstat или командлетов PowerShell можно использовать tasklist для получения подробной информации о процессе:

Базовое использование tasklist

cmd
tasklist /fi "pid eq 16876"

Отображение всех процессов с PID

cmd
tasklist /v

Подход PowerShell с деталями процесса

powershell
# Получить детали процесса после нахождения PID
$tcpConnection = Get-NetTCPConnection -LocalPort 80
$process = Get-Process -Id $tcpConnection.OwningProcess
$process | Select-Object ProcessName, Id, Path, CPU, WorkingSet

Полная информация о процессе

powershell
# Комплексная информация о процессе для прослушиваемых портов
Get-NetTCPConnection -State Listen | ForEach-Object {
    $process = Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue
    [PSCustomObject]@{
        LocalPort = $_.LocalPort
        LocalAddress = $_.LocalAddress
        ProcessName = $process.ProcessName
        PID = $_.OwningProcess
        Path = $process.Path
        CPU = $process.CPU
        Memory = $process.WorkingSet
    }
}

Скрипты PowerShell и продвинутые методы

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

Скрипт полного мониторинга портов

powershell
function Get-ListeningProcess {
    param(
        [Parameter()]
        [ValidateSet("TCP", "UDP", "Both")]
        [string]$Protocol = "Both",
        
        [Parameter()]
        [int]$Port
    )
    
    $results = @()
    
    if ($Protocol -eq "TCP" -or $Protocol -eq "Both") {
        $tcpConnections = Get-NetTCPConnection -State Listen
        if ($Port) {
            $tcpConnections = $tcpConnections | Where-Object { $_.LocalPort -eq $Port }
        }
        
        foreach ($connection in $tcpConnections) {
            $process = Get-Process -Id $connection.OwningProcess -ErrorAction SilentlyContinue
            $results += [PSCustomObject]@{
                Protocol = "TCP"
                LocalPort = $connection.LocalPort
                LocalAddress = $connection.LocalAddress
                ProcessName = $process.ProcessName
                PID = $connection.OwningProcess
                Path = $process.Path
                StartTime = $process.StartTime
            }
        }
    }
    
    if ($Protocol -eq "UDP" -or $Protocol -eq "Both") {
        $udpEndpoints = Get-NetUDPEndpoint
        if ($Port) {
            $udpEndpoints = $udpEndpoints | Where-Object { $_.LocalPort -eq $Port }
        }
        
        foreach ($endpoint in $udpEndpoints) {
            $process = Get-Process -Id $endpoint.OwningProcess -ErrorAction SilentlyContinue
            $results += [PSCustomObject]@{
                Protocol = "UDP"
                LocalPort = $endpoint.LocalPort
                LocalAddress = $endpoint.LocalAddress
                ProcessName = $process.ProcessName
                PID = $endpoint.OwningProcess
                Path = $process.Path
                StartTime = $process.StartTime
            }
        }
    }
    
    return $results | Sort-Object LocalPort
}

# Примеры использования:
# Get-ListeningProcess -Protocol TCP -Port 80
# Get-ListeningProcess -Protocol UDP
# Get-ListeningProcess

Однострочник для быстрой идентификации

powershell
# Быстрый способ увидеть, что прослушивается на порту 80
Get-NetTCPConnection -LocalPort 80 | Select-Object LocalPort, LocalAddress, OwningProcess | ForEach-Object {
    $process = Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue
    $_ | Add-Member -MemberType NoteProperty -Name ProcessName -Value $process.ProcessName -PassThru
}

Расширенная фильтрация по имени процесса

powershell
# Найти все прослушиваемые порты для определенного процесса
$processName = "node"
Get-Process -Name $processName | ForEach-Object {
    $tcpPorts = Get-NetTCPConnection -State Listen -OwningProcess $_.Id
    $udpPorts = Get-NetUDPEndpoint -OwningProcess $_.Id
    
    foreach ($port in $tcpPorts) {
        [PSCustomObject]@{
            Process = $_.ProcessName
            PID = $_.Id
            Protocol = "TCP"
            Port = $port.LocalPort
            Address = $port.LocalAddress
        }
    }
    
    foreach ($port in $udpPorts) {
        [PSCustomObject]@{
            Process = $_.ProcessName
            PID = $_.Id
            Protocol = "UDP"
            Port = $port.LocalPort
            Address = $port.LocalAddress
        }
    }
}

Советы по устранению неполадок

Распространенные проблемы и решения

Проблемы с разрешениями: Некоторые процессы могут требовать повышенных привилегий для просмотра их сетевых подключений. Всегда выполняйте команды от имени администратора.

Процесс не найден: Если PID отображается в netstat, но Get-Process не работает, процесс мог завершиться между командами. Используйте -ErrorAction SilentlyContinue для корректной обработки этой ситуации.

Конфликты портов: Несколько процессов могут пытаться привязаться к одному и тому же порту. Windows обычно разрешает это только в том случае, если адреса различаются (например, 127.0.0.1 против 0.0.0.0).

IPv6 против IPv4: Некоторые процессы могут прослушивать как IPv4, так и IPv6 адреса. Проверяйте наличие как 0.0.0.0, так и :: в поле локального адреса.

Проверка доступности порта

После определения прослушивающего процесса можно проверить доступность порта:

cmd
telnet localhost 80

Или в PowerShell:

powershell
Test-NetConnection -ComputerName localhost -Port 80

Мониторинг изменений портов

Для мониторинга изменений портов в реальном времени:

powershell
# Мониторинг TCP-подключений в реальном времени
Get-NetTCPConnection -State Listen | Select-Object LocalPort, LocalAddress, OwningProcess | 
    Format-Table -AutoSize -Wrap

# Мониторинг каждые 5 секунд
while ($true) {
    Clear-Host
    Get-NetTCPConnection -State Listen | Sort-Object LocalPort | Format-Table -AutoSize
    Start-Sleep -Seconds 5
}

Лучшие практики

Соображения безопасности

  • Регулярный мониторинг: Регулярно проверяйте непредвиденные прослушиваемые порты на критических системах
  • Проверка процессов: Всегда проверяйте, что процессы, прослушивающие чувствительные порты, являются легитимными
  • Минимальные привилегии: Запускайте инструменты мониторинга с минимально необходимыми привилегиями
  • Ведение журналов: Рассмотрите возможность ведения журнала информации о портах для аудита безопасности

Оптимизация производительности

  • Конкретные запросы: Всегда фильтруйте по порту или протоколу, когда это возможно, для сокращения объема вывода
  • Пакетная обработка: Используйте возможности конвейера PowerShell для эффективной обработки
  • Обработка ошибок: Реализуйте правильную обработку ошибок для надежных скриптов
  • Планирование: Используйте планировщик задач для регулярного мониторинга портов

Совместимость между версиями

  • netstat против PowerShell: Используйте netstat для старых версий Windows (до Windows 8/Server 2012)
  • Версия PowerShell: Современные командлеты PowerShell требуют Windows 8/Server 2012 или более поздние версии
  • Резервные методы: Всегда имейте резервные методы для разных версий Windows

Документирование и отчетность

  • Документация скриптов: Тщательно комментируйте ваши скрипты PowerShell
  • Форматирование вывода: Используйте единообразное форматирование для удобного чтения
  • Системы оповещений: Рассмотрите интеграцию с системами мониторинга для критических портов
  • Исторический анализ: Сохраняйте журналы для анализа паттернов использования портов со временем

Заключение

Определение процессов, прослушивающих определенные TCP или UDP порты в Windows, можно выполнить с помощью нескольких эффективных методов. Традиционная команда netstat остается надежной для быстрых проверок, в то время как командлеты PowerShell, такие как Get-NetTCPConnection и Get-NetUDPEndpoint, предлагают более структурированные и удобные для фильтрации результаты. Для комплексного анализа комбинация этих инструментов с tasklist или пользовательскими скриптами PowerShell предоставляет наиболее подробную информацию о прослушивающих процессах.

Для получения оптимальных результатов используйте командлеты PowerShell на современных системах Windows благодаря их превосходным возможностям фильтрации, сохраняя netstat в качестве резервного варианта для совместимости. Всегда учитывайте возможность выполнения команд с повышенными привилегиями и реализуйте правильную обработку ошибок для надежных решений мониторинга портов.

Регулярный мониторинг портов должен быть частью лучших практик администрирования систем для обеспечения безопасности и оптимальной производительности, помогая быстро выявлять несанкционированную сетевую активность или проблемы конфигурации, которые могут повлиять на стабильность системы.

Источники

  1. Stack Overflow - Как определить, какой процесс прослушивает TCP или UDP порт в Windows?

  2. Windows OS Hub - Как узнать, какая программа прослушивает определенный порт в Windows

  3. CloudHadoop - Как найти идентификатор процесса и имя, прослушивающие TCP/UDP порты в Windows

  4. Medium - Определение процесса Windows, использующего определенный TCP или UDP порт

  5. TechnoFossy - Идентификация процессов, использующих определенные TCP/UDP порты в Windows

  6. TempMail - Определение процесса Windows, использующего определенный TCP или UDP порт

  7. Microsoft Learn - Get-NetTCPConnection

  8. Microsoft Learn - Get-NetUDPEndpoint

  9. SANS ISC - Netstat, но лучше и в PowerShell

  10. PDQ - Get-NetTCPConnection - Команда PowerShell