netstat与进程名称?


46

使用netstat -a -o -n 我可以获得端口和PID的列表

然后我需要转到任务管理器并添加PID,然后查看它是谁。(非常令人沮丧)

在此处输入图片说明

我不知道是否有一个CMD命令,所有这一切(使用findforpowershell

这样我就可以得到进程名称


netstat -b作为管理员,例如netstat -abon。而exe的名称如下
barlop

Answers:


56

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

注意netstat -b除非从提升的命令提示符处运行,否则该命令将失败。

解决方法

过滤过程列表并找到您感兴趣的PID:

tasklist | findstr /c:"PID"  


替代解决方案

您可以Tcpvcon.exe改用。无需管理员权限。

Tcpvcon的用法与内置Windows netstat实用程序的用法类似。

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
你是男人。
罗伊·纳米尔

很好的答案,只是评论说我认为这很有趣,MS /?文档甚至说“此选项可能很耗时”!而且纯粹是愚蠢的Windows,这很耗时。Linux的netstat可以快速显示其可执行文件名称。并且Linux的可执行文件名称显示不需要root / admin权限
barlop

8

我认为您正在从SysInternals 寻找TCPView


我想知道是否有CMD命令可以完成所有工作
Royi Namir 2014年

继续-有一个TCPView命令行组件。
Leptonator

哦好的。想也许有人使用已经做到了,发现等
Royi纳米尔

这样做应该不难。.我敢打赌robvanderwoude.com上面有东西。在TCPView页面上-“ TCPView下载包含Tcpvcon,这是具有相同功能的命令行版本。”
Leptonator 2014年

很好的工具套件..如果不是msys和sis,我会使用nix框。:)
Eddie B

2

下面是使用的窗口的示例FOR来解析netstat输出然后DO tasklist/fi上PID过滤器,以显示进程名称。

最后发现是删除tasklist标题。

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

打印记录输出如

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

netstat可以通过添加标记来添加来自的其他字段。


该解决方案的优点包括:1. find用于过滤端口(相反,虽然netstat -b可以直接提供进程名称,但是通过其输出手动搜索很麻烦且容易出错);2.仅使用Windows本机命令,这更加灵活和独立。
尤英宇

1
可能的改进:1。采用findstr/R选项,而不是find利用正则表达式更好的搜索; 2. :443 *[[0-9]"用作仅过滤掉本地端口的模式。整个命令可能是FOR /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或@mark您能否阐明“ netstat可以通过添加标记来添加其他字段”?
伊夫·斯切尔普

2

如果您喜欢使用PS,则可以分叉此代码(注意:它是超基本的)

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

请注意,您可以尝试Path,而不是ProcessName得到一个完整的可执行文件的路径-它不会与系统服务的工作,虽然。另外,您可能希望将追加ProcessName到行尾,而不是替换PID值。

好好享受 ;)


1

尝试使用这个...

带有时间戳的进程名称:) in oneliner ...无需编写脚本即可快速便捷...

您可以通过ESTABLISHED或LISTENING更改参数SYN_SENT

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

我在想观察的ip:port上使用了一种模式。很棒的摘要!
Alex

0

Erik Bitemo非常好!我当时想为路径添加变量,但我意识到尽管没有定义,但您已经知道了。所以我重用的代码是:

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

我试图找到一个应用程序的流程和服务,在该应用程序中我使用了一些不同的2衬板。

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

我编辑Erik的问题,包括你的修复,因此,如果你愿意,你可以从你的答案和集中删除它与你的方法GetServiceGet-Process
flolilo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.