Cómo usar PowerShell para obtener una dirección IP

Los administradores de IT pueden hacer mucho con PowerShell y la línea de comandos; trabajar con la red de Windows es una de esas formas. En este tutorial, aprenderás cómo usar PowerShell para obtener direcciones IP de adaptadores de red en una computadora con Windows con el cmdlet Get-NetIPAddress y WMI.

Prerrequisitos

Este tutorial asumirá que estás en una computadora con Windows 10 o superior con Windows PowerShell v5.1 instalado. También se asume que estás en un entorno de Active Directory. Si no es así, asegúrate de aprender sobre la Credential propiedad en el cmdlet New-CimSession.

Usando Get-NetIPAddress

PowerShell tiene varios cmdlets para trabajar con conexiones de red, como Get-NetAdapter, Get-NetAdapterBinding, e incluso uno específicamente para encontrar direcciones IP llamado Get-NetIPAddress. Si deseas usar PowerShell para obtener la dirección IP en un script simple, por supuesto, utiliza estos cmdlets.

Manténlo simple. ¡Si PowerShell ofrece una manera más simple de hacer algo, hazlo!

Por ejemplo, para encontrar la dirección IPv4 en todos los adaptadores de red en una computadora local, ejecuta una sola línea.

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

La salida anterior hace referencia a un adaptador de red específico como el adaptador Ethernet y devuelve solo la dirección IP.

Getting the IP address from a specific adapter

¡Listo! Simplemente usar PowerShell para obtener una dirección IP es un proceso sencillo, al menos mucho más que usar otros medios.

Si no eres fan de PowerShell, también puedes usar el comando ipconfig para obtener una dirección IP. Busca más información sobre ipconfig en Los Comandos de Ipconfig que Necesitas Conocer.

¿Por qué usar CIM/WMI?

Cuando ejecutas el cmdlet Get-NetIPAddress, PowerShell está consultando realmente WMI para obtener esa información. ¿Por qué es importante saber esto? Porque puedes consultar directamente WMI por ti mismo. Pero, ¿por qué usar WMI cuando puedes usar un solo comando?

Una de las razones más comunes para usar WMI en lugar de un solo comando como Get-NetIPAddress es cuando ya estás consultando WMI. WMI contiene muchísima información del sistema que resulta útil al construir scripts con fines de inventario.

Al comunicarte con WMI a través de PowerShell, puedes crear una sesión CIM de manera similar a una sesión de PSRemoting. Utilizar una sesión es una forma eficiente de autenticar en una computadora una vez y reutilizar esa conexión repetidamente.

Usa CIM para obtener una dirección IP cuando estés construyendo esta tarea como parte de un script más grande.

Consulta de CIM Sin una Sesión

Cuando estás construyendo un script de PowerShell que utiliza CIM para consultar varias piezas de información, debes usar una sesión CIM reutilizable. Reutilizar una sola sesión no solo acelera tu script, sino que también reduce la duplicación de código.

Por ejemplo, quizás te gustaría averiguar qué sistema operativo está ejecutando una computadora remota con Windows. CIM guarda el nombre del SO en una propiedad llamada Caption dentro de la clase Win32_OperatingSystem. Para obtener esta información, usarías el cmdlet Get-CimInstance a continuación, especificando el nombre de la computadora (REMOTECOMPUTER), la clase CIM (Win32_OperatingSystem) y haciendo referencia solo a la propiedad Caption en el objeto.

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

Cuando ejecutas Get-CimInstance, PowerShell debe encontrar la computadora remota, pasarle las credenciales de inicio de sesión y finalmente consultar CIM para obtener la información que necesitas. Hay mucho sobrecargo que viene con ejecutar Get-CimInstance sin una sesión.

¿Qué pasa si estás construyendo un script de inventario de servidores y también quieres encontrar información sobre almacenamiento, memoria, redes, y así sucesivamente? En ese caso, tendrías muchos comandos Get-CimInstance como el siguiente.

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

Tu script se conectará a REMOTECOMPUTER cuatro veces en el fragmento de código anterior, ¿y si el nombre de la computadora cambia? Tendrás que buscar/reemplazar ese nombre de computadora, lo cual nunca es una buena señal mientras codificas.

Creando una sesión CIM

En lugar de usar Get-CimInstance con una sesión, deberías crear una única sesión CIM con el cmdlet New-CimSession y reutilizar esa sesión repetidamente.

En lugar de autenticarse repetidamente en una computadora remota, crea una única sesión CIM con New-CimSession y pasa esa sesión a Get-CimInstance como se muestra a continuación.

