Determinar qué proceso ha vinculado un puerto (sin escuchar) en Windows

Determinar qué proceso ha vinculado un puerto (sin escuchar) en Windows

Si quiero saber cual es el procesoescuchandoen qué socket puedo usar netstat/TCPview y lo veré inmediatamente. Sin embargo, es posible vincularse a una dirección sin escuchar. Si se hace esto, no aparece en netstat/TCPview, pero bloquea el socket.

Ejemplo de Python:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0',12345))

El puerto ahora está vinculado y si intenta ejecutar el mismo código en una segunda instancia mientras la primera aún se está ejecutando, se producirá un error. Sin embargo, a menos que realmente empieces a escuchar en ese puerto usando

s.listen(1)

el puerto no aparece en netstat/TCPview.

La pregunta es: ¿Es posible ver qué puertos son?atado(pero sin escuchar) y ¿qué proceso los vincula?

El trasfondo de esto es que he tenido unarango móvil de 1976 puertos que no se pueden vincular, y quiero saber qué causa esto. Mientras tanto, determiné mediante prueba y error que la Conexión compartida a Internet estaba bloqueando esos puertos, pero todavía tengo curiosidad por saber la respuesta a esta pregunta.

Editar:Debido a una solicitud popular, aquí está el código que utilicé para encontrar esos puertos:

import time
import socket

for i in range(0,65536):
    try:
        print "Listening on port", i, '...', 
        serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        serversocket.bind(('0.0.0.0', i))
        serversocket.listen(5)
        #time.sleep(0.1)
        serversocket.close()
        print "ok"
    except:
        print "FAIL"

(es posible que desee canalizar la salida a grep y filtrar solo por FALLO)

Respuesta1

Tuve que hacer exactamente esto hoy. Powershell puede hacerlo con Get-NetTCPConnection.

PS C:\WINDOWS\system32> Get-NetTCPConnection -LocalPort 53100

LocalAddress                        LocalPort RemoteAddress                       RemotePort State       AppliedSetting OwningProcess
------------                        --------- -------------                       ---------- -----       -------------- -------------
0.0.0.0                             53100     0.0.0.0                             0          Bound                      40120


PS C:\WINDOWS\system32> get-process -PID 40120

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
   2133    1331    13884      30740  30,955.31  40120   1 HWMonitorPro

Respuesta2

En versiones recientes de netstat ahora hay un parámetro de línea de comando -q que muestra esos sockets.

$ netstat -?

Displays protocol statistics and current TCP/IP network connections.

NETSTAT [-a] [-b] [-e] [-f] [-n] [-o] [-p proto] [-r] [-s] [-x] [-t] [interval]

  -a            Displays all connections and listening ports.
  -b            Displays the executable involved in creating...
  ...
  -p proto      Shows connections for the protocol specified...
  -q            Displays all connections, listening ports, and bound
                nonlistening TCP ports. Bound nonlistening ports may or may not
                be associated with an active connection.
  -r            Displays the routing table.
  ...

Ejemplo de uso:

$ netstat -nq -p tcp

Active Connections

  Proto  Local Address          Foreign Address        State
  TCP    0.0.0.0:7              0.0.0.0:0              LISTENING
  TCP    0.0.0.0:9              0.0.0.0:0              LISTENING
  TCP    0.0.0.0:13             0.0.0.0:0              LISTENING
  ...

 TCP    192.168.122.157:50059  54.213.66.195:443      ESTABLISHED
  TCP    0.0.0.0:49676          0.0.0.0:0              BOUND
  TCP    0.0.0.0:49700          0.0.0.0:0              BOUND
  TCP    0.0.0.0:49704          0.0.0.0:0              BOUND
  TCP    0.0.0.0:49705          0.0.0.0:0              BOUND
  ...

Parece que no existe una API pública para obtener los sockets en esa situación. Mira mipregunta en StackOverflow.

Respuesta3

Deberías usar

DWORD GetExtendedTcpTable (PVOID pTcpTable,PDWORD pdwSize, BOOL border, ULONG ulAf, TCP_TABLE_CLASS TableClass,ULONG Reserved);

con

Valor de TableClass = TCP_TABLE_OWNER_PID_ALL "o" TCP_TABLE_OWNER_PID_CONNECTIONS "o" TCP_TABLE_OWNER_PID_LISTENER

Estructura pTcpTable -> MIB_TCPTABLE_OWNER_PID

dependiendo de la información que quieras recuperar

EDITAR:

TCP_TABLE_OWNER_PID_ALL devuelve la estructura MIB_TCPTABLE_OWNER_PID que es una matriz de estructuras MIB_TCPROW_OWNER_PID donde cada una dwStatedebe tener MIB_TCP_STATE_CLOSEDcuando está vinculada y no escuchando, esta estructura también ofrece dwLocalAddrydwLocalPort

typedef struct _MIB_TCPROW_OWNER_PID {
  DWORD dwState;
  DWORD dwLocalAddr;
  DWORD dwLocalPort;
  DWORD dwRemoteAddr;
  DWORD dwRemotePort;
  DWORD dwOwningPid;
} MIB_TCPROW_OWNER_PID, *PMIB_TCPROW_OWNER_PID;

información relacionada