
En PowerShell, la commande Test-NetConnection représente une alternative à la commande ping, mais grâce à ses différents paramètres, il est possible d'aller plus loin puisque l'on peut effectuer un test sur un port spécifique (uniquement en TCP).
Ainsi, on peut utiliser cette commande pour déterminer si un port est ouvert ou non.
Que ce soit avec Windows PowerShell ou PowerShell, vous pouvez utiliser la commande Test-NetConnection. Dans cet exemple, une machine sous Linux, qui héberge un serveur Web Apache sera testée, à la fois sur le port 80 et sur le port 443.
Nous verrons si elle répond à l'un ou l'autre de ces deux ports, ou peut-être même aux deux !
La commande Test-NetConnection s'utilise de cette façon :
Test-NetConnection -ComputerName <Nom ou IP de la cible> -Port <Numéro de port>
Si l'on veut tester le port 443 de la machine 192.168.14.131, on exécutera cette commande :
Test-NetConnection -ComputerName 192.168.14.131 -Port 443
Ici, le port 443 est visiblement fermé sur le serveur distant (pare-feu local qui bloque, service Web qui n'est pas accessible en HTTPS ou sur un port personnalisé, etc...), car on obtient le statut "failed" et surtout la propriété "TcpTestSucceeded" est égale à "false" ce qui indique que le test a échoué.

Faisons le même test sur le port 80 :
Test-NetConnection -ComputerName 192.168.14.131 -Port 80
Cette fois-ci, la propriété "TcpTestSucceeded" est égale à "true", ce qui indique que le test a réussi. Sur le serveur Web, le port 80 est bien ouvert !
Pour commencer, je vais vous parler de l'outil Netstat, ce dernier étant présent depuis très longtemps sur Windows, il reste aujourd'hui incontournable lorsqu'il s'agit de regarder les connexions TCP actives d'une machine Windows ou de voir les ports d'écoute.
Tout d'abord, à partir d'une console PowerShell ou d'une console Invite de commande, exécuter la commande suivante :
netstat -a
L'option "-a" permet d'afficher toutes les connexions et tous les ports d'écoute comme le spécifie l'aide Netstat. Sans cette option, la commande retourne seulement les connexions actives. D'ailleurs, vous pouvez consulter l'aide de Netstat avec la commande suivante :
netstat /?
Voici un extrait de ce que j'obtiens sur mon serveur contrôleur de domaine :

Cette commande retourne plusieurs colonnes : Proto, Adresse locale, Adresse distante et Etat. Quelques précisions sur la signification de ces quatre colonnes.
Proto
TCP et UDP.Adresse locale
0.0.0.0. Si l'adresse IP est spécifiée, comme par exemple 192.168.100.11:53 cela signifie que le serveur DNS (= port 53) de mon serveur est en écoute sur cette adresse IP.Adresse distante
Etat
Si vous préférez afficher que des informations numériques (numéro de port et adresse IP), il suffit d'ajouter l'option "-n", comme ceci lorsque c'est combiné avec une autre option comme "-a" :
netstat -an

Avec Netstat, on ne peut pas filtrer directement sur l'état de la connexion ; c'est dommage. Si l'on veut seulement voir les ports d'écoute, c'est-à-dire les lignes avec l'état "LISTENING", il faut que l'on filtre la sortie avec findstr pour rechercher le mot clé "LISTENING". Ainsi, pour afficher tous les ports d'écoute via Netstat, on utilisera la commande suivante :
netstat -a | findstr LISTENING
Depuis quelques années, Netstat a un concurrent de poids : PowerShell. En effet, le language PowerShell dispose de commandes capable de lister les connexions actives et les ports d'écoute, alors forcément, je devais vous en parler.
Le cmdlet qui nous intéresse tout particulièrement se nomme Get-NetTCPConnection.
Ce qui est cool, c'est que l'on peut tirer profit de la puissance pour PowerShell pour filtrer les résultats retournés par la commande.
Il faut savoir que même si ce cmdlet se nomme Get-NetTCPConnection, il retourne à la fois informations pour les protocoles TCP et UDP, comme Netstat.
Commencer par exécuter cette commande sans paramètre :
Get-NetTCPConnection

Même si les noms de colonnes sont différents, on retrouve globalement les mêmes informations qu'avec Netstat. Contrairement à Netstat, les adresses IP et les numéros de ports sont associés à des colonnes distinctes : une bonne nouvelle pour appliquer des filtres.
La colonne "OwningProcess" indique l'ID du processus qui est à l'origine de cette connexion, ce qui est une information intéressante. Cette information, on aurait pu l'obtenir également avec l'option "-b" de Netstat. Par contre, la colonne "AppliedSetting" est propre à cette commande PowerShell. On remarque la valeur "Datacenter" sur l'exemple ci-dessus, mais il y a d'autres valeurs possibles : Internet, Compat, etc... (voir la commande "Get-NetTCPSetting"). En fonction de certains critères, cela permet d'associer la connexion à un profil de paramètres. Pour obtenir la liste de toutes les propriétés disponibles, vous pouvez utiliser Get-Member ou afficher directement toutes les propriétés :
Get-NetTCPConnection | Select-Object -Property *
Il y a une propriété nommée "CreationTime" qui permet de connaître la date de création de cette connexion, ou depuis quand le serveur est en écoute sur le port en question (selon le type de connexion).
Je vous rappelle tout de même que l'objectif initial c'est d'obtenir la liste des ports d'écoute sur notre serveur. Fort heureusement, on peut appliquer un filtre via le paramètre "-State" pour sélectionner uniquement les connexions avec l'état "Listen", c'est-à-dire en écoute.
La commande PowerShell à utiliser est :
Get-NetTCPConnection -State Listen

Comme vous pouvez le voir sur l'image ci-dessous, on obtient la liste des ports d'écoute à partir de cette commande. Il suffit de se référer à la colonne "LocalPort" de chaque ligne. Si on se demande "Est-ce que mon serveur DNS est bien en écoute sur le port 53 ?", on peut affiner encore un peu plus la commande avec le paramètre "-LocalPort" :
Get-NetTCPConnection -State Listen -LocalPort 53
On peut voir que plusieurs lignes sont retournées (et c'est tant mieux pour le bon fonctionnement de mon serveur DNS). Avec cette commande et cette syntaxe, on peut regarder rapidement si un serveur écoute sur un port spécifique ou non.
Pour connaître le nom du processus qui s'affiche directement au niveau de la commande Get-NetTCPConnection, entrer la commande suivante :
Get-NetTCPConnection -State Listen | Select-Object -Property LocalAddress,LocalPort,@{'Name' = 'ProcessName';'Expression'={(Get-Process -Id $_.OwningProcess).Name}}
Sur mon serveur, j'obtiens un joli tableau avec la liste des ports d'écoute et le processus associé.

PowershellSet-NetFirewallProfile -Profile Domain,Public,Private -Enabled False
PowershellEnter-PSSession <computername> -Credential <domain\username>