Como usar o PowerShell para obter um endereço IP

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

Pré-requisitos

Este tutorial presumirá 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 Credential propriedade 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ê quiser usar o PowerShell para obter o endereço IP em um script simples, por todos os meios, use 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 é fã do PowerShell, também pode usar o comando ipconfig para obter um endereço IP. Saiba mais sobre ipconfig em Os Comandos Ipconfig que Você Precisa Conhecer.

Por que Usar CIM/WMI?

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

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

Ao se comunicar com o WMI com o PowerShell, você pode criar uma sessão CIM assim como uma sessão 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 estiver construindo essa tarefa como parte de um script maior.

Consultando CIM Sem uma Sessão

Ao construir um script 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 queira descobrir qual sistema operacional está sendo executado em um computador Windows remoto. CIM armazena o nome do SO em uma propriedade chamada Caption 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 Caption no objeto.

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

Ao executar Get-CimInstance, o PowerShell precisa localizar o computador remoto, passar as credenciais de login e finalmente consultar o CIM para obter as informações necessárias. Há muita sobrecarga ao executar 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á ao 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 programar.

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 repetidamente em 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 terminar com a sessão, desconecte e remova-a da memória.

$cimSession | Remove-CimSession

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

Encontrar o Adaptador de Rede Correto

Já que um computador com Windows pode ter diferentes adaptadores de rede, você primeiro precisa limitar qual adaptador de rede gostaria de obter o endereço IP. Ao usar WMI, utilize a classe Win32_NetworkAdapterConfiguration. Esta classe fornece muitas das informações que o Get-NetIPAddress retorna.

Primeiro, crie um script do PowerShell com o nome do computador remoto, crie uma nova sessão CIM e então adicione sua linha de remoção de sessão CIM abaixo dela.

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

$cimSession | Remove-CimSession

Depois de desenvolver 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ê pode ver que a saída padrão acima não mostra o endereço IP. Você precisará investigar um pouco mais fundo. Também não retorna uma única instância. Como você limita aquele que tem o endereço IP que está procurando?

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ê precisa limitar isso. Você deve encontrar algum 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 esta propriedade está definida como True, o protocolo TCP/IP está vinculado a esta NIC, o que é um requisito para ter um endereço IP. Você precisa reduzir as NICs que têm a propriedade IPEnabled definida como True, e terá o adaptador que está procurando.

Ao filtrar instâncias WMI, é melhor usar o parâmetro Filter em Get-CimInstance. Há um lema na comunidade do PowerShell que diz “filtrar à esquerda”. Se tiver a oportunidade, isso 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 processamento desnecessário de objetos ao longo do pipeline.

O parâmetro Filter em Get-CimInstance usa Windows Query Language (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 usaria.

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'.

Já que estamos especificando o nome da classe para o argumento do parâmetro ClassName em Get-CimInstance, precisamos especificar IPEnabled = 'True' para o Filter. 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ê deverá ver que Get-CimInstance retorna apenas uma única (ou conjunto limitado) de instâncias.

Agora que você tem uma única instância CIM e conhece a propriedade que está procurando (IPAddress), vejamos como ela se parece. Você verá abaixo que, neste exemplo, 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ê precisará filtrar mais alguns elementos. Como o WQL não pode filtrar mais fundo do que o valor da propriedade IPAddress, agora você deve analisar o endereço IPv4.

O endereço IPV4 é geralmente o primeiro definido no array. Escolha esse usando a referência ao índice 0, como mostrado abaixo. Quando fizer isso, verá que 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 pode nem sempre 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ê precisar usar o PowerShell para obter um endereço IP de um computador, primeiro dê uma olhada no cmdlet Get-NetIPAddress. Se estiver construindo um script maior ou não puder executar esse comando por algum motivo, considere usar Get-CimInstance e uma sessão CIM para fazer o trabalho sujo.

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