Como você pode descobrir qual processo está escutando uma porta no Windows?

2274

Como você pode descobrir qual processo está escutando uma porta no Windows?

Somente leitura
fonte
3
CurrPorts é uma ferramenta que ajuda a procurar + filtro também nirsoft.net/utils/cports.html
Nuvens azuis
1
Eu deparei com isso enquanto tentava executar o Tomcat no modo de depuração no IntelliJ, a melhor solução para mim foi alterar a configuração do transporte de depuração (Arquivo-> Configurações-> Compilar / exe / implantar-> Depurador) de "socket" para "memoria compartilhada".
TMN

Respostas:

2624

Nova resposta, PowerShell

Get-Process -Id (Get-NetTCPConnection -LocalPort portNumber).OwningProcess

Resposta antiga, cmd

 C:\> netstat -a -b

(Adicione -n para interromper a tentativa de resolver nomes de host, o que tornará muito mais rápido.)

Nota Recomendação de Dane para TCPView . Parece muito útil!

-a Exibe todas as conexões e portas de escuta.

-b Exibe o executável envolvido na criação de cada conexão ou porta de escuta. Em alguns casos, executáveis ​​conhecidos hospedam vários componentes independentes e, nesses casos, a sequência de componentes envolvidos na criação da porta de conexão ou de escuta é exibida. Nesse caso, o nome do executável está em [] na parte inferior, na parte superior está o componente chamado e assim por diante até o TCP / IP ser atingido. Observe que essa opção pode ser demorada e falhará, a menos que você tenha permissões suficientes.

-n Exibe endereços e números de porta em formato numérico.

-o Exibe o ID do processo proprietário associado a cada conexão.

Brad Wilson
fonte
252
-o para obter o PID
Laurent K
121
e taskkill / PID <pid> para finalizar o processo, usando / F, se apropriado.
BitMask777
81
Pode ser necessário executar o shell da linha de comando como administrador, caso contrário, você poderá receber uma mensagem de erro sobre privilégios insuficientes. Use a opção "Executar como administrador" ao clicar com o botão direito do mouse em cmd.exe.
Gruber
6
Funciona, mas requer permissão elevada. Shift + clique direito no ícone de comando -> Executar como administrador
Christian Bongiorno
18
Depois de obter o PID - digamos que seja 1234-, você poderá tasklist /fi "pid eq 1234"descobrir o nome e outros detalhes do processo.
Steve Chambers
2203

Há uma GUI nativa para Windows:

  • Menu Iniciar → Todos os programasAcessóriosFerramentas do sistemaMonitor de recursos

Ou Executar resmon.exe , ou na guia Desempenho do Gerenciador de Tarefas .

Enter image description here

bcorso
fonte
41
Também mostra o status do firewall da ligação (última coluna). Very util.
Raphael
8
Você precisa ser um administrador (ou nesse grupo) para executar isso.
precisa saber é o seguinte
2
@ bcorso, o que significa a ligação ao " endereço não especificado "?
Pacerier 22/01
5
Também pode ser iniciado a partir guia Desempenho do Gerenciador de Tarefas, pelo menos no Windows 10. (não tenho verificado outras versões.)
Mathieu K.
10
O comentário de @ user4836454 acima NÃO está correto: O Monitor de Recursos mostra portas com ouvintes, mesmo se não houver conexão de rede com essas portas. Basta olhar na seção "Portas de escuta" em vez da seção "Conexões TCP".
Jpsy
235

Use o TCPView se desejar uma GUI para isso. É o antigo aplicativo Sysinternals que a Microsoft comprou.

dinamarquês
fonte
9
Essa é a melhor opção, especialmente porque todos os processos estão na mesma lista e você pode fechar os processos diretamente clicando com o botão direito do mouse neles.
Andreas Lundgren
8
Além disso, isso não requer privilégios de administrador!
Janac Meena
222

Para Windows:

