43

Используя netstat -a -o -n я могу получить список портов и PID

тогда мне нужно пойти в диспетчер задач и добавить PID и посмотреть, кто это. (довольно расстраивает)

Мне было интересно, если есть команда CMD, которая делает все это (используя find , for , powershell)

чтобы я мог получить имя процесса

6 ответов6

49

Решение

Используйте параметр -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 аналогично использованию встроенной утилиты netstat в Windows.

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

Я думаю, что вы ищете TCPView от SysInternals.

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.

Наслаждайся этим ;)

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 могут быть добавлены путем добавления токенов.

0

Очень хороший Эрик Битемо! Я думал о добавлении переменной для пути, тогда я понял, что у вас уже есть это, хотя это не было определено. Итак, код, который я использовал повторно:

$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
0

Попробуйте использовать это ...

Имя процесса с отметкой времени :) в oneliner ... нет необходимости быстро и легко создавать сценарии ...

Вы можете изменить параметр SYN_SENT на ESTABLISHED или 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .