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:
128 . ábra Get-NetStat IP címekkel és portszámokkal
129 . ábra Get-NetStat gép- és portnevekkel