Skip to main content

Sprawdzenie otwartych / nasłuchujących portów wraz z aktywnym procesem

Skrypty uruchamiamy w powershell.

Samo pobranie danych bez parsowania wyników:
Get-NetTCPConnection | Sort-Object -Property LocalPort | Select-Object -Property LocalPort, RemoteAddress, RemotePort, State, OwningProcess | ForEach-Object {
    $_ | Add-Member -MemberType NoteProperty -Name ProcessName -Value (Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue | Select-Object -ExpandProperty ProcessName)
    $_
} | Format-Table -Property LocalPort, RemoteAddress, RemotePort, State, ProcessName

Przykładowy wynik:

image.png

Pobieranie danych z filtrowaniem po IP:
$ipFilter = "Szukanie danego IP"

Get-NetTCPConnection | Where-Object {
    $_.RemoteAddress -eq $ipFilter -or $_.LocalAddress -eq $ipFilter
} | Sort-Object -Property LocalPort | Select-Object -Property LocalPort, RemoteAddress, RemotePort, State, OwningProcess | ForEach-Object {
    $_ | Add-Member -MemberType NoteProperty -Name ProcessName -Value (Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue | Select-Object -ExpandProperty ProcessName)
    $_
} | Format-Table -Property LocalPort, RemoteAddress, RemotePort, State, ProcessName

Przykładowy wynik:

image.png

Pobieranie danych i zapisanie wyników do pliku
# Definiowanie ścieżki do pliku CSV
$csvPath = "C:\LokalizacjaDoPliku\NazwaPliku.csv"

# Pobranie wszystkich połączeń TCP i dodanie informacji o procesie
Get-NetTCPConnection | Sort-Object -Property LocalPort | Select-Object -Property LocalPort, RemoteAddress, RemotePort, State, OwningProcess | ForEach-Object {
    $_ | Add-Member -MemberType NoteProperty -Name ProcessName -Value (Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue | Select-Object -ExpandProperty ProcessName)
    $_
} | Export-Csv -Path $csvPath -NoTypeInformation

Write-Host "Zapisano połączenia do pliku CSV: $csvPath"
Pobieranie danych za pomocą netstat -ano z parsowaniem wyników w CLI:
$netstatOutput = netstat -ano

$connections = @()
foreach ($line in $netstatOutput) {
    if ($line -match '^\s*(TCP|UDP)') {
        $parts = $line -split '\s+'

        # Przypisanie wartości do odpowiednich zmiennych
        $protocol = $parts[1]       
        $localAddress = $parts[2]    
        $remoteAddress = $parts[3] 
        $processID = "" 
        $state = ""

        if ($protocol -eq 'TCP') {
            $state = $parts[4]     
            $processID = $parts[5]  
        } elseif ($protocol -eq 'UDP') {
            $state = "N/A"         
            $processID = $parts[4]  
        }

        # Funkcja do dzielenia adresu i portu, zachowująca nawiasy IPv6
        function Split-AddressPort ($address) {
            if ($address -match '^\[(.+)\]:(\d+)$') {
                # IPv6 z nawiasami np. [::1]:443
                return @("[{0}]" -f $matches[1], $matches[2])
            } elseif ($address -match '^(.+):(\d+)$') {
                # IPv4 i inne adresy z portem np. 192.168.1.1:80
                return @($matches[1], $matches[2])
            } else {
                # Adresy bez portów np. *:*
                return @($address, "N/A")
            }
        }

        $localIP, $localPort = Split-AddressPort $localAddress
        $remoteIP, $remotePort = Split-AddressPort $remoteAddress

        # Pobranie nazwy procesu lub ustawienie komunikatu
        $processName = "Unknown"
        if ($processID -eq "0") {
            $processName = "Process terminated | PID = 0"
        } elseif ($processID -match '^\d+$') {
            try {
                $processName = (Get-Process -Id $processID -ErrorAction SilentlyContinue).Name
            } catch {
                # Proces może już nie istnieć lub być niedostępny
            }
        }

        $connections += [PSCustomObject]@{
            Protocol     = $protocol
            LocalIP      = $localIP
            LocalPort    = $localPort
            RemoteIP     = $remoteIP
            RemotePort   = $remotePort
            ProcessId    = $processID
            State        = $state
            ProcessName  = $processName
        }
    }
}

$connections | Sort-Object -Property LocalIP | Format-Table -AutoSize -Property Protocol, LocalIP, LocalPort, RemoteIP, RemotePort, ProcessId, State, ProcessName

Przykładowy wynik:

image.png

Pobieranie danych za pomocą netstat -ano z interaktywną tabelą
$netstatOutput = netstat -ano

$connections = @()
foreach ($line in $netstatOutput) {
    if ($line -match '^\s*(TCP|UDP)') {
        $parts = $line -split '\s+'

        # Przypisanie wartości do odpowiednich zmiennych
        $protocol = $parts[1]       
        $localAddress = $parts[2]    
        $remoteAddress = $parts[3] 
        $processID = "" 
        $state = ""

        if ($protocol -eq 'TCP') {
            $state = $parts[4]     
            $processID = $parts[5]  
        } elseif ($protocol -eq 'UDP') {
            $state = "N/A"         
            $processID = $parts[4]  
        }

        # Funkcja do dzielenia adresu i portu, zachowująca nawiasy IPv6
        function Split-AddressPort ($address) {
            if ($address -match '^\[(.+)\]:(\d+)$') {
                # IPv6 z nawiasami np. [::1]:443
                return @("[{0}]" -f $matches[1], $matches[2])
            } elseif ($address -match '^(.+):(\d+)$') {
                # IPv4 i inne adresy z portem np. 192.168.1.1:80
                return @($matches[1], $matches[2])
            } else {
                # Adresy bez portów np. *:*
                return @($address, "N/A")
            }
        }

        $localIP, $localPort = Split-AddressPort $localAddress
        $remoteIP, $remotePort = Split-AddressPort $remoteAddress

        # Pobranie nazwy procesu lub ustawienie komunikatu
        $processName = "Unknown"
        if ($processID -eq "0") {
            $processName = "Process terminated | PID = 0"
        } elseif ($processID -match '^\d+$') {
            try {
                $processName = (Get-Process -Id $processID -ErrorAction SilentlyContinue).Name
            } catch {
                # Proces może już nie istnieć lub być niedostępny
            }
        }

        $connections += [PSCustomObject]@{
            Protocol     = $protocol
            LocalIP      = $localIP
            LocalPort    = $localPort
            RemoteIP     = $remoteIP
            RemotePort   = $remotePort
            ProcessId    = $processID
            State        = $state
            ProcessName  = $processName
        }
    }
}

$connections | Sort-Object -Property LocalIP | Out-GridView

Przykładowy wynik:

image.png