$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

Una vez que hayas terminado con la sesión, desconéctala y elimínala de la memoria.

$cimSession | Remove-CimSession

Usar sesiones CIM como se describe arriba es una excelente manera de trabajar con CIM/WMI.

Encontrar el adaptador de red correcto

Dado que una computadora con Windows puede tener diferentes adaptadores de red, primero debes reducir cuál adaptador de red te gustaría obtener la dirección IP. Al usar WMI, utiliza la clase Win32_NetworkAdapterConfiguration. Esta clase proporciona mucha de la información que devuelve Get-NetIPAddress.

Primero, crea un script de PowerShell con el nombre de la computadora remota, crea una nueva sesión CIM y luego agrega la línea para eliminar tu sesión CIM debajo.

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

$cimSession | Remove-CimSession

Una vez que hayas desarrollado el código de la sesión CIM, inserta la consulta de 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

Podrás ver que la salida predeterminada anterior no muestra la dirección IP. Tendrás que profundizar un poco más. Tampoco devuelve una única instancia. ¿Cómo reducir la búsqueda para encontrar la que tiene la dirección IP que estás buscando?

Para hacerlo, primero muestra todas las propiedades usando Select-Object.

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

Desplázate por la salida y notarás algunos adaptadores de red sin una dirección IP, algunos con una y otros con múltiples IPs. Debes limitar eso. Debes encontrar algún criterio estándar para filtrar de manera que se pueda aplicar a todos los servidores.

Lots of output from The Win32_NetworkAdapterConfiguration class!

En cada adaptador, deberías ver la propiedad IPEnabled. Cuando esta propiedad se establece en True, el protocolo TCP/IP está vinculado a esta NIC, lo que es un requisito previo para tener una dirección IP. Debes reducir las NIC que tienen la propiedad IPEnabled establecida en True, y así encontrarás el adaptador que estás buscando.

Al filtrar instancias WMI, es mejor usar el parámetro Filter en Get-CimInstance. Hay un lema en la comunidad de PowerShell que dice “filtrar a la izquierda”. Si tienes la oportunidad, esto significa filtrar siempre la salida lo más a la izquierda posible.

No uses Where-Object a menos que sea necesario. La ejecución será mucho más rápida debido a la falta de sobrecarga de procesamiento de objetos innecesarios en el pipeline.

El parámetro Filter en Get-CimInstance utiliza Windows Query Language (WQL). WQL es un pequeño subconjunto de SQL. El parámetro Filter espera la misma sintaxis de cláusula de restricción WHERE que SQL.

Para encontrar todas las instancias CIM de la clase Win32_NetworkAdapterConfiguration con la propiedad IPEnabled establecida en True, utiliza la consulta WQL SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'True'.

Como ya estamos especificando el nombre de la clase para el argumento del parámetro `ClassName` en `Get-CimInstance`, necesitamos especificar `IPEnabled = 'True'` para el `Filter`. Esto devolverá solo el adaptador de red con la dirección IP.

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

Al ejecutar el fragmento de código anterior, deberías ver que `Get-CimInstance` devuelve solo una instancia (o un conjunto limitado) de instancias.

Ahora que tienes una única instancia de CIM y conoces la propiedad que estás buscando (`IPAddress`), veamos cómo se ve. Verás que, en esta instancia, devuelve una única instancia de CIM pero con tres cadenas para la propiedad `IPAddress`, incluyendo direcciones 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

Tendrás que filtrar algunos elementos más. Dado que WQL no puede filtrar más allá del valor de la propiedad `IPAddress`, ahora debes analizar la dirección IPv4.

La dirección IPV4 suele ser la primera definida en el array. Selecciona esa usando la referencia al índice 0, como se muestra a continuación. Cuando lo hagas, verás que devuelve solo una cadena de dirección IP IPV4.

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

192.168.0.40

La dirección IPV4 puede que no siempre sea el primer elemento del array. De hecho, la propiedad IPAddress puede que ni siquiera sea un array. Las configuraciones de IP varían drásticamente en adaptadores y configuraciones diversas. Puede que tengas que ser creativo al filtrarlas.

Conclusión

Si necesitas utilizar PowerShell para obtener una dirección IP de una computadora, primero echa un vistazo al cmdlet Get-NetIPAddress. Si estás construyendo un script más grande o no puedes ejecutar este comando por alguna razón, considera usar Get-CimInstance y una sesión CIM para hacer el trabajo sucio.

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