function Get-NetworkConnectionProcess {
[CmdletBinding()]
param (
[ValidateSet(
'Closed',
'CloseWait',
'Closing',
'DeleteTCB',
'Established',
'FinWait1',
'FinWait2',
'LastAck',
'Listen',
'SynReceived',
'SynSent',
'TimeWait')]
[string]$State = 'Established'
)
process {
$TCPConnections = Get-NetTCPConnection -State $State |
Select-Object -Property LocalPort, OwningProcess
$Filter = "ProcessId=" + ($($TCPConnections.OwningProcess) -join " or ProcessId=")
Write-Verbose "ProcessIds are $Filter"
$TCPProcessesArguments = @{
ClassName = 'Win32_Process'
Filter = $Filter
Property = 'ProcessId', 'Name', 'CommandLine'
}
$TCPProcesses = Get-CimInstance @TCPProcessesArguments |
Select-Object -Property ProcessId, Name, CommandLine
foreach ($TCPConnection in $TCPConnections) {
Write-Verbose "Processing $($TCPConnection.LocalPort)"
$TCPProcess = $TCPProcesses |
Where-Object -Property ProcessId -EQ -Value $TCPConnection.OwningProcess
[PSCustomObject]@{
Port = $TCPConnection.LocalPort
ProcessName = $TCPProcess.Name
ProcessCmd = $TCPProcess.CommandLine
}
}
}
}