netstat -aon | find /i "listening"
aku
fonte
25
+1 Mas lembre-se de que, se o seu Windows funcionar em um idioma que não seja o inglês, você precisará alterar "ouvir" o termo nativo. Por exemplo, netstat -aon | find /i "abhören"para alemão.
Levite
2
No meu caso, não funcionou, talvez por causa do sinal de aspas, mas a solução netstat -aon | O findstr LISTENING funciona perfeitamente!
The Godfather
Isso funciona sem exigir privilégios elevados tão votados.
Vlad Schnakovszki 2/17/17
1
Estou recebendo um erro ao tentar executar este comando no W10 15063.729 com o PowerShell:FIND: Parameter format not correct
Nicke Manarin
1
Como essa resposta é relevante para "descobrir qual processo [nome] está escutando em uma porta no Windows?"
Pawel Cioch
137

A opção -b mencionada na maioria das respostas requer que você tenha privilégios administrativos na máquina. Você realmente não precisa de direitos elevados para obter o nome do processo!

Encontre o pid do processo em execução no número da porta (por exemplo, 8080)

netstat -ano | findStr "8080"

Encontre o nome do processo por pid

tasklist /fi "pid eq 2216"

encontrar processo pela porta TCP / IP

Ram Sharma
fonte
82

Você pode obter mais informações se executar o seguinte comando:

netstat -aon | find /i "listening" |find "port"

usar o comando 'Localizar' permite filtrar os resultados. find /i "listening"exibirá apenas as portas que estão 'ouvindo'. Observe que você precisa /iignorar maiúsculas e minúsculas; caso contrário, digite "LISTENING". | find "port"limitará os resultados apenas àqueles que contêm o número da porta específico. Observe que isso também filtrará os resultados com o número da porta em qualquer lugar da sequência de respostas.

Nathan24
fonte
8
FWIW tentando executar isso no PowerShell v2.0 gera erro FIND: Parameter format not correct. Você precisa adicionar um espaço após os critérios de localização. Isso vai deixar você com netstat -aon | find /i "listening" | find "1234 ".
eu.
2
Substitua "port" acima por sua porta, ex "5000"
jbooker
1
@auto. Ainda recebo esse erro no PS 5.1, mesmo depois de adicionar o espaço após o pipe. Você sabe o que está acontecendo?
Nicke Manarin
2
O @NickeManarinin & @self muda primeiro de powershell para cmd (basta digitar cmd e pressione enter e refazer o comando) ou, no powershell, use este comando: netstat -aon | find / i " {back tick}" listening {back tick}"" | find " {back tick}" port {back tick}" "(<- observe as aspas que escaparam - desculpe o termo, back tickpois eu não posso adicionar o caractere real, pois ele acha que é um recorte)"
Tristan van Dam
72
  1. Abra uma janela do prompt de comando (como administrador) Em "Iniciar \ caixa de pesquisa", digite "cmd" e clique com o botão direito do mouse em "cmd.exe" e selecione "Executar como administrador"

  2. Digite o texto a seguir e pressione Enter.

    netstat -abno

    -a Exibe todas as conexões e portas de escuta.

    -b Exibe o executável envolvido na criação de cada conexão ou porta de escuta. Em alguns casos, executáveis ​​conhecidos hospedam vários componentes independentes e, nesses casos, a sequência de componentes envolvidos na criação da porta de conexão ou de escuta é exibida. Nesse caso, o nome do executável está em [] na parte inferior, na parte superior está o componente chamado e assim por diante até o TCP / IP ser atingido. Observe que essa opção pode ser demorada e falhará, a menos que você tenha permissões suficientes.

    -n Exibe endereços e números de porta em formato numérico.

    -o Exibe o ID do processo proprietário associado a cada conexão.

  3. Encontre a porta que você está ouvindo em "Endereço local"

  4. Veja o nome do processo diretamente abaixo.

NOTA: Para encontrar o processo no Gerenciador de tarefas

  1. Observe o PID (identificador do processo) próximo à porta que você está visualizando.

  2. Abra o Gerenciador de tarefas do Windows.

  3. Selecione a guia Processos.

  4. Procure o PID que você anotou quando fez o netstat na etapa 1.

    • Se você não vir uma coluna PID, clique em Exibir / selecionar colunas. Selecione PID.

    • Verifique se a opção "Mostrar processos de todos os usuários" está selecionada.

Cyborg
fonte
56

Obter PID e nome da imagem

Use apenas um comando:

for /f "tokens=5" %a in ('netstat -aon ^| findstr 9000') do tasklist /FI "PID eq %a"

onde 9000deve ser substituído pelo número da sua porta.

A saída conterá algo como isto:

Image Name                     PID Session Name        Session#    Mem Usage
========================= ======== ================ =========== ============
java.exe                      5312 Services                   0    130,768 K

Explicação:

  • itera através de todas as linhas da saída do seguinte comando:

    netstat -aon | findstr 9000
    
  • de cada linha, o PID ( %a- o nome não é importante aqui) é extraído (PID é o elemento 5th nessa linha) e passado para o seguinte comando

    tasklist /FI "PID eq 5312"
    

Se você quiser pular o cabeçalho e o retorno do prompt de comando , poderá usar:

echo off & (for /f "tokens=5" %a in ('netstat -aon ^| findstr 9000') do tasklist /NH /FI "PID eq %a") & echo on

Resultado:

java.exe                      5312 Services                   0    130,768 K
ROMANIA_engineer
fonte
2
Boa resposta, mas você deve alterá-lo para findstr :9000caso contrário, você encontrará aplicativos que contêm o número (por exemplo, ao pesquisar "80", você encontrará aplicativos nas portas 80, 800, 8000 também).
Radon8472
48

Primeiro, encontramos o ID do processo dessa tarefa específica que precisamos eliminar para liberar a porta:

Tipo

netstat -n -a -o

Depois de executar este comando no prompt da linha de comando do Windows (cmd), selecione o pid que eu acho que a última coluna. Suponha que seja 3312.

Agora digite

taskkill /F /PID 3312

Agora você pode fazer a verificação cruzada digitando o netstat comando

NOTA: às vezes, o Windows não permite que você execute este comando diretamente no CMD; portanto, primeiro você precisa seguir estas etapas:

No menu Iniciar -> prompt de comando (clique com o botão direito do mouse no prompt de comando e execute como administrador)

Pankaj Pateriya
fonte
30

Para obter uma lista de todos os IDs de processos proprietários associados a cada conexão:

netstat -ao |find /i "listening"

Se quiser matar qualquer processo, tenha o ID e use este comando, para que a porta fique livre

Taskkill /F /IM PID of a process
Monis Majeed
fonte
1
isso não conta para escutar portas UDP
evandrix
27

É muito simples obter o número da porta de um PID no Windows.

A seguir estão as etapas:

  1. Vá para executar → digite cmd → pressione Enter.

  2. Escreva o seguinte comando ...

    netstat -aon | findstr [port number]
    

    (Nota: não inclua colchetes.)

  3. Pressione Enter...

  4. Em seguida, o cmd fornecerá os detalhes do serviço em execução nessa porta junto com o PID.

  5. Abra o Gerenciador de tarefas, clique na guia Serviço e combine o PID com o do cmd, e é isso.

Nishat Lakhani
fonte
18

Basta abrir um shell de comando e digite (dizendo que sua porta é 123456):

netstat -a -n -o | find "123456"

Você verá tudo o que precisa.

Os cabeçalhos são:

 Proto  Local Address          Foreign Address        State           PID
 TCP    0.0.0.0:37             0.0.0.0:0              LISTENING       1111

Isto é como mencionado aqui .

Tajveer Singh Nijjar
fonte
1
FYI / para qualquer pessoa interessada: é findstr 123456(sem aspas) ou find "123456"(com aspas). (@Josh)
Kevin Cruijssen
18

Para descobrir qual processo específico (PID) está usando qual porta:

netstat -anon | findstr 1234

Onde 1234 é o PID do seu processo. [Vá para o Gerenciador de tarefas → guia Serviços / processos para descobrir o PID do seu aplicativo.]

Talha Imam
fonte
1
Deve-se observar que você não precisa do -nsinalizador definido duas vezes. -anobasta.
mwieczorek 29/03/19
16

Com o PowerShell 5 no Windows 10 ou Windows Server 2016, execute o Get-NetTCPConnectioncmdlet. Eu acho que também deve funcionar em versões mais antigas do Windows.

A saída padrão de Get-NetTCPConnectionnão inclui o ID do processo por algum motivo e é um pouco confuso. No entanto, você sempre pode obtê-lo formatando a saída. A propriedade que você está procurando é OwningProcess.

  • Se você deseja descobrir o ID do processo que está atendendo na porta 443, execute este comando:

    PS C:\> Get-NetTCPConnection -LocalPort 443 | Format-List
    
    LocalAddress   : ::
    LocalPort      : 443
    RemoteAddress  : ::
    RemotePort     : 0
    State          : Listen
    AppliedSetting :
    OwningProcess  : 4572
    CreationTime   : 02.11.2016 21:55:43
    OffloadState   : InHost
    
  • Formate a saída em uma tabela com as propriedades que você procura:

    PS C:\> Get-NetTCPConnection -LocalPort 443 | Format-Table -Property LocalAddress, LocalPort, State, OwningProcess
    
    LocalAddress LocalPort  State OwningProcess
    ------------ ---------  ----- -------------
    ::                 443 Listen          4572
    0.0.0.0            443 Listen          4572
    
  • Se você deseja descobrir um nome do processo, execute este comando:

    PS C:\> Get-Process -Id (Get-NetTCPConnection -LocalPort 443).OwningProcess
    
    Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
    -------  ------    -----      -----     ------     --  -- -----------
    143      15     3448      11024              4572   0 VisualSVNServer
    
bahrep
fonte
13

Digite o comando: netstat -aon | findstr :DESIRED_PORT_NUMBER

Por exemplo, se eu quiser encontrar a porta 80: netstat -aon | findstr :80

Esta resposta foi originalmente publicada nesta pergunta .

Technotronic
fonte
11

Netstat:

  • -a exibe todas as portas de conexão e escuta
  • -b exibe executáveis
  • -n para resolver nomes de host (formato numérico)
  • -o processo de propriedade

    netstat -bano | findstr "7002"
    
    netstat -ano > ano.txt 
    

A ferramenta Currports ajuda a pesquisar e filtrar

Nuvens azuis
fonte
11
  1. Abra o prompt de comando - inicie → Executarcmdou menu Iniciar → Todos os programasAcessóriosPrompt de comando .

  2. Tipo

    netstat -aon | findstr '[port_number]'
    

Substitua pelo [port_number]número da porta real que você deseja verificar e pressione Enter.

  1. Se a porta estiver sendo usada por qualquer aplicativo, os detalhes desse aplicativo serão mostrados. O número, mostrado na última coluna da lista, é o PID (ID do processo) desse aplicativo. Anote isso.
  2. Tipo

    tasklist | findstr '[PID]'
    

Substitua o [PID]número pela etapa acima e pressione Enter.

  1. Você verá o nome do aplicativo que está usando o número da porta.
Anatole ABE
fonte
3
No Win 10: Seu comando nas etapas 2 e 4 não funciona, a menos que você substitua aspas simples por aspas duplas. Deveria dizer netstat -aon | findstr "[port_number]"
Leonardo Lopez
Esta solução não requer permissão elevada. Tks!
Totalys 24/04
10

netstat -aoe netstat -abinforme o aplicativo, mas se você não for um administrador do sistema, receberá "A operação solicitada requer elevação".

Não é o ideal, mas se você usar o Process Explorer da Sysinternals, poderá acessar as propriedades de processos específicos e ver a guia TCP para ver se eles estão usando a porta na qual você está interessado. É um pouco de agulha e palheiro coisa, mas talvez ajude alguém ...

Tony Delroy
fonte
Se você não for um administrador, não poderá usar o Process Explorer (ou mesmo o Windows Task Manager> Resource Manager) para obter essas informações de qualquer processo que não seja seu, para começar.
Abel
9

Eu recomendo CurrPorts da NirSoft.

CurrPorts pode filtrar os resultados exibidos. O TCPView não possui esse recurso.

Nota: Você pode clicar com o botão direito do mouse na conexão de soquete de um processo e selecionar "Fechar conexões TCP selecionadas" (você também pode fazer isso no TCPView). Isso geralmente corrige os problemas de conectividade que tenho com o Outlook e o Lync depois de mudar de VPN. Com CurrPorts, você também pode fechar conexões da linha de comando com o parâmetro "/ close".

Josh
fonte
7

Uma solução de linha única que me ajuda é essa. Apenas substitua 3000 por sua porta:

$P = Get-Process -Id (Get-NetTCPConnection -LocalPort 3000).OwningProcess; Stop-Process $P.Id

Editar: alterado killpara Stop-Processpara um idioma mais semelhante ao PowerShell

Angel Venchev
fonte
6
Você provavelmente não quer matar o processo automaticamente. Eu separaria esse comando de matar e o explicaria. Não queira que um usuário pobre copie e cole isso sem pensar com cuidado.
TinkerTenorSoftwareGuy
1
E se você estiver Get-Process -Id (Get-NetTCPConnection -LocalPort 3000).OwningProcess | Stop-Process
procurando pela
6

Siga estas ferramentas: No cmd : C:\> netstat -anobcom privilégios de administrador .

Process Explorer

Process Dump

Monitor de porta

Todos de sysinternals.com.

Se você quiser apenas conhecer o processo em execução e os threads em cada processo, recomendo que você aprenda wmic. É uma ferramenta de linha de comando maravilhosa, que oferece muito mais do que você pode saber.

Exemplo:

c:\> wmic process list brief /every:5

O comando acima mostrará uma lista de todos os processos em breve a cada 5 segundos. Para saber mais, você pode simplesmente usar o /?comando do Windows, por exemplo,

c:\> wmic /?
c:\> wmic process /?
c:\> wmic prcess list /?

E assim por diante. :)

Perl Fanatic
fonte
O PortMon (o link por trás do Port Monitor) é para monitorar portas seriais e paralelas , não portas de rede.
James
6

Usar:

netstat -a -o

Isso mostra o PID do processo em execução em uma porta específica.

Lembre-se do ID do processo e vá para o Gerenciador de tarefas e a guia Serviços ou Detalhes e termine o processo com o mesmo PID.

Assim, você pode matar um processo em execução em uma porta específica do Windows.

nisha
fonte
6

Para aqueles que usam o PowerShell, tente Get-NetworkStatistics:

> Get-NetworkStatistics | where Localport -eq 8000


ComputerName  : DESKTOP-JL59SC6
Protocol      : TCP
LocalAddress  : 0.0.0.0
LocalPort     : 8000
RemoteAddress : 0.0.0.0
RemotePort    : 0
State         : LISTENING
ProcessName   : node
PID           : 11552
mikemaccana
fonte
5

Usando o PowerShell ... ... este seria seu amigo (substitua 8080 pelo número da porta):

 netstat -abno | Select-String -Context 0,1 -Pattern 8080

Saída de amostra

>   TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING         2920
   [tnslsnr.exe]
>   TCP    [::]:8080              [::]:0                 LISTENING         2920
   [tnslsnr.exe]

Portanto, neste exemplo, o tnslsnr.exe (banco de dados OracleXE) está escutando na porta 8080.

Explicação rápida

  • Select-Stringé usado para filtrar a saída longa das netstatlinhas relevantes.
  • -Pattern testa cada linha contra uma expressão regular.
  • -Context 0,1 produzirá 0 linhas iniciais e 1 linha final para cada correspondência de padrão.
Jpsy
fonte
2

No Windows, se você deseja encontrar coisas que estão ouvindo ou conectadas à porta 1234, execute o seguinte no prompt de cmd:

netstat -na | find "1234"
Aproximação aproximação
fonte
1

Use o script em lotes abaixo, que usa um nome de processo como argumento e fornece netstatsaída para o processo.

@echo off
set procName=%1
for /f "tokens=2 delims=," %%F in ('tasklist /nh /fi "imagename eq %1" /fo csv') do call :Foo %%~F
goto End

:Foo
set z=%1
echo netstat for : "%procName%" which had pid "%1"
echo ----------------------------------------------------------------------

netstat -ano |findstr %z%
goto :eof

:End
deshapriya debesh
fonte
1

Com base em respostas com informações e kill , para mim é útil combiná-las em um único comando . E você pode executar isso a partir do cmd para obter informações sobre o processo que escuta em determinada porta (exemplo 8080):

for /f "tokens=3 delims=LISTENING" %i  in ('netstat -ano ^| findStr "8080" ^| findStr "["') do @tasklist /nh /fi "pid eq %i"

Ou se você quiser matá-lo:

for /f "tokens=3 delims=LISTENING" %i  in ('netstat -ano ^| findStr "8080" ^| findStr "["') do @Taskkill /F /IM %i

Você também pode colocar esses comandos em um arquivo bat (eles serão um pouco diferentes - substitua %ipor %%i):

Arquivo portInfo.bat

for /f "tokens=3 delims=LISTENING" %%i  in (
    'netstat -ano ^| findStr "%1" ^| findStr "["'
) do @tasklist /nh /fi "pid eq %%i"

Arquivo portKill.bat

for /f "tokens=3 delims=LISTENING" %%i  in (
    'netstat -ano ^| findStr "%1" ^| findStr "["'
) do @Taskkill /F /IM %%i

Então, do cmd, você pode fazer isso:

portInfo.bat 8080

ou

portKill.bat 8080

lczapski
fonte
1
Este pode ser um script útil. No entanto, tentei no CMD e no PowerShell 6 sem sorte. Talvez você possa melhorar sua resposta, fornecendo um pouco mais de detalhes.
Manfred
A primeira parte está funcionando? É apenas um problema com "morcego"? Existem algumas diferenças nas variáveis ​​de passagem: (%% i)
lczapski
@Manfred Eu tentei isso em 3 diferentes Windows 10. Por exemplo, .\portInfo.bat 800no PowerShell, é algo parecido com isto:C:\work>for /F "tokens=3 delims=LISTENING" %i in ('netstat -ano | findStr "800" | findStr "["') do (tasklist /fi "pid eq %i" ) C:\work>(tasklist /fi "pid eq 4" ) Image Name PID Session Name Session# Mem Usage ========================= ======== ================ =========== ============ System 4 Services 0 1,820 K
lczapski
Desculpe, sem sorte. Coloquei esse comando em um arquivo nomeado portInfo.batem um terminal do PowerShell e, em seguida, executei .\portInfo.bat 8080. A saída foi apenas o conteúdo do arquivo em lotes. Muito bem possível, estou olhando para algo. Observe que estou usando o PowerShell 6.2.3 no Windows 10. Também tentei em um prompt de comando regular, mas o resultado foi o mesmo: Saída do conteúdo do script. Tenho certeza de que estou perdendo uma informação crucial para fazer esse trabalho.
Manfred
1
Por que não adicionar /nh: @tasklist /nh /fi "pid eq %i"? E precisamente a porta:Findstr ":8080"
Não fui eu
0

No meu caso, a porta (3000) não foi usada e não é visível no netstat. Mas! O desinstalador Docker para Windows resolveu o problema.

Tony Sepia
fonte