Я пытаюсь использовать netstat -bano
и собирать выходные данные в PowerShell для некоторых очень специфических требований к отчетности.
У меня есть работающее регулярное выражение, которое должно быть в состоянии проанализировать этот вывод без проблем, но так как вывод появляетсяв нескольких строках регулярное выражение обрабатывается неправильно
Вот скриншот того, как это получается из netstat
желаемый результат примерно такой (все в одной строке):
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 1092 RpcSs [svchost.exe]
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING 4 Can not obtain ownership information
TCP 0.0.0.0:623 0.0.0.0:0 LISTENING 7404 [LMS.exe]
TCP 0.0.0.0:3389 0.0.0.0:0 LISTENING 1224 TermService [svchost.exe]
использование инструментов вне Windows невозможно, поэтому я ограничен общими инструментами.
Использование Get-Process
сопоставления на PID также не будет работать, так как оно скрывает информацию о подпроцессах в svchost и lsass.netstat
с -b
идеально подходит, потому что показывает как svchost.exe
, так и процесс, использующий порт
Я искал интернет, чтобы найти жизнеспособное решение, но большинство заканчивалось в другом разрешении
РЕДАКТИРОВАТЬ ** вот мой последний сценарий с использованием информации от вас, ребята
$data = (netstat -bano |select -skip 4 | Out-String) -replace '(?m)^ (TCP|UDP)', '$1' -replace '\r?\n\s+([^\[])', "`t`$1" -replace '\r?\n\s+\[', "`t[" -split "`n"
[regex]$regex = '(?<protocol>TCP|UDP)\s+(?<address>\d+.\d+.\d+.\d+|\[::\]|\[::1\]):(?<port>\d+).+(?<state>LISTENING|\*:\*)\s+(?<pid>\d+)\s+(?<service>Can not obtain ownership information|\[\w+.exe\]|\w+\s+\[\w+.exe\])'
$output = @()
$data | foreach {
$_ -match $regex
$outputobj = @{
protocol = [string]$matches.protocol
address = [string]$matches.address -replace '\[::\]','[..]' -replace '\[::1\]','[..1]'
port = [int]$matches.port
state = [string]$matches.state -replace "\*:\*",'NA'
pid = [int]$matches.pid
service = ([string]$matches.service -replace 'Can not obtain ownership information','[System' -split '.*\[')[1] -replace '\]',''
subservice = ([string]$matches.service -replace 'Can not obtain ownership information','' -split '\[.*\]')[0]
}
$output += New-Object -TypeName PSobject -Property $outputobj
}
$output |select address,port,protocol,pid,state,service,subservice