2014-01-26 16:07:42 +0000 2014-01-26 16:07:42 +0000
46
46

netstat与进程名?

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

然后我需要去任务管理器添加PID,看看是谁。(相当令人沮丧)

我想知道是否有一个CMD命令可以完成这一切(使用findforpowershell)

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

答案 (6)

56
56
56
2014-01-26 18:06:00 +0000

使用-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.
``` 你可以使用0x6&代替。
8
8
8
2014-01-26 16:12:23 +0000

我想你要找的是SysInternals的 TCPView

2
2
2
2016-05-13 02:17:35 +0000

下面是一个windows的例子,使用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的附加字段可以通过添加标记来增加。

2
2
2
2016-03-07 22:14:01 +0000

如果你喜欢使用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
1
1
2018-02-11 10:10:26 +0000

尝试使用这个…

带有时间戳的进程名称:) 在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
``` 在oneliner中,你可以通过ESTABLISHED或LISTENING来改变参数SYN\_SENT。
0
0
0
2017-10-07 12:37:30 +0000

非常好的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