netstat con nome processo?


46

Utilizzando netstat -a -o -n posso ottenere l'elenco delle porte e PID

quindi devo andare al task manager e aggiungere il PID e vedere chi è. (piuttosto frustrante)

inserisci qui la descrizione dell'immagine

Ero chiedo se c'è un comando CMD, che fa tutto (usando find, for, powershell)

in modo da poter ottenere il nome del processo


netstat -b come admin, ad esempio netstat -abon. E il nome
dell'exe

Risposte:


56

Soluzione

Usa il -bparametro:

  -b            Displays the executable involved in creating each connection or
                listening port. In some cases well-known executables host
                multiple independent components, and in these cases the
                sequence of components involved in creating the connection
                or listening port is displayed. In this case the executable
                name is in [] at the bottom, on top is the component it called,
                and so forth until TCP/IP was reached. Note that this option
                can be time-consuming and will fail unless you have sufficient
                permissions.

Nota Il netstat -bcomando non riuscirà a meno che non venga eseguito da un prompt dei comandi con privilegi elevati.

Soluzione

Filtra l'elenco dei processi e trova il PID che ti interessa:

tasklist | findstr /c:"PID"  


Soluzione alternativa

Puoi usare Tcpvcon.exeinvece. Non sono richiesti diritti di amministratore.

L' utilizzo di Tcpvcon è simile a quello netstatdell'utilità di Windows integrata .

Usage: tcpvcon [-a] [-c] [-n] [process name or PID]

 -a Show all endpoints (default is to show established TCP connections).
 -c Print output as CSV.
 -n Don't resolve addresses.

1
tu sei l'uomo.
Royi Namir,

buona risposta, solo commentando che penso sia divertente come il ms /? la documentazione dice anche "questa opzione può richiedere molto tempo"! ed è puramente una stupidità delle finestre che richiede tempo. Netstat di Linux fa il suo nome eseguibile mostrando velocemente. E anche il nome dell'eseguibile di Linux che mostra non richiede i privilegi di root / admin
barlop

8

Penso che tu stia cercando TCPView da SysInternals .


Mi chiedevo se esiste un comando CMD che fa tutto
Royi Namir il

Continua - Esiste un componente della riga di comando di TCPView ..
Leptonator,

Oh va bene. pensavo che forse qualcuno lo avesse già fatto usando per, trovare ecc.
Royi Namir il

Non dovrebbe essere troppo difficile da fare .. Scommetto che robvanderwoude.com ha qualcosa in più. Per la pagina TCPView - "Il download TCPView include Tcpvcon, una versione da riga di comando con la stessa funzionalità."
Leptonator,

Suite di strumenti molto buona .. Se non fosse per msys e sis userei una scatola di nix. :)
Eddie B,

2

Ecco un esempio per Windows che utilizza FORper analizzare l' netstatoutput quindi DO tasklistcon /fifiltro su pid per mostrare il nome del processo.

L'ultima scoperta è rimuovere le tasklistintestazioni.

FOR /F "usebackq tokens=5 delims= " %i IN (`netstat -ano ^|find "443"`) DO @tasklist /fi "pid eq %i" | find "%i"

stampa l'output dei record come

tomcat8.exe.x64               4240 Services                   0    931,864 K

Campi aggiuntivi da netstatpossono essere aggiunti aggiungendo token.


I vantaggi di questa soluzione includono: 1. usare findper filtrare le porte (al contrario, sebbene netstat -bpossa fornire direttamente il nome del processo, ma passare attraverso il suo output per cercare manualmente è doloroso e soggetto a errori); 2. utilizzando solo i comandi nativi di Windows, che è più flessibile e indipendente.
Yingyu,

1
Possibile miglioramento: 1. utilizzare findstrcon /Ropzione invece di findutilizzare regex per una migliore ricerca; 2. da utilizzare :443 *[[0-9]"come modello per filtrare solo la porta locale . L'intero comando potrebbe essereFOR /F "usebackq tokens=5 delims= " %i IN (`netstat -ano ^|findstr /R /C:":443 *[[0-9]"`) DO @tasklist /fi "pid eq %i" | findstr "%i"
Yingyu YOU

@DavidPostill o @mark Potresti chiarire " netstatÈ possibile aggiungere campi aggiuntivi da aggiungendo token."?
Yves Schelpe,

2

Se ti piace usare PS, puoi forkare questo codice (nota: è super-base)

$nets = netstat -ano | select-string LISTENING
foreach($n in $nets){
    # make split easier PLUS make it a string instead of a match object:
    $p = $n -replace ' +',' '
    # make it an array:
    $nar = $p.Split(' ')
    # pick last item:
    $pname = $(Get-Process -id $nar[-1]).ProcessName
    $ppath = $(Get-Process -id $nar[-1]).Path
    # print the modified line with processname instead of PID:
    $n -replace "$($nar[-1])","$($ppath) $($pname)"
}

Nota che puoi provare Pathinvece di ProcessNameottenere un percorso eseguibile completo, tuttavia non funzionerà con i servizi di sistema. Inoltre, potresti voler aggiungere il ProcessNamealla fine della riga invece di sostituire il valore PID.

Divertirsi ;)


1

Prova a usare questo ...

Nome del processo con timestamp :) in oneliner ... non è necessario lo scripting semplice e veloce ...

È possibile modificare il parametro SYN_SENT con ESTABLISHED o LISTENING

filter timestamp {"$(Get-Date -Format G): $_"};netstat -abno 1 | Select-String -Context 0,1 -Pattern LISTENING|timestamp

filter timestamp {"$(Get-Date -Format G): $_"};netstat -abno 1 | Select-String -Context 0,1 -Pattern SYN_SENT|timestamp

L'ho usato con un modello sull'ip: porta che volevo osservare. Grande frammento!
Alex,

0

Molto carino Erik Bitemo! Stavo pensando di aggiungere una variabile per il percorso, poi mi sono reso conto che l'hai già fatto anche se non è stato definito. Quindi il codice che ho riutilizzato era:

$nets = netstat -ano |select-string LISTENING;
foreach ($n in $nets)
    {
# make split easier PLUS make it a string instead of a match object
    $p = $n -replace ' +',' ';
# make it an array
    $nar = $p.Split(' ')
# pick last item...
    $pname = $(Get-Process -id $nar[-1]).ProcessName
    $ppath = $(Get-Process -id $nar[-1]).Path;
# print the modified line with processname instead of PID
    $n -replace "$($nar[-1])","$($ppath) $($pname)" | where {$pname -like "*GMSVP*"}
     }

Stavo cercando di trovare i processi e i servizi per un'applicazione in cui ho usato un 2 liner leggermente diverso.

Get-Service | select status,name,displayname,servicename | where {($_.DisplayName -like "myserv*") -or ($_.servicename -like "post*")} | ft -auto

Get-Process | select id, processname,cpu,path,description | where {$_.path -like "*myserv*"} | ft -auto

Ho modificato la domanda di Erik per includere la tua correzione, quindi se lo desideri, puoi eliminarla dalla tua risposta e concentrarti sul tuo approccio con GetServicee Get-Process.
flolilo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.