netstat mit Prozessname?

46

Mit netstat -a -o -n kann ich die Liste der Ports und PID erhalten

Dann muss ich zum Task-Manager gehen und die PID hinzufügen und sehen, wer es ist. (ziemlich frustrierend)

Bildbeschreibung hier eingeben

Ich war verwundert , wenn es ein CMD - Befehl ist , der macht alles (mit find, for, powershell)

damit ich den Prozessnamen bekommen konnte

Royi Namir
quelle
netstat -b als admin, zB netstat -abon. Und der Name der Exe ist unten
Barlop

Antworten:

56

Lösung

Verwenden Sie den -bParameter:

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

Hinweis: Der netstat -bBefehl schlägt fehl, wenn er nicht an einer Eingabeaufforderung mit erhöhten Rechten ausgeführt wird.

Umgehung

Filtern Sie die Prozessliste und finden Sie die PID, die Sie interessiert:

tasklist | findstr /c:"PID"  


Alternative Lösung

Sie können Tcpvcon.exestattdessen verwenden. Keine Administratorrechte erforderlich.

Die Verwendung von Tcpvcon ähnelt der des integrierten Windows- netstatDienstprogramms.

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.
und31415
quelle
1
du bist der Mann.
Royi Namir
gute antwort, nur zu kommentieren, dass ich es amüsant finde, wie die ms /? Dokumentation sagt sogar "diese Option kann zeitaufwändig sein"! und es ist nur eine Dummheit von Fenstern, dass es zeitaufwändig ist. Linuxs netstat zeigt seinen ausführbaren Namen schnell an. Für die Anzeige des ausführbaren Namens von Linux sind keine Root- / Administratorrechte erforderlich
barlop
8

Ich denke, Sie suchen nach TCPView von SysInternals.

Leptonator
quelle
Ich habe mich gefragt, ob es einen CMD- Befehl gibt, der alles kann
Royi Namir
Weiter so - Es gibt eine Befehlszeilen-Komponente von TCPView.
Leptonator
Oh ok.
Ich
Es sollte nicht zu schwer sein. Ich würde wetten, dass robvanderwoude.com etwas drauf hat. Auf der TCPView-Seite - "Der TCPView-Download enthält Tcpvcon, eine Befehlszeilenversion mit derselben Funktionalität."
Leptonator
Sehr gute Toolsuite. Ohne msys und sis würde ich eine Nix-Box verwenden. :)
Eddie B
2

Hier ist ein Beispiel für Windows, das verwendet wird FOR, um die netstatAusgabe zu analysieren und anschließend DO tasklistmit dem /fiFilter auf pid den Prozessnamen anzuzeigen.

Der letzte Fund besteht darin, tasklistHeader zu entfernen .

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

druckt Datensätze wie ausgegeben

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

Zusätzliche Felder von netstatkönnen durch Hinzufügen von Tokens hinzugefügt werden.

Kennzeichen
quelle
Vorteile dieser Lösung: 1. Verwenden findzum Herausfiltern von Ports (im Gegensatz dazu netstat -bkann der Prozessname zwar direkt angegeben werden, das manuelle Durchsuchen der Ausgabe ist jedoch schmerzhaft und fehleranfällig); 2. Verwenden Sie nur native Windows-Befehle, dies ist flexibler und unabhängiger.
Yingyu SIE
1
Mögliche Verbesserung: 1. findstrmit /ROption verwenden, anstatt findRegex für eine bessere Suche zu verwenden; 2. :443 *[[0-9]"als Muster verwenden, um nur den lokalen Port herauszufiltern . Das ganze Kommando könnte lautenFOR /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 oder @mark Könnten Sie klären, ob netstatdurch Hinzufügen von Tokens zusätzliche Felder aus hinzugefügt werden können?
Yves Schelpe
2

Wenn Sie gerne PS verwenden, können Sie diesen Code abspalten (Hinweis: Es ist super-einfach)

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

Beachten Sie, dass Sie versuchen können , Pathstatt ProcessNamezu bekommen einen vollständigen Pfad für ausführbare Dateien - es wird allerdings nicht mit Systemdiensten zu arbeiten. Sie können auch das ProcessNamean das Zeilenende anhängen , anstatt den PID-Wert zu ersetzen.

Geniesse es ;)

Erik Bitemo
quelle
1

Versuchen Sie, dies zu verwenden ...

Prozessname mit Zeitstempel :) in oneliner ... kein Scripting nötig, schnell und einfach ...

Sie können den Parameter SYN_SENT durch ESTABLISHED oder LISTENING ändern

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
quelle
Ich habe dies mit einem Muster auf dem ip: port verwendet, das ich beobachten wollte. Toller Ausschnitt!
Alex
0

Sehr schöner Erik Bitemo! Ich habe überlegt, eine Variable für den Pfad hinzuzufügen. Dann habe ich festgestellt, dass Sie diese Variable bereits haben, obwohl sie nicht definiert wurde. Der Code, den ich wiederverwendete, war also:

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

Ich habe versucht, die Prozesse und Dienste für eine Anwendung zu finden, bei der ich einen etwas anderen 2-Liner verwendet habe.

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
quelle
Ich habe Eriks Frage so bearbeitet, dass sie Ihre Korrektur enthält. Wenn Sie möchten, können Sie sie aus Ihrer Antwort löschen und sich auf Ihre Vorgehensweise mit GetServiceund konzentrieren Get-Process.
Flolilo