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
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.0Ce 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.
Filter ConvertTo-LengthFromIPMask { ([Convert]::ToString(([IPAddress][String]([IPAddress]$_).Address).Address,2) -replace '[s0]' ).Length }
# Exemple d'utilisation
PS> "255.255.255.0" | ConvertTo-LengthFromIPMask
24Ce 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.
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.145Convertir un décimal en adresse IP
Filter ConvertTo-IPFromDecimal { ([System.Net.IPAddress]$_).IPAddressToString }
# Exemple d'utilisation
PS> 2432805056 | ConvertTo-IPFromDecimal
192.168.1.145Convertir une adresse IP en décimal
Filter ConvertTo-DecimalFromIP { ([IPAddress][String]([IPAddress]$_)).Address }
# Exemple d'utilisation
PS> "192.168.1.145" | ConvertTo-DecimalFromIP
2432805056La 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…
Filter ConvertTo-BinaryFromIP { [Convert]::toString(([IPAddress][String]([IPAddress]$_).Address).Address,2) }
# Exemple d'utilisation
PS> "192.168.1.145" | ConvertTo-BinaryFromIP
11000000101010000000000110010001Convertir un binaire en adresse IP
Filter ConvertTo-IPFromBinary { ([System.Net.IPAddress]"$([System.Convert]::ToInt64($_,2))").IPAddressToString }
# Exemple d'utilisation
PS> '11000000101010000000000110010001' | ConvertTo-IPFromBinary
192.168.1.145A 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 !