Como usar o PowerShell para obter um endereço IP

administradores de TI podem fazer muitas coisas com o PowerShell e a linha de comando; trabalhar com a rede do Windows é uma dessas maneiras. Neste tutorial, você vai aprender como usar o PowerShell para obter endereços IP dos adaptadores de rede em um computador com Windows usando o cmdlet Get-NetIPAddress e WMI.

Pré-requisitos

Este tutorial presume que você está em um computador com Windows 10 ou superior, com o Windows PowerShell v5.1 instalado. Também é assumido que você está em um ambiente de Active Directory. Se não estiver, certifique-se de aprender sobre a propriedade Credential no cmdlet New-CimSession.

Usando Get-NetIPAddress

O PowerShell possui vários cmdlets para trabalhar com conexões de rede, como Get-NetAdapter, Get-NetAdapterBinding, e até mesmo um especificamente para encontrar endereços IP chamado Get-NetIPAddress. Se você deseja usar o PowerShell para obter o endereço IP em um script simples, sinta-se à vontade para usar esses cmdlets.

Mantenha simples. Se o PowerShell oferecer uma maneira mais simples de fazer algo, faça!

Por exemplo, para encontrar o endereço IPv4 em todos os adaptadores de rede em um computador local, execute uma única linha.

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

A saída acima faz referência a um adaptador de rede específico, como o adaptador Ethernet, e retorna apenas o endereço IP.

Getting the IP address from a specific adapter

Você terminou! Simplesmente usar o PowerShell para obter um endereço IP é um processo direto, pelo menos muito mais do que usar outros meios.

Se você não gosta do PowerShell, também pode usar o comando ipconfig para obter um endereço IP. Saiba mais sobre o ipconfig em Os Comandos Ipconfig que Você Precisa Conhecer.

Por que usar CIM/WMI?

Quando você executa o cmdlet Get-NetIPAddress, o PowerShell na verdade está consultando a WMI para obter essas informações. Por que é importante saber disso? Porque você pode consultar a WMI diretamente. Mas por que usar a WMI quando você pode usar um único comando?

Uma das razões mais comuns para usar a WMI em vez de um único comando como Get-NetIPAddress é quando você já está consultando a WMI. A WMI contém muitas informações do sistema que são úteis ao criar scripts para fins de inventário.

Ao comunicar-se com a WMI com o PowerShell, você pode criar uma sessão CIM muito parecida com uma sessão de PSRemoting. Usar uma sessão é uma maneira eficiente de autenticar-se em um computador uma vez e reutilizar essa conexão repetidamente.

Use CIM para obter um endereço IP quando você estiver construindo esta tarefa como parte de um script maior.

Consultando CIM Sem uma Sessão

Ao construir um script do PowerShell usando CIM para consultar várias informações, você deve usar uma sessão CIM reutilizável. Reutilizar uma única sessão não apenas acelera seu script, mas também reduz a duplicação de código.

Por exemplo, talvez você queira descobrir qual sistema operacional um computador remoto com Windows está executando. O CIM mantém o nome do SO em uma propriedade chamada Legenda dentro da classe Win32_OperatingSystem. Para obter essas informações, você usaria o Get-CimInstance cmdlet abaixo, especificando o nome do computador (REMOTECOMPUTER), a classe CIM (Win32_OperatingSystem) e referenciando apenas a propriedade Legenda no objeto.

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

Ao executar Get-CimInstance, o PowerShell precisa encontrar o computador remoto, passar as credenciais logadas para ele e finalmente consultar o CIM para obter as informações necessárias. Há muita sobrecarga associada à execução de Get-CimInstance sem uma sessão.

E se você estiver criando um script de inventário de servidor e também quiser encontrar informações sobre armazenamento, memória, rede e assim por diante? Nesse caso, você teria muitos comandos Get-CimInstance como abaixo.

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

Seu script se conectará a REMOTECOMPUTER quatro vezes no trecho de código acima, e se o nome do computador mudar? Você terá que encontrar/substituir esse nome de computador, o que nunca é um bom sinal ao codificar.

Criando uma Sessão CIM

Em vez de usar Get-CimInstance com uma sessão, você deve criar uma única sessão CIM com o New-CimSession cmdlet e reutilizar essa sessão repetidamente.

Em vez de autenticar-se repetidamente a um computador remoto, crie uma única sessão CIM com New-CimSession e passe essa sessão para Get-CimInstance como abaixo.

