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:
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:
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:
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:



