如何找出哪个进程正在侦听Windows上的TCP或UDP端口?

如何找出哪个进程正在侦听Windows上的TCP或UDP端口?

4877226 次浏览

PowerShell

tcp

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

UDP

Get-Process -Id (Get-NetUDPEndpoint -LocalPort YourPortNumberHere).OwningProcess

cmd

 netstat -a -b

(添加-n以阻止它尝试解析主机名,这将使其更快。)

注意Dane对TCPView的建议。它看起来非常有用!

-a显示所有连接和监听端口。

-b显示创建每个连接或侦听端口所涉及的可执行文件。在某些情况下,众所周知的可执行文件托管多个独立的组件,在这些情况下,会显示创建连接或侦听端口所涉及的组件序列。在这种情况下,可执行文件名称位于底部的[]中,顶部是它调用的组件,依此类推,直到达到TCP/IP。请注意,此选项可能很耗时,并且除非您有足够的权限,否则会失败。

-n以数字形式显示地址和端口号。

-o显示与每个连接关联的所属进程ID。

对于Windows:

netstat -aon | find /i "listening"

如果您想要一个GUI,请使用TCPView。这是Microsoft买断的旧系统内部应用程序。

如果您想使用GUI工具来执行此操作,则有系统内部的TCPView

  1. 打开命令提示符窗口(以管理员身份)从“开始\搜索框”输入“cmd”,然后右键单击“cmd.exe”并选择“以管理员身份运行”

  2. 输入以下文本,然后按回车键。

    netstat -abno

    -a显示所有连接和监听端口。

    -b显示创建每个连接或连接所涉及的可执行文件监听端口。在某些情况下,众所周知的可执行文件主机多个独立的组件,在这些情况下创建连接所涉及的组件序列或监听端口显示。在这种情况下,可执行文件名称在底部的[]中,顶部是它调用的组件,以此类推,直到达到TCP/IP。请注意,此选项可能是耗时的,除非你有足够的时间,否则会失败权限。

    -n以数字形式显示地址和端口号。

    -o显示与每个连接关联的所属进程ID。

  3. 在“本地地址”下找到您正在监听的端口

  4. 看看它下面的进程名。

注意:要在任务管理器下查找进程

  1. 注意您正在查看的端口旁边的PID(进程识别号)。

  2. 打开Windows任务管理器。

  3. 选择进程选项卡。

  4. 查找您在步骤1中执行netstat时注意到的PID。

    • 如果您没有看到PID列,请单击查看/选择列。选择PID。

    • 确保选中“显示所有用户的进程”。

按照这些工具:从cmdC:\> netstat -anob管理员权限。

进程浏览器

进程转储

端口监视器

全部来自sysinternals.com.

如果您只想了解每个进程下的进程运行和线程,我建议您学习wmic。它是一个很棒的命令行工具,它为您提供了比您所知道的更多的东西。

示例:

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

上面的命令将每5秒显示一个简短的所有进程列表。要了解更多信息,您可以使用windows的/?命令,例如,

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

等等,等等:)

用途:

netstat -a -o

这显示了在特定端口上运行的进程的PID。

记住进程ID并转到任务管理器和服务或详细信息选项卡并结束具有相同PID的进程。

因此,您可以终止在Windows中特定端口上运行的进程。

如果运行以下命令,您可以获取更多信息:

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

使用“查找”命令允许您过滤结果。find /i "listening"将仅显示“侦听”的端口。请注意,您需要/i来忽略大小写,否则您将键入“查找”。| find "port"将限制结果仅包含那些包含特定端口号的结果。请注意,在这种情况下,它还将过滤在响应字符串中任何位置具有端口号的结果。

netstat -aonetstat -ab告诉你应用程序,但如果你不是系统管理员,你会得到“请求的操作需要提升”。

这并不理想,但如果您使用SysInternals'进程浏览器,您可以转到特定进程的属性并查看TCP选项卡以查看他们是否正在使用您感兴趣的端口。这有点像针和大海捞针,但也许它会帮助某人…

要获取与每个连接关联的所有拥有进程ID的列表:

netstat -ao |find /i "listening"

如果想杀死任何进程,有ID并使用此命令,使端口变为空闲

Taskkill /F /IM PID of a process

有一个Windows的原生GUI:

  • 开始菜单→所有程序配件系统工具资源监控

  • 或运行resmon.exe

  • 或从任务调度性能选项卡。

在此输入图片描述

首先,我们找到特定任务的进程ID,我们需要消除它以获得端口自由:

类型

netstat -n -a -o

在Windows命令行提示符(cmd)中执行此命令后,选择我认为最后一列的pid。假设这是3312。

现在键入

taskkill /F /PID 3312

您现在可以通过键入netstat命令进行交叉检查。

注意:有时Windows不允许您直接在CMD上运行此命令,因此首先您需要执行以下步骤:

从开始菜单->命令提示符(右键单击命令提示符,并以管理员身份运行)

我推荐NirSoft的CurrPorts

CurrPorts可以过滤显示的结果。TCPView没有这个功能。

注意:您可以右键单击进程的套接字连接并选择“关闭选定的TCP连接”(您也可以在TCPView中执行此操作)。这通常会修复我在切换VPN后与Outlook和Lync的连接问题。使用CurrPorts,您还可以使用“/关闭”参数从命令行关闭连接。

获取PID和图像名称

只使用一个命令:

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

其中9000应替换为您的端口号。

输出将包含这样的内容:

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

说明:

  • 它遍历以下命令输出的每一行:

    netstat -aon | findstr 9000
  • from every line, the PID (%a - the name is not important here) is extracted (PID is the 5th element in that line) and passed to the following command

    tasklist /FI "PID eq 5312"

If you want to skip the header and the return of the command prompt, you can use:

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

输出:

java.exe                      5312 Services                   0    130,768 K

从Windows中的PID获取端口号非常简单。

以下是步骤:

  1. 转到运行→键入cmd→按enter

  2. 编写以下命令…

    netstat -aon | findstr [port number]

    (注:不包括方括号)

  3. 回车

  4. 然后cmd将为您提供在该端口上运行的服务的详细信息以及PID。

  5. 打开任务管理器并点击服务选项卡并将PID与cmd的匹配,就是这样。

使用Windows的默认shell(PowerShell),无需外部应用程序

对于使用PowerShell的用户,请尝试#0

> Get-NetworkStatistics | where Localport -eq 8000

ComputerName  : DESKTOP-JL59SC6Protocol      : TCPLocalAddress  : 0.0.0.0LocalPort     : 8000RemoteAddress : 0.0.0.0RemotePort    : 0State         : LISTENINGProcessName   : nodePID           : 11552

使用Windows 10或Windows Server 2016上的PowerShell 5,运行#0 cmdlet。我想它也应该适用于旧的Windows版本。

Get-NetTCPConnection的默认输出由于某种原因不包括进程ID,这有点令人困惑。但是,您始终可以通过格式化输出来获取它。您要查找的属性是OwningProcess

  • 如果您想找出监听端口443的进程的ID,请运行以下命令:

      PS C:\> Get-NetTCPConnection -LocalPort 443 | Format-List
    LocalAddress   : ::LocalPort      : 443RemoteAddress  : ::RemotePort     : 0State          : ListenAppliedSetting :OwningProcess  : 4572CreationTime   : 02.11.2016 21:55:43OffloadState   : InHost
  • 使用您查找的属性将输出格式化为表:

      PS C:\> Get-NetTCPConnection -LocalPort 443 | Format-Table -Property LocalAddress, LocalPort, State, OwningProcess
    LocalAddress LocalPort  State OwningProcess------------ ---------  ----- -------------::                 443 Listen          45720.0.0.0            443 Listen          4572
  • 如果您想找出进程的名称,请运行以下命令:

      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

输入命令:netstat -aon | findstr :DESIRED_PORT_NUMBER

例如,如果我想找到端口80:netstat -aon | findstr :80

这个答案最初发布到这个问题

对于Windows,如果要查找监听或连接到端口1234的内容,请在cmd提示符处执行以下操作:

netstat -na | find "1234"

只需打开一个命令shell并键入(假设您的端口是123456):

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

你会看到你需要的一切。

标题是:

 Proto  Local Address          Foreign Address        State           PIDTCP    0.0.0.0:37             0.0.0.0:0              LISTENING       1111

如上所述这里

使用PowerShell……这将是您的朋友(用您的端口号替换8080):

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

样本输出

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

因此,在此示例中tnslsnr.exe(OracleXE数据库)正在侦听端口8080。

快速解释

  • Select-String用于过滤netstat的相关行的冗长输出。
  • -Pattern根据正则表达式测试每一行。
  • -Context 0,1将为每个模式匹配输出0个前导行和1个尾随行。

大多数答案中提到的-b开关要求您对机器具有管理权限。您实际上不需要提升的权限来获取进程名称!

查找端口号中运行的进程的pid(例如8080)

netstat -ano | findStr "8080"

通过pid查找进程名称

tasklist /fi "pid eq 2216"

通过TCP/IP端口查找进程

使用下面的批处理脚本,该脚本将进程名称作为参数并为进程提供netstat输出。

@echo offset procName=%1for /f "tokens=2 delims=," %%F in ('tasklist /nh /fi "imagename eq %1" /fo csv') do call :Foo %%~Fgoto End
:Fooset z=%1echo netstat for : "%procName%" which had pid "%1"echo ----------------------------------------------------------------------
netstat -ano |findstr %z%goto :eof
:End

Netstat:

  • -a显示所有连接和监听端口
  • -b显示可执行文件
  • -n停止解析主机名(数字形式)
  • -o拥有进程

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

The Currports tool helps to search and filter

在编程上,您需要来自iphlppi. h的东西,例如GetTcpTable2远程监控()。像MIB_TCP6ROW2这样的结构包含所有者PID。

要找出哪个特定进程(PID)使用哪个端口:

netstat -anon | findstr 1234

其中1234是进程的PID。[转到任务管理器→服务/进程选项卡以查找应用程序的PID。]

帮助我的单线解决方案是这个。只需用您的端口替换3000:

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

编辑:将kill更改为Stop-Process以获得更多类似PowerShell的语言

  1. 打开命令提示符-开始→运行cmd,或开始菜单→所有程序附件命令提示符

  2. 类型

    netstat -aon | findstr '[port_number]'

Replace the [port_number] with the actual port number that you want to check and hit Enter.

  1. If the port is being used by any application, then that application’s detail will be shown. The number, which is shown at the last column of the list, is the PID (process ID) of that application. Make note of this.
  2. Type

    tasklist | findstr '[PID]'

Replace the [PID] with the number from the above step and hit Enter.

  1. You’ll be shown the application name that is using your port number.

基于信息一个命令3136177">杀死的答案,对我来说,在一个命令中组合它们很有用。你可以从cmd运行它来获取有关在给定端口上侦听的进程的信息(示例8080):

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

如果你想杀了它:

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

您还可以将这些命令放入bat文件中(它们会略有不同-将%i替换为%%i):

文件portInfo.bat

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

文件portKill.bat

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

那么你从cmd你可以这样做:

portInfo.bat 8080

portKill.bat 8080

查找使用端口8000的pid用户

netstat -aon | findstr '8000'

在Windows中杀死该进程

taskkill /pid pid /f

其中pid是您从第一个命令获得的进程ID

如果有人像我一样需要macOS的等价物,这里是:

lsof -i tcp:8080

在你得到进程的PID之后,你可以用:

kill -9 <PID>

您还可以使用下面的命令检查保留的端口。例如,hyper-v保留一些端口。

netsh int ipv4 show excludedportrange protocol=tcp

netstat -aof | findstr :8080(更改任何端口的8080)

PowerShell

如果你想有一个好的概述,你可以使用这个:

Get-NetTCPConnection -State Listen | Select-Object -Property *, `@{'Name' = 'ProcessName';'Expression'={(Get-Process -Id $_.OwningProcess).Name}} `| select ProcessName,LocalAddress,LocalPort

然后你得到一个这样的表:

ProcessName              LocalAddress  LocalPort-----------              ------------  ---------services                 ::                49755jhi_service              ::1               49673svchost                  ::                  135services                 0.0.0.0           49755spoolsv                  0.0.0.0           49672

对于UDP,它是:

Get-NetUDPEndpoint | Select-Object -Property *, `@{'Name' = 'ProcessName';'Expression'={(Get-Process -Id $_.OwningProcess).Name}} `| select ProcessName,LocalAddress,LocalPort