NetStat

Nézzük, hogy a NetStat eszközt hogyan lehet „felturbózni”. Miután ennek nincs CSV kimenete, ezért egy rőfös regex kifejezéssel kell szétszedni a kimenetet értelmes adatblokkokra. Az egyszerűség kedvéért csak a TCP kapcsolatokat mérem fel a kapcsolatot kezdeményező processz azonosítójával együtt. Itt most nem tűztem ki célul, hogy az összes funkcióját átültessem PowerShell alá, de a legfontosabb kettőt igen. A ‑resolvenames kapcsolóval feladatom az IP címeket hostnévvé és az ismert portokat az ő nevükre, enélkül nem.

A plusz, amit hozzápakolok, a processzek neve és az őket futtató account neve. Ugyan a NetStat maga is fel tudja oldani a processzazonosítókat processznevekké, de ezeket a neveket a hálózati kapcsolatok adatai alatt jeleníti meg, amit elég nehézkes lenne objektumosítani a kapcsolati adatokkal együtt és amúgy is hiányozna a processz tulajdonosának a neve.

Mindezek figyelembe vételével a megoldásom a következő függvény lett:

function get-netstat {

param (

    [switch] $resolvenames

)

    if($resolvenames){

        $cmd = "netstat  -p tcp -f -o"

    }

    else{

        $cmd = "netstat  -p tcp -n -o"

    }

    $regex = "\s+(?<protocol>\w+)\s+(?<LocalAddress>[\d\.]+):?(?<LocalPort>\S+)\s+(?<TargetHost>[^:]+):(?<TargetPort>\S+)\s+(?<State>\S+)\s+(?<PID>\d+)"

    $result = Invoke-Expression $cmd

    $procs = @{}

    Get-WmiObject -Class win32_process |

        %{Add-Member -InputObject $_ -MemberType noteproperty -Name owner -Value "$($_.getowner().domain)\$($_.getowner().user)" -PassThru} |

            %{$procs.($_.processid) = $_}

 

    $result | ?{$_ -and $_ -ne "Active Connections" -and $_ -notmatch "proto\s"} | %{

        if($_ -match $regex){

            New-Object -TypeName PSObject -Property $matches | Select-Object -Property * -ExcludeProperty 0 | %{

                Add-Member -InputObject $_ -MemberType noteproperty -Name Process -Value $procs.([uint32] $_.PID).name -PassThru |

                    Add-Member -MemberType noteproperty -Name Owner -Value $procs.([uint32] $_.PID).owner -PassThru

            }

        }

    }

}

A trükk itt az, hogy külön kigyűjtöm a processzeket a WMI segítségével egy hashtáblába, a kulcs a processzazonosító, így az adott NetStat kimeneti sorhoz elég könnyű hozzárántani a processz nevét és tulajdonosát.

Nézzük, milyen kimenetet kapunk, persze ilyen keskeny nézetben nem sok látszik az adatokból, így inkább mindez GridView-ban:

122 . ábra Get-NetStat IP címekkel és portszámokkal

123 . ábra Get-NetStat gép- és portnevekkel



Word To HTML Converter