【问题标题】:How can you find out which process is listening on a TCP or UDP port on Windows? [closed]如何找出哪个进程正在侦听 Windows 上的 TCP 或 UDP 端口? [关闭]
【发布时间】:2010-09-08 01:43:38
【问题描述】:

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

【问题讨论】:

  • Currports 也是一个帮助搜索+过滤的工具nirsoft.net/utils/cports.html
  • 我在 IntelliJ 下尝试以调试模式运行 Tomcat 时遇到了这个问题,对我来说最好的解决方案是更改调试传输配置(File->Settings->Build/exe/deploy- >调试器)从“套接字”到“共享内存”。
  • netstat -aof | findstr :8080(为任何端口更改 8080)
  • @DavidJesus 在 Windows 10 上不显示进程。
  • @SmitJohnth 我使用netstat -aof | findstr :3306 在 Windows 10 上查找 MySQL 进程,并且工作起来很神奇。

标签: windows networking port


【解决方案1】:

新答案,powershell

TCP

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

UDP

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

旧答案,cmd

 C:\> netstat -a -b

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

请注意 Dane 对 TCPView 的建议。看起来很有用!

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

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

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

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

【讨论】:

  • 和 taskkill /PID 然后终止进程,如果合适的话使用 /F。
  • 您可能必须以管理员身份运行命令行 shell,否则您可能会收到有关权限不足的错误消息。右键单击 cmd.exe 时使用“以管理员身份运行”选项。
  • 有效,但需要提升权限。 Shift+右键单击命令图标 -> 以管理员身份运行
  • 获得 PID - 假设它是 1234 - 然后您可以使用 tasklist /fi "pid eq 1234" 找出进程的名称和其他详细信息。
  • @RodionSychev powershell 命令希望您将“portNumber”替换为您要查找的端口号。错误指出“portNumber”不是数字。
【解决方案2】:

有一个适用于 Windows 的原生 GUI:

  • 开始菜单 → 所有程序附件系统工具资源监视器

  • 或运行resmon.exe

  • 或从 TaskManagerPerformance 选项卡。

【讨论】:

  • 还显示绑定的防火墙状态(最后一列)。非常实用。
  • 您需要成为管理员(或该组中的管理员)才能运行它。
  • @bcorso,绑定到“unspecified address”是什么意思?
  • 也可以从任务管理器的“性能”选项卡中启动,至少在 Windows 10 中。(未检查其他版本。)
  • 上面@user4836454 的评论不正确:资源监视器确实显示带有侦听器的端口,即使这些端口没有网络连接。只需查看“侦听端口”部分而不是“TCP 连接”部分。
【解决方案3】:

对于 Windows:

netstat -aon | find /i "listening"

【讨论】:

  • +1 但请记住,如果您的 Windows 以英语以外的语言运行,您将不得不将“聆听”更改为本地术语。例如。 netstat -aon | find /i "abhören" 德语。
  • 在我的情况下它不起作用可能是因为引号符号,但解决方案 netstat -aon | findstr LISTENING 完美!
  • 我在尝试使用 PowerShell 在 W10 15063.729 上运行此命令时遇到错误:FIND: Parameter format not correct
  • 这个答案与“找出哪个进程 [name] 正在侦听 Windows 上的端口有什么关系?”
  • 如果在 Windows 上使用 git bash,则使用 //i 而不是 /i
【解决方案4】:

如果您需要 GUI,请使用 TCPView。这是微软收购的旧的Sysinternals 应用程序。

【讨论】:

  • 在我看来这是最好的选择,尤其是因为所有进程都在同一个列表中,您可以通过右键单击它们直接关闭进程。
  • 另外,这不需要管理员权限!
  • 我喜欢 TCPView。自 Windows XP 以来,它一直是我的首选!
【解决方案5】:

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

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

netstat -ano | findStr "8080"

通过pid查找进程名

tasklist /fi "pid eq 2216"

【讨论】:

    【解决方案6】:

    运行以下命令可以获得更多信息:

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

    使用“查找”命令可以过滤结果。 find /i "listening" 将仅显示“正在侦听”的端口。请注意,您需要 /i 忽略大小写,否则您将键入 find "LISTENING"。 | find "port" 会将结果限制为仅包含特定端口号的结果。请注意,在此它还将过滤在响应字符串中任何位置具有端口号的结果。

    【讨论】:

    • FWIW 尝试在 PowerShell v2.0 中运行它会产生错误 FIND: Parameter format not correct。您需要在查找条件之后添加一个空格。这将为您留下netstat -aon | find /i "listening" | find "1234 "
    • 将上面的“port”替换为您的端口,例如“5000”
    • @self。即使在管道后添加空格,我仍然会在 PS 5.1 中遇到该错误。你知道发生了什么吗?
    • @NickeManarinin & @self 要么首先从 powershell 更改为 cmd(只需键入 cmd 并按 enter 然后重做命令)或在 powershell 中使用此命令:netstat -aon |find /i "@987654327 @"listening{back tick}"" |find "{back tick}"port{back tick}"" (back tick这个词,因为我无法添加实际字符,因为它认为它是一个剪辑)
    【解决方案7】:
    1. 打开命令提示符窗口(以管理员身份)从“开始\搜索框”输入“cmd”,然后右键单击“cmd.exe”并选择“以管理员身份运行”

    2. 输入以下文本,然后按 Enter。

      netstat -abno

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

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

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

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

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

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

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

    1. 记下您正在查看的端口旁边的 PID(进程标识符)。

    2. 打开 Windows 任务管理器。

    3. 选择“进程”选项卡。

    4. 查找您在步骤 1 中执行 netstat 时记下的 PID。

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

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

    【讨论】:

      【解决方案8】:

      获取 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
        
      • 从每一行中提取 PID(%a - 名称在这里并不重要)(PID 是该行中的 5th 元素)并传递给以下命令

        tasklist /FI "PID eq 5312"
        

      如果您想跳过 标题并返回命令提示符,您可以使用:

      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
      

      【讨论】:

      • 好答案,但如果不是,您应该将其更改为findstr :9000,您甚至会找到包含该数字的应用程序(例如,当您搜索“80”时,您会在端口 80、800 上找到应用程序,也有 8000 个)。
      【解决方案9】:

      首先,我们找到需要消除的特定任务的进程 ID,以便释放端口:

      键入

      netstat -n -a -o
      

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

      现在输入

      taskkill /F /PID 3312
      

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

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

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

      【讨论】:

        【解决方案10】:

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

        netstat -ao |find /i "listening"
        

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

        Taskkill /F /IM PID of a process
        

        【讨论】:

        • 这不考虑监听 UDP 端口
        【解决方案11】:

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

        以下是步骤:

        1. 运行→输入cmd→按Enter

        2. 编写以下命令...

          netstat -aon | findstr [port number]
          

          (注意:不要包括方括号。)

        3. Enter...

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

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

        【讨论】:

          【解决方案12】:

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

          Get-NetTCPConnection 的默认输出由于某种原因不包含进程 ID,这有点令人困惑。但是,您始终可以通过格式化输出来获得它。您正在寻找的物业是OwningProcess

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

              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
            
          • 将输出格式化为具有您要查找的属性的表格:

              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
            
          • 如果您想找出进程的名称,请运行以下命令:

              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
            

          【讨论】:

            【解决方案13】:

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

            netstat -anon | findstr 1234
            

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

            【讨论】:

            • 需要注意的是,-n 标志不需要设置两次。 -ano 就够了。
            • 有时端口正在使用中,我们需要运行这些命令:net stop hns net start hns
            【解决方案14】:

            netstat -aof | findstr :8080(任意端口改成8080)

            【讨论】:

              【解决方案15】:

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

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

              你会看到你需要的一切。

              标题是:

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

              正如提到的here

              【讨论】:

              • 仅供参考/对于任何感兴趣的人:它是findstr 123456(不带引号)或find "123456"(带引号)。 (@Josh)
              【解决方案16】:

              如果您想使用 GUI 工具来执行此操作,请访问 Sysinternals' TCPView

              【讨论】:

                【解决方案17】:
                1. 打开命令提示符 - 开始 → 运行cmd,或开始菜单 → 所有程序附件 → 命令提示符。

                2. 类型

                  netstat -aon | findstr '[port_number]'
                  

                [port_number] 替换为您要检查的实际端口号,然后按Enter

                1. 如果任何应用程序正在使用该端口,则会显示该应用程序的详细信息。显示在列表最后一列的数字是该应用程序的 PID(进程 ID)。记下这一点。
                2. 类型

                  tasklist | findstr '[PID]'
                  

                [PID] 替换为上述步骤中的数字,然后按Enter

                1. 您将看到使用您的端口号的应用程序名称。

                【讨论】:

                • 在 Win 10 上:您在第 2 步和第 4 步中的命令不起作用,除非您将单引号替换为双引号。应该说 netstat -aon | findstr "[port_number]"
                • 此解决方案不需要提升权限。谢了!
                【解决方案18】:

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

                lsof -i tcp:8080

                在你得到进程的PID后,你可以杀死它:

                kill -9 <PID>

                【讨论】:

                  【解决方案19】:

                  网络统计:

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

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

                  Currports 工具有助于搜索和过滤

                  【讨论】:

                    【解决方案20】:

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

                    比如我要查找80端口:netstat -aon | findstr :80

                    这个答案最初发布到this question

                    【讨论】:

                      【解决方案21】:

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

                      这并不理想,但如果您使用 Sysinternals 的Process Explorer,您可以转到特定进程的属性并查看 TCP 选项卡以查看它们是否正在使用您感兴趣的端口。这有点针锋相对的事情,但也许它会帮助某人......

                      【讨论】:

                      • 如果您不是管理员,您将无法使用进程资源管理器(甚至 Windows 任务管理器 > 资源管理器)从任何不属于您的进程中获取此信息。
                      【解决方案22】:

                      我推荐 NirSoft 的 CurrPorts

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

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

                      【讨论】:

                        【解决方案23】:

                        对我有帮助的单行解决方案就是这个。只需将 3000 替换为您的端口即可:

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

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

                        【讨论】:

                        • 您可能不想自动终止该进程。我会分开那个 kill 命令并解释它。不希望一些糟糕的用户在不仔细考虑的情况下复制粘贴。
                        • 如果您要使用完整的 PowerShell 解决方案,请将 kill 更改为 Stop-Process Get-Process -Id (Get-NetTCPConnection -LocalPort 3000).OwningProcess | Stop-Process
                        【解决方案24】:

                        使用这些工具:来自 cmdC:\> netstat -anob,具有 Administrator 权限。

                        Process Explorer

                        Process Dump

                        Port Monitor

                        全部来自 sysinternals.com。

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

                        例子:

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

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

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

                        等等等等。 :)

                        【讨论】:

                        • PortMon(Port Monitor 后面的链接)用于监控 serialparallel 端口,而不是网络端口。
                        【解决方案25】:

                        使用 Windows 的默认 shell (powershell) 且不使用外部应用程序

                        对于使用 PowerShell 的用户,请尝试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
                        

                        【讨论】:

                        • 我不认为 Get-NetworkStatistics 是默认安装的。它返回给我以下信息:“Get-NetworkStatistics”一词未被识别为 cmdlet 的名称
                        • @AlejandroSanzDíaz 什么操作系统和构建?
                        • Windows 10 企业版 19044.1526
                        【解决方案26】:

                        用途:

                        netstat -a -o
                        

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

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

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

                        【讨论】:

                          【解决方案27】:

                          查找使用8000端口的pid

                          netstat -aon | findstr '8000'
                          

                          在 Windows 中终止该进程

                          taskkill /pid pid /f
                          

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

                          【讨论】:

                          • netstat -aon | findstr 8000。引号不需要。
                          • PID 是最后一列第一个命令返回的值。
                          【解决方案28】:

                          以编程方式,您需要来自iphlpapi.h 的内容,例如GetTcpTable2()。像 MIB_TCP6ROW2 这样的结构包含所有者 PID。

                          【讨论】:

                            【解决方案29】:

                            使用 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 个尾随行。

                            【讨论】:

                              【解决方案30】:

                              您还可以使用以下命令检查保留的端口。例如,Hyper-V 会保留一些端口。

                              netsh int ipv4 show excludedportrange protocol=tcp

                              【讨论】:

                                猜你喜欢
                                • 2010-09-08
                                • 1970-01-01
                                • 2017-06-04
                                • 2011-02-18
                                • 2015-01-31
                                • 2014-06-05
                                • 2015-03-18
                                • 2014-06-12
                                相关资源
                                最近更新 更多