Ermitteln, welcher Prozess einen Port unter Windows gebunden hat (ohne zu lauschen)

Ermitteln, welcher Prozess einen Port unter Windows gebunden hat (ohne zu lauschen)

Wenn ich herausfinden möchte, welcher ProzessHörenauf welchem ​​Socket, kann ich netstat/TCPview verwenden und werde es sofort sehen. Es ist jedoch möglich, eine Bindung an eine Adresse vorzunehmen, ohne zuzuhören. Wenn dies getan wird, wird es nicht in netstat/TCPview angezeigt, blockiert aber den Socket.

Python-Beispiel:

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

Der Port ist nun gebunden und der Versuch, denselben Code in einer zweiten Instanz auszuführen, während die erste noch läuft, führt zu einem Fehler. Wenn Sie jedoch nicht tatsächlich mit dem Abhören dieses Ports beginnen, indem Sie

s.listen(1)

der Port wird in Netstat/TCPview nicht angezeigt.

Die Frage ist: Ist es möglich zu sehen, welche Portsgebunden(aber nicht zuhören) und welcher Prozess bindet sie?

Der Hintergrund hierfür ist, dass ich einegleitender Bereich von 1976 Ports, die nicht gebunden werden können, und ich möchte wissen, woran das liegt. In der Zwischenzeit habe ich durch Ausprobieren herausgefunden, dass die gemeinsame Nutzung der Internetverbindung diese Ports blockiert, aber ich bin immer noch neugierig auf die Antwort auf diese Frage.

Bearbeiten:Aufgrund der hohen Nachfrage ist hier der Code, den ich zum Suchen dieser Ports verwendet habe:

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"

(Sie möchten möglicherweise die Ausgabe an grep weiterleiten und nur nach FAIL filtern)

Antwort1

Genau das musste ich heute machen. Powershell kann das mit 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

Antwort2

In neueren Versionen von netstat gibt es jetzt einen Befehlszeilenparameter -q, der diese Sockets anzeigt.

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

Anwendungsbeispiel:

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

Es scheint, dass es in dieser Situation keine öffentliche API gibt, um die Sockets zu erhalten. Siehe meineFrage in StackOverflow.

Antwort3

du solltest benutzen

DWORD GetExtendedTcpTable (PVOID pTcpTable, PDWORD pdwSize, BOOL bOrder, ULONG ulAf, TCP_TABLE_CLASS TableClass, ULONG Reserviert);

mit

TableClass-Wert = TCP_TABLE_OWNER_PID_ALL "oder" TCP_TABLE_OWNER_PID_CONNECTIONS "oder" TCP_TABLE_OWNER_PID_LISTENER

pTcpTable-Struktur -> MIB_TCPTABLE_OWNER_PID

abhängig von den Informationen, die Sie abrufen möchten

BEARBEITEN:

TCP_TABLE_OWNER_PID_ALL gibt die MIB_TCPTABLE_OWNER_PID-Struktur zurück, die ein Array von MIB_TCPROW_OWNER_PID-Strukturen ist, wobei jede Struktur, wenn sie gebunden dwStateist MIB_TCP_STATE_CLOSEDund nicht zuhört, auch folgendes bietet dwLocalAddr:dwLocalPort

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;

verwandte Informationen