Voglio ottenere l'elenco dei servizi di finestra e le loro porte in C#. Sono in grado di ottenere tutti i servizi di finestra utilizzando ServiceController
ma non riesco a ottenere le porte di questi servizi.Come ottengo le porte aperte da un servizio di Windows?
risposta
Controllare this question on stackoverlow. Non è esattamente la stessa cosa che stai chiedendo, ma punta a una funzione utile chiamata GetExtendedTcpTable available through PInvoke, che può fare ciò che ti serve. Controllare anche this one.
Le risposte a domande simili propongono sempre l'utilizzo di Iphlpapi ma non è del tutto chiaro come si otterrebbero i RpcS (nome del servizio) in questo copia di copia netstat -ban: TCP 0.0.0.0:135 0.0.0.0:0 aSCOLTO RpcSs [svchost.exe]
O il Programma qui:
TCP [::]: 49154 [::]: 0 ascolto Schedule [svchost.exe]
ho guardato per la soluzione a questo e non la pinna d qualsiasi cosa (-easy). Netstat chiama alcune funzioni non documentate in Iphlpapi ma non è chiaro se ottiene il nome del servizio da Iphlpapi o in qualche modo usa il pid da Iphlpapi e usa qualcos'altro per ottenere il nome del servizio. Non sono davvero tentato di passare il tempo con un debugger per rispondere a questo perché ..:
Tuttavia idealmente non si vorrebbe comunque utilizzare un approccio in stile polling da C#. Sarebbe più appropriato usare ETW. Penso che la mancanza di esempi di utilizzo da parte di C# sia dovuto al fatto che è necessario un certo overhead per iniziare e che gli esempi potrebbero essere specifici per altri tipi di scenari di monitoraggio/monitoraggio.
Riepilogo: Se si ha poco tempo per implementarlo, salvare l'output netstat sembra essere la "soluzione". Idealmente avrei voluto trovare un semplice esempio di C# per monitorare qualsiasi connessione di rete e capire quale servizio o processo sono stati gestiti/avviati insieme a possibili modifiche al firewall. Credo che sia possibile fare entrambe le cose con ETW, ma per le mie attuali esigenze è difficile giustificare la quantità sconosciuta di tempo necessaria per farlo funzionare. Ho almeno capito che "logman query provider" elenca i provider, quindi è necessario fare qualcosa per abilitare il provider (e il supporto del driver per la traccia in alcuni casi come l'acquisizione di pacchetti). C'è un progetto C# per l'utilizzo di ETW in giro. Ma non è affatto chiaro quanta fatica sarebbe per riprodurre l'output netstat con ETW.
Dopo aver guardato in giro ho scoperto che "OwningModuleInfo" non documentato nella struttura MIB_TCPROW_OWNER_MODULE.
Poi alla ricerca di che ho trovato questo commento:
Weird issue regarding GetOwnerModuleFromTcpEntry when targeting x64
"Sono giunto alla conclusione che il primo elemento della matrice è l'indice del servizio nell'elenco dei servizi in esecuzione, .. . "
Quindi la risposta alla domanda sarebbe quella di usarlo per ottenere informazioni sul nome che netstat -b mostra (nome servizio e indirizzo + porta), filtraggio per il servizio desiderato. Ho trovato questo lib https://github.com/Loriowar/IpHlpApidotnet che ha il mazzo di codice correlato già impostato tranne per questa funzione.
Altri link utili:
Marshalling Struct with Array of Struct Member
https://msdn.microsoft.com/en-us/library/windows/desktop/aa366911(v=vs.85).aspx
vuoi dire porte TCP/UDP? –
Sì, porte TCP/UDP –