PowerShell : manipuler efficacement les informations réseau

Manipuler des informations réseau en PowerShell paraît trivial au départ. Une IP, un masque, un préfixe CIDR… jusqu’au moment où il faut valider, convertir, ou comparer proprement sans regex fragile ni logique illisible.

Cet article regroupe des filtres PowerShell simples et fiables pour manipuler des informations réseau sans bricolage.
Pas exhaustif. Pas académique. Juste ce qui fonctionne réellement en production.

Le problème habituel

Dans beaucoup de scripts, la manipulation des IP repose sur :

  • des regex approximatives,
  • des Split('.') suivis de calculs douteux,
  • ou des conversions implicites difficiles à relire six mois plus tard.

Résultat :

  • du code fragile,
  • des erreurs silencieuses,
  • et des scripts impossibles à maintenir.

L’objectif ici est simple : des filtres clairs, prévisibles et réutilisables.

Le filtre réellement utile

Autant être honnête tout de suite.

Sur l’ensemble des filtres présentés dans cet article, un seul m’a servi régulièrement au fil des années.
Les autres existent, fonctionnent, mais relèvent plus du confort ou de cas très ponctuels.

On commence donc par celui-là.

Convertir une longueur de sous-réseau en masque

PowerShell
Filter ConvertTo-IPMaskFromLength {[System.Net.IPAddress]::Parse(([math]::Pow(2, 32) - [math]::Pow(2, 32 - $_)).ToString()).IPAddressToString }

# Exemple d'utilisation
PS C:\> 24 | ConvertTo-IPMaskFromLength 
255.255.255.0

Ce filtre permet de convertir une notation CIDR (/24, /16, etc.) en masque de sous-réseau classique (255.255.255.0).

Cas d’usage typiques :

  • lecture de configurations réseau hétérogènes,
  • normalisation de données issues d’API,
  • génération de fichiers de configuration,
  • scripts d’audit ou de validation.

Le comportement est déterministe, lisible, et évite toute logique bitwise dispersée dans le script principal.


Convertir un masque en longueur de sous-réseau.

L’opération inverse est parfois nécessaire, notamment lorsque :

  • une API attend une notation CIDR,
  • un outil impose un format différent de celui fourni par l’OS,
  • ou que l’on compare des configurations issues de sources différentes.
PowerShell
Filter ConvertTo-LengthFromIPMask { ([Convert]::ToString(([IPAddress][String]([IPAddress]$_).Address).Address,2) -replace '[s0]' ).Length }

# Exemple d'utilisation
PS> "255.255.255.0" | ConvertTo-LengthFromIPMask
24

Ce filtre garantit une conversion cohérente, sans dépendre d’approximations ou de calculs implicites.


Travailler avec des adresses IP en décimal

Voici un exemple où l’on peut trouver une adresses IP au format décimal, il peut être intéressant de savoir la manipuler.

PowerShell
PS> $Interface = [System.Net.NetworkInformation.NetworkInterface]::GetAllNetworkInterfaces()[3]
PS> $Interface.GetIPProperties().UnicastAddresses[1].Address

Address            : 2432805056
AddressFamily      : InterNetwork
ScopeId            :
IsIPv6Multicast    : False
IsIPv6LinkLocal    : False
IsIPv6SiteLocal    : False
IsIPv6Teredo       : False
IsIPv4MappedToIPv6 : False
IPAddressToString  : 192.168.1.145

Convertir un décimal en adresse IP

PowerShell
Filter ConvertTo-IPFromDecimal { ([System.Net.IPAddress]$_).IPAddressToString }

# Exemple d'utilisation
PS> 2432805056 | ConvertTo-IPFromDecimal
192.168.1.145

Convertir une adresse IP en décimal

PowerShell
Filter ConvertTo-DecimalFromIP { ([IPAddress][String]([IPAddress]$_)).Address }

# Exemple d'utilisation
PS> "192.168.1.145" | ConvertTo-DecimalFromIP
2432805056

La même idée, mais à l’envers.


Travailler avec des adresses IP en binaire

Pour ceux d’entres vous qui n’ont pas séché les cours de réseau, vous le savez: la base de calcul en ipv4 est le binaire.
Cela peut donc avoir un intérêt de convertir une adresse en série de 1 et de 0.

A la relecture du sujet, cela n’a aucun d’intérêt mais, je trouve l’exercice amusant.

Convertir une adresses IP en binaire

Un masque de sous réseau a le même format qu’une adresse IP – Vous le savez…

PowerShell
Filter ConvertTo-BinaryFromIP { [Convert]::toString(([IPAddress][String]([IPAddress]$_).Address).Address,2) }

# Exemple d'utilisation
PS> "192.168.1.145" | ConvertTo-BinaryFromIP
11000000101010000000000110010001

Convertir un binaire en adresse IP

PowerShell
Filter ConvertTo-IPFromBinary { ([System.Net.IPAddress]"$([System.Convert]::ToInt64($_,2))").IPAddressToString }

# Exemple d'utilisation
PS> '11000000101010000000000110010001' | ConvertTo-IPFromBinary
192.168.1.145

A retenir

PowerShell fournit les briques nécessaires pour manipuler des informations réseau correctement.
Encore faut-il les utiliser de manière structurée.

Ces filtres ne sont pas là pour couvrir tous les cas possibles, mais pour répondre à des besoins concrets, rencontrés régulièrement en environnement réel.

Découvrez aussi nos autres conseils pratiques pour PowerShell !


Laisser un commentaire