Comment utiliser PowerShell pour obtenir une adresse IP

Les administrateurs IT peuvent faire beaucoup de choses avec PowerShell et la ligne de commande ; travailler avec le réseau Windows en est une. Dans ce tutoriel, vous allez apprendre à utiliser PowerShell pour obtenir les adresses IP des adaptateurs réseau sur un ordinateur Windows avec la commande Get-NetIPAddress et WMI.

Prérequis

Ce tutoriel suppose que vous êtes sur un ordinateur Windows 10 ou supérieur avec PowerShell v5.1 installé. Il est également supposé que vous êtes dans un environnement Active Directory. Sinon, assurez-vous de vous renseigner sur la propriété Credential sur la commande New-CimSession.

Utilisation de Get-NetIPAddress

PowerShell dispose de différents cmdlets pour travailler avec les connexions réseau tels que Get-NetAdapter, Get-NetAdapterBinding, et même un spécifique pour trouver des adresses IP appelé Get-NetIPAddress. Si vous souhaitez utiliser PowerShell pour obtenir l’adresse IP dans un script simple, n’hésitez pas à utiliser ces cmdlets.

Restez simple. Si PowerShell offre un moyen plus simple de faire quelque chose, utilisez-le !

Par exemple, pour trouver l’adresse IPv4 sur tous les adaptateurs réseau sur un ordinateur local, exécutez une seule ligne.

Get-NetIPAddress -AddressFamily IPV4
Finding IPV4 addresses with Get-NetIPAddress

La sortie ci-dessus fait référence à un adaptateur réseau spécifique tel que l’adaptateur Ethernet et ne renvoie que l’adresse IP.

Getting the IP address from a specific adapter

Vous avez terminé ! Utiliser simplement PowerShell pour obtenir une adresse IP est un processus simple, du moins beaucoup plus que d’utiliser d’autres moyens.

Si vous n’êtes pas fan de PowerShell, vous pouvez également utiliser la commande ipconfig pour obtenir une adresse IP. En savoir plus sur ipconfig sur Les commandes Ipconfig que vous devez connaître.

Pourquoi utiliser CIM/WMI ?

Lorsque vous exécutez la cmdlet Get-NetIPAddress, PowerShell interroge en réalité WMI pour récupérer ces informations. Pourquoi est-il important de le savoir ? Parce que vous pouvez interroger directement WMI vous-même. Mais pourquoi utiliser WMI lorsque vous pouvez utiliser une seule commande ?

Une des raisons les plus courantes d’utiliser WMI plutôt qu’une seule commande comme Get-NetIPAddress est lorsque vous interrogez déjà WMI. WMI contient beaucoup d’informations système utiles lors de la création de scripts à des fins d’inventaire.

Lorsque vous communiquez avec WMI avec PowerShell, vous pouvez créer une session CIM similaire à une session PSRemoting. L’utilisation d’une session est une façon efficace de vous authentifier une fois sur un ordinateur et de réutiliser cette connexion de manière répétée.

Utilisez CIM pour obtenir une adresse IP lorsque vous intégrez cette tâche à un script plus important.

Interroger CIM sans une session

Lorsque vous construisez un script PowerShell en utilisant CIM pour interroger différentes informations, vous devriez utiliser une session CIM réutilisable. La réutilisation d’une seule session accélère non seulement votre script, mais réduit également la duplication du code.

Par exemple, peut-être souhaitez-vous savoir quel système d’exploitation exécute un ordinateur distant sous Windows. CIM contient le nom du système d’exploitation dans une propriété appelée Caption à l’intérieur de la classe Win32_OperatingSystem. Pour obtenir ces informations, vous utiliserez la commande Get-CimInstance ci-dessous, en spécifiant le nom de l’ordinateur (REMOTECOMPUTER), la classe CIM (Win32_OperatingSystem), et en référençant uniquement la propriété Caption sur l’objet.

(Get-CimInstance -ComputerName REMOTECOMPUTER -ClassName Win32_OperatingSystem).Caption

