netstat avec le nom du processus?

46

En utilisant netstat -a -o -n je peux obtenir la liste des ports et PID

alors je dois aller au gestionnaire de tâches et ajouter le PID et voir qui est-ce. (assez frustrant)

entrez la description de l'image ici

J'étais je me demande s'il y a une commande CMD qui fait tout ( en utilisant find, for, powershell)

afin que je puisse obtenir le nom du processus

Royi Namir
la source
netstat -b en tant qu'administrateur, par exemple netstat -abon. Et le nom de l'exe est ci
barlop

Réponses:

56

Solution

Utilisez le -bparamètre:

  -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.

Remarque La netstat -bcommande échouera sauf si elle est exécutée à partir d'une invite de commande avec privilèges élevés.

solution de contournement

Filtrez la liste des processus et trouvez le PID qui vous intéresse:

tasklist | findstr /c:"PID"  


Solution alternative

Vous pouvez utiliser à la Tcpvcon.exeplace. Aucun droit d'administrateur requis.

L' utilisation de Tcpvcon est similaire à celle de l' netstatutilitaire Windows intégré .

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.
et31415
la source
1
tu es l'homme.
Royi Namir
bonne réponse, juste en commentant que je trouve ça amusant comment ms /? la documentation indique même que "cette option peut prendre beaucoup de temps"! et c’est purement une stupidité des fenêtres que cela prend du temps. Netstat de Linux affiche rapidement le nom de son exécutable. De plus, l'affichage du nom de l'exécutable sous Linux ne nécessite pas les privilèges root / admin
barlop
8

Je pense que vous recherchez TCPView de SysInternals.

Leptonateur
la source
Je me demandais s'il y avait une commande CMD qui fait tout
Royi Namir
Continuez - Il existe un composant de ligne de commande de TCPView ..
Leptonator
Ah d'accord. pensais peut-être que quelqu'un l'avait déjà fait en utilisant pour, trouver, etc.
Royi Namir le
Cela ne devrait pas être trop difficile à faire .. Je parierais que robvanderwoude.com a quelque chose à ce sujet. Selon la page TCPView - "Le téléchargement TCPView inclut Tcpvcon, une version en ligne de commande avec les mêmes fonctionnalités."
Leptonator
Très bonne suite d'outils .. s'il n'y avait pas msys et sis, j'utiliserais une boîte nix. :)
Eddie B
2

Voici un exemple pour Windows utilisant FORpour analyser la netstatsortie puis DO tasklistavec le /fifiltre sur pid pour afficher le nom du processus.

La dernière découverte consiste à supprimer les en- tasklisttêtes.

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

imprime les enregistrements comme

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

Des champs supplémentaires netstatpeuvent être ajoutés en ajoutant des jetons.

marque
la source
Avantages de cette solution, notamment: 1. utiliser findpour filtrer les ports (en revanche, netstat -bpeut fournir directement le nom du processus, mais le fait de rechercher manuellement le résultat du processus est pénible et source d'erreurs); 2. n'utilisez que des commandes natives Windows, plus flexibles et indépendantes.
Yingyu VOUS
1
Amélioration possible: 1. utiliser findstravec /Roption au lieu d' findutiliser regex pour une meilleure recherche; 2. à utiliser :443 *[[0-9]"comme modèle pour filtrer le port local uniquement. La commande entière pourrait êtreFOR /F "usebackq tokens=5 delims= " %i IN (`netstat -ano ^|findstr /R /C:":443 *[[0-9]"`) DO @tasklist /fi "pid eq %i" | findstr "%i"
Yingyu VOUS
@DavidPostill ou @mark Pourriez-vous préciser "Des champs supplémentaires netstatpeuvent être ajoutés en ajoutant des jetons."?
Yves Schelpe
2

Si vous aimez utiliser PS, vous pouvez insérer ce code (remarque: il est super basique)

$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)"
}

Notez que vous pouvez essayer Pathd’ ProcessNameobtenir un chemin d’exécutable complet au lieu de , mais cela ne fonctionnera pas avec les services système. En outre, vous souhaiterez peut-être ajouter le ProcessNameà la fin de la ligne au lieu de remplacer la valeur PID.

Profitez-en ;)

Erik Bitemo
la source
1

Essayez d'utiliser ceci ...

Nom du processus avec horodatage :) dans oneliner ... pas besoin de scripter rapidement et facilement ...

Vous pouvez changer le paramètre SYN_SENT par ESTABLISHED ou 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
Jhon Willmaure
la source
Je l'ai utilisé avec un motif sur l'ip: port que je voulais observer. Excellent extrait!
Alex
0

Très gentil Erik Bitemo! Je pensais ajouter une variable pour le chemin, puis je me suis rendu compte que vous l’aviez déjà, même si elle n’était pas définie. Donc, le code que j'ai réutilisé était:

$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*"}
     }

J'essayais de trouver les processus et les services pour une application où j'utilisais une ligne 2 légèrement différente.

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
Ratan Mohapatra
la source
J'ai modifié la question d'Erik pour y inclure votre correctif. Si vous le souhaitez, vous pouvez la supprimer de votre réponse et vous concentrer sur votre approche avec GetServiceet Get-Process.
Flolilo