web-dev-qa-db-fra.com

netstat avec le nom du processus?

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

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

enter image description here

Je me demandais s’il existe une commande CMD qui fait tout (en utilisant find, for, powershell)

pour que je puisse obtenir le nom du processus

44
Royi Namir

Solution

Utilisez le paramètre -b:

  -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 commande netstat -b échouera à moins d'être lancée à partir d'une invite de commande avec privilèges élevés.

Workaround

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

tasklist | findstr /c:"PID"  

Solution alternative

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

Tcpvcon usage est similaire à celui de l'utilitaire Windows netstat 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.
53
and31415

Je pense que vous recherchez TCPView de SysInternals.

8
Leptonator

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 Path au lieu de ProcessName pour obtenir un chemin d’exécutable complet - cela ne fonctionnera pas avec les services système cependant. Vous pouvez également ajouter la ProcessName à la fin de la ligne au lieu de remplacer la valeur PID.

Profitez-en ;)

2
Erik Bitemo

Voici un exemple pour Windows utilisant FOR pour analyser netstat output puis DOtasklist avec le filtre /fi sur pid pour afficher le nom du processus.

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

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 de netstat peuvent être ajoutés en ajoutant des jetons.

2
mark

Très gentil Erik Bitemo! Je pensais ajouter une variable pour le chemin, puis j'ai réalisé que vous l'aviez déjà bien que cela n'ait pas été défini. 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
0
Ratan Mohapatra

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
0
Jhon Willmaure