Lorsque vous exécutez Get-CimInstance, PowerShell doit trouver l’ordinateur distant, transmettre les informations d’identification connectées et enfin interroger CIM pour les informations dont vous avez besoin. Il y a beaucoup de surcharge associée à l’exécution de Get-CimInstance sans une session.

Et si vous construisez un script d’inventaire de serveur et que vous souhaitez également obtenir des informations sur le stockage, la mémoire, le réseau, etc. ? Dans ce cas, vous auriez beaucoup de commandes Get-CimInstance comme ci-dessous.

Get-CimInstance -ComputerName REMOTECOMPUTER -ClassName Win32_LogicalDisk
Get-CimInstance -ComputerName REMOTECOMPUTER -ClassName Win32_OperatingSystem
Get-CimInstance -ComputerName REMOTECOMPUTER -ClassName Win32_PhysicalMemory
Get-CimInstance -ComputerName REMOTECOMPUTER -ClassName Win32_NetworkAdapter

Votre script se connectera à REMOTECOMPUTER quatre fois dans le extrait de code ci-dessus, et que se passe-t-il si le nom de l’ordinateur change ? Vous devrez trouver/remplacer ce nom d’ordinateur, ce qui n’est jamais un bon signe lors de la programmation.

Création d’une session CIM

Au lieu d’utiliser Get-CimInstance avec une session, vous devriez créer une seule session CIM avec la commande New-CimSession et réutiliser cette session de manière répétée.

Au lieu de vous authentifier à distance sur un ordinateur à plusieurs reprises, créez une seule session CIM avec New-CimSession et transmettez cette session à Get-CimInstance comme ci-dessous.

$remoteComputer = 'REMOTECOMPUTER'
$cimSession = New-CimSession -ComputerName $remoteComputer

Get-CimInstance -CimSession $cimSession -ClassName Win32_LogicalDisk
Get-CimInstance -CimSession $cimSession -ClassName Win32_OperatingSystem
Get-CimInstance -CimSession $cimSession -ClassName Win32_PhysicalMemory
Get-CimInstance -CimSession $cimSession -ClassName Win32_NetworkAdapter

Une fois que vous avez terminé avec la session, déconnectez-vous et supprimez-la de la mémoire.

$cimSession | Remove-CimSession

L’utilisation de sessions CIM comme ci-dessus est un excellent moyen de travailler avec CIM/WMI.

Recherche du bon adaptateur réseau

Étant donné qu’un ordinateur Windows peut avoir différents adaptateurs réseau, vous devez d’abord déterminer quel adaptateur réseau vous souhaitez obtenir l’adresse IP. Lorsque vous utilisez WMI, utilisez la classe Win32_NetworkAdapterConfiguration. Cette classe fournit une grande partie des informations que Get-NetIPAddress retourne.

Tout d’abord, créez un script PowerShell avec le nom de l’ordinateur distant, créez une nouvelle session CIM, puis ajoutez votre ligne de suppression de session CIM ci-dessous.

$remoteComputer = 'REMOTECOMPUTER'
$cimSession = New-CimSession -ComputerName $remoteComputer

$cimSession | Remove-CimSession

Une fois que vous avez construit le code de la session CIM, insérez la requête WMI.

$remoteComputer = 'REMOTECOMPUTER'
$cimSession = New-CimSession -ComputerName $remoteComputer

Get-CimInstance -CimSession $cimSession -ClassName Win32_NetworkAdapterConfiguration

$cimSession | Remove-CimSession
Querying WMI with a CIM session to get network adapter information

Vous pouvez voir que la sortie par défaut ci-dessus ne montre pas l’adresse IP. Vous devrez creuser un peu plus profondément. Il ne renvoie également pas une seule instance. Comment limiter celui qui a l’adresse IP que vous recherchez?

Pour ce faire, affichez d’abord toutes les propriétés en utilisant Select-Object.

Get-CimInstance -CimSession $cimSession -ClassName Win32_NetworkAdapterConfiguration | Select-Object -Property *

Parcourez la sortie, et vous remarquerez certains adaptateurs réseau sans adresse IP, certains avec une, et certains avec plusieurs adresses IP! Vous devez limiter cela. Vous devez trouver un critère standard pour filtrer afin qu’il puisse s’appliquer à tous les serveurs.

Lots of output from The Win32_NetworkAdapterConfiguration class!

Sur chaque adaptateur, vous devriez voir la propriété IPEnabled. Lorsque cette propriété est définie sur Vrai, le protocole TCP/IP est lié à cette carte NIC, ce qui est une condition préalable pour avoir une adresse IP. Vous devez restreindre les NIC qui ont la propriété IPEnabled définie sur Vrai, et vous aurez l’adaptateur que vous recherchez.

Lorsque vous filtrez les instances WMI, il est préférable d’utiliser le paramètre Filter sur Get-CimInstance. Il y a un dicton dans la communauté PowerShell qui dit « filter left ». Si vous en avez la chance, cela signifie toujours filtrer la sortie aussi loin à gauche que possible.

Ne pas utiliser Where-Object à moins que vous en ayez besoin. Les performances seront bien meilleures en raison du manque de surcharge de traitement d’objets inutiles à travers le pipeline.

Le paramètre Filter sur Get-CimInstance utilise le langage de requête Windows (WQL). WQL est un petit sous-ensemble de SQL. Le paramètre Filter attend la même syntaxe de clause de contrainte WHERE que SQL le ferait.

Pour trouver toutes les instances CIM de la classe Win32_NetworkAdapterConfiguration avec la propriété IPEnabled définie sur Vrai, utilisez la requête WQL SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'True'.

Depuis que nous spécifions déjà le nom de classe pour l’argument du paramètre ClassName dans Get-CimInstance, nous devons spécifier IPEnabled = 'True' pour le Filter. Cela renverra uniquement l’adaptateur réseau avec l’adresse IP.

Get-CimInstance -CimSession $cimSession -ClassName Win32_NetworkAdapterConfiguration -Filter "IPEnabled = 'True'" | Select-Object -Property *

En exécutant le code ci-dessus, vous devriez voir que Get-CimInstance ne renvoie qu’une seule instance (ou un ensemble limité).

Maintenant que vous avez une seule instance CIM et que vous connaissez la propriété que vous recherchez (IPAddress), voyons à quoi cela ressemble. Vous verrez ci-dessous que, dans cette instance, il renvoie une seule instance CIM mais avec trois chaînes pour la propriété IPAddress, y compris des adresses IPV6.

(Get-CimInstance -CimSession $cimSession -ClassName Win32_NetworkAdapterConfiguration -Filter "IPEnabled = 'True'").IPAddress

192.168.0.40
fe80::e4e1:c511:e38b:4f05
2607:fcc8:acd9:1f00:e4e1:c511:e38b:4f05

Vous allez devoir filtrer encore plus d’éléments. Parce que WQL ne peut pas filtrer plus profondément que la valeur de propriété IPAddress, vous devez maintenant extraire l’adresse IPv4.

L’adresse IPV4 est généralement la première définie dans le tableau. Choisissez celle-ci en faisant référence à l’indice 0 comme indiqué ci-dessous. Lorsque vous le faites, vous verrez qu’il ne renvoie qu’une seule chaîne d’adresse IP IPV4.

(Get-CimInstance -CimSession $cimSession -ClassName Win32_NetworkAdapterConfiguration -Filter "IPEnabled = 'True'").IPAddress[0]

192.168.0.40

L’adresse IPV4 n’est peut-être pas toujours le premier élément du tableau. En fait, la propriété IPAddress peut ne pas être un tableau du tout. Les configurations IP varient considérablement selon les adaptateurs et les configurations diverses. Vous devrez peut-être faire preuve de créativité pour les filtrer.

Conclusion

Si vous avez besoin d’utiliser PowerShell pour obtenir une adresse IP d’un ordinateur, commencez par examiner d’abord la commande Get-NetIPAddress. Si vous êtes en train de créer un script plus complexe ou si vous ne pouvez pas exécuter cette commande pour une raison quelconque, envisagez d’utiliser Get-CimInstance et une session CIM pour effectuer le travail nécessaire.

Source:
https://adamtheautomator.com/powershell-get-ip-address/