$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

Depois de concluir a sessão, desconecte e remova-a da memória.

$cimSession | Remove-CimSession

O uso de sessões CIM como descrito acima é uma ótima maneira de trabalhar com CIM/WMI.

Encontrando o Adaptador de Rede Correto

Dado que um computador com Windows pode ter diferentes adaptadores de rede, você deve primeiro reduzir as opções para escolher de qual adaptador de rede deseja obter o endereço IP. Ao usar WMI, utilize a classe Win32_NetworkAdapterConfiguration. Essa classe fornece muitas das informações que o Get-NetIPAddress retorna.

Primeiramente, crie um script PowerShell com o nome do computador remoto, crie uma nova sessão CIM e, em seguida, adicione a linha de remoção da sessão CIM abaixo dela.

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

$cimSession | Remove-CimSession

Após construir o código da sessão CIM, insira a consulta 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

Você verá que a saída padrão acima não mostra o endereço IP. Você terá que investigar um pouco mais. Além disso, ela não retorna uma única instância. Como você reduz para aquela que possui o endereço IP desejado?

Para fazer isso, primeiro exiba todas as propriedades usando Select-Object.

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

Role pela saída, e você notará alguns adaptadores de rede sem um endereço IP, alguns com um e alguns com vários IPs! Você deve limitar isso. É necessário encontrar um critério padrão para filtrar, de modo que possa ser aplicado a todos os servidores.

Lots of output from The Win32_NetworkAdapterConfiguration class!

Em cada adaptador, você deve ver a propriedade IPEnabled. Quando essa propriedade é definida como True, o protocolo TCP/IP está associado a esta NIC, o que é um requisito para ter um endereço IP. Você deve restringir as NICs que têm a propriedade IPEnabled definida como True, e você terá o adaptador que está procurando.

Ao filtrar instâncias WMI, é melhor usar o parâmetro Filter no Get-CimInstance. Há um ditado na comunidade PowerShell que diz “filtrar à esquerda”. Se você tiver a chance, esse ditado significa sempre filtrar a saída o mais à esquerda possível.

Não use Where-Object a menos que seja necessário. O desempenho será muito mais rápido devido à falta de sobrecarga de processamento de objetos desnecessários através do pipeline.

O parâmetro Filter no Get-CimInstance usa Linguagem de Consulta do Windows (WQL). WQL é um pequeno subconjunto do SQL. O parâmetro Filter espera a mesma sintaxe de cláusula de restrição WHERE que o SQL esperaria.

Para encontrar todas as instâncias CIM da classe Win32_NetworkAdapterConfiguration com a propriedade IPEnabled definida como True, use a consulta WQL SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'True'.

Desde que já estejamos especificando o nome da classe para o argumento do parâmetro ClassName em Get-CimInstance, precisamos especificar IPEnabled = 'True' para o Filtro. Isso retornará apenas o adaptador de rede com o endereço IP.

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

Ao executar o trecho de código acima, você deve perceber que Get-CimInstance retorna apenas uma instância (ou um conjunto limitado) de instâncias.

Agora que você tem uma única instância CIM e sabe a propriedade que está procurando (IPAddress), vejamos como é. Você verá abaixo que, neste exemplo, ele retorna uma única instância CIM, mas com três strings para a propriedade IPAddress, incluindo endereços 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

Você terá que filtrar mais alguns elementos. Como o WQL não pode filtrar mais profundamente do que o valor da propriedade IPAddress, agora você precisa analisar o endereço IPv4.

O endereço IPV4 é normalmente o primeiro definido no array. Selecione esse usando a referência ao índice 0, conforme mostrado abaixo. Quando fizer isso, verá que ele retorna apenas uma única string de endereço IP IPV4.

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

192.168.0.40

O endereço IPV4 nem sempre pode ser o primeiro elemento do array. Na verdade, a propriedade IPAddress pode nem mesmo ser um array. As configurações de IP variam drasticamente entre adaptadores e várias configurações. Você pode ter que ser criativo ao filtrá-las.

Conclusão

Se você precisa usar o PowerShell para obter um endereço IP de um computador, primeiro dê uma olhada no cmdlet Get-NetIPAddress. Se estiver desenvolvendo um script mais extenso ou não puder executar esse comando por algum motivo, considere usar Get-CimInstance e a sessão CIM para realizar o trabalho necessário.

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