Как использовать PowerShell для получения IP-адреса

Администраторы информационных технологий могут делать многое с помощью PowerShell и командной строки; работа с сетью Windows – один из способов. В этом уроке вы узнаете, как использовать PowerShell для получения IP-адресов сетевых адаптеров на компьютере под управлением Windows с помощью командлета Get-NetIPAddress и WMI.

Предпосылки

В этом учебнике предполагается, что вы используете компьютер с Windows 10 или выше и установленной Windows PowerShell версии 5.1. Также предполагается, что вы находитесь в среде Active Directory. Если нет, обязательно изучите Credential свойство командлета New-CimSession.

Использование Get-NetIPAddress

PowerShell имеет различные командлеты для работы с сетевыми подключениями, такие как Get-NetAdapter, Get-NetAdapterBinding, и даже один, специально предназначенный для поиска IP-адресов, называемый Get-NetIPAddress. Если вы хотите использовать PowerShell для получения IP-адреса в простом сценарии, не стесняйтесь использовать эти командлеты.

Держите все просто. Если PowerShell предлагает более простой способ сделать что-то, используйте его!

Например, чтобы найти IPv4-адрес на всех сетевых адаптерах на локальном компьютере, выполните одну строку.

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

Приведенный выше вывод ссылается на конкретный сетевой адаптер, такой как сетевой адаптер Ethernet, и возвращает только IP-адрес.

Getting the IP address from a specific adapter

Готово! Просто использование PowerShell для получения IP-адреса – это простой процесс, по крайней мере, намного проще, чем использование других средств.

Если вы не являетесь поклонником PowerShell, вы также можете использовать команду ipconfig для получения IP-адреса. Подробнее о ipconfig см. в Командах Ipconfig, которые вам нужно знать.

Зачем использовать CIM/WMI?

Когда вы запускаете командлет Get-NetIPAddress, PowerShell фактически обращается к WMI, чтобы получить эту информацию. Почему это важно знать? Потому что вы можете обращаться к WMI напрямую. Но зачем использовать WMI, когда можно воспользоваться одной командой?

Одна из самых распространенных причин использования WMI вместо одной команды, наподобие Get-NetIPAddress, заключается в том, что вы уже обращаетесь к WMI. WMI содержит множество информации о системе, которая пригодится при написании скриптов для инвентаризации.

При взаимодействии с WMI с помощью PowerShell вы можете создать CIM-сессию так же, как сеанс PSRemoting. Использование сеанса – это эффективный способ аутентификации на компьютере один раз и повторного использования этого соединения несколько раз.

Используйте CIM для получения IP-адреса, когда вы создаете это задание как часть более крупного скрипта.

Запрос CIM без сеанса

При написании скрипта PowerShell с использованием CIM для запроса различной информации следует использовать повторно используемую CIM-сессию. Повторное использование одного сеанса не только ускоряет ваш скрипт, но и уменьшает дублирование кода.

Например, возможно, вам захочется узнать, какая операционная система установлена на удаленном компьютере под управлением Windows. CIM содержит имя ОС в свойстве с именем Caption внутри класса Win32_OperatingSystem. Чтобы получить эту информацию, используйте Get-CimInstance cmdlet ниже, указывая имя компьютера (REMOTECOMPUTER), класс CIM (Win32_OperatingSystem) и обращаясь только к свойству Caption в объекте.

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

Когда вы запускаете Get-CimInstance, PowerShell должен найти удаленный компьютер, передать ему учетные данные пользователя и, наконец, запросить CIM для получения нужной информации. Запуск Get-CimInstance без сеанса сопряжен с некоторыми издержками.

Что если вы создаете сценарий инвентаризации сервера и также хотите получить информацию о хранении, памяти, сети и так далее? В этом случае у вас будет много команд Get-CimInstance, подобных приведенным ниже.

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

Ваш сценарий будет подключаться к REMOTECOMPUTER четыре раза в приведенном выше фрагменте кода, а что, если изменится имя компьютера? Вам придется находить/заменять это имя компьютера, что никогда не является хорошим признаком при кодировании.

Создание сеанса CIM

Вместо использования Get-CimInstance с сеансом, вы должны создать один сеанс CIM с помощью New-CimSession cmdlet и использовать этот сеанс повторно.

Вместо многократной аутентификации на удаленном компьютере создайте одну сессию CIM с помощью New-CimSession и передайте эту сессию в Get-CimInstance, как показано ниже.

$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

Когда вы закончите с сеансом, отключитесь и удалите его из памяти.

$cimSession | Remove-CimSession

Использование CIM-сессий, как показано выше, отличный способ работы с CIM/WMI.

Поиск правильного сетевого адаптера

Поскольку у компьютера под управлением Windows может быть несколько сетевых адаптеров, сначала необходимо определить, с какого сетевого адаптера вы хотели бы получить IP-адрес. При использовании WMI используйте класс Win32_NetworkAdapterConfiguration. Этот класс предоставляет много информации, которую возвращает Get-NetIPAddress.

Сначала создайте сценарий PowerShell с именем удаленного компьютера, создайте новую сессию CIM, а затем добавьте строку удаления сессии CIM ниже.

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

$cimSession | Remove-CimSession

После написания кода сессии CIM добавьте 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

Вы увидите, что выходные данные по умолчанию выше не показывают IP-адрес. Вам нужно немного покопаться глубже. Он также не возвращает один экземпляр. Как вы сузите поиск того, у которого IP-адрес, который вам нужен?

Для этого сначала отобразите все свойства с помощью Select-Object.

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

Прокрутите вывод, и вы заметите некоторые сетевые адаптеры без IP-адреса, некоторые с одним и некоторые с несколькими IP-адресами! Вам нужно сузить выбор. Вы должны найти стандартный критерий фильтрации, который можно применить ко всем серверам.

Lots of output from The Win32_NetworkAdapterConfiguration class!

На каждом адаптере вы должны увидеть свойство IPEnabled. Когда это свойство установлено в True, протокол TCP/IP привязан к данной сетевой карте, что является предпосылкой для наличия IP-адреса. Вам необходимо сузить выбор сетевых карт с установленным свойством IPEnabled в True, и тогда у вас будет та самая сетевая карта, которую вы ищете.

При фильтрации экземпляров WMI лучше всего использовать параметр Filter в Get-CimInstance. В сообществе PowerShell существует девиз, который гласит “фильтруй слева”. Если есть возможность, этот принцип означает всегда фильтровать вывод как можно ближе к началу.

Не используйте Where-Object, если необходимости в этом нет. Производительность будет намного выше из-за отсутствия накладных расходов при обработке ненужных объектов вдоль конвейера.

Параметр Filter в Get-CimInstance использует язык запросов Windows (WQL). WQL представляет собой небольшой поднабор SQL. Параметр Filter ожидает того же синтаксиса ограничения WHERE, что и SQL.

Чтобы найти все экземпляры CIM класса Win32_NetworkAdapterConfiguration со свойством IPEnabled, установленным в True, используйте запрос WQL SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'True'.

Поскольку мы уже указываем имя класса для параметра ClassName в аргументе Get-CimInstance, нам нужно указать IPEnabled = 'True' для Filter. Это вернет только сетевой адаптер с IP-адресом.

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

Когда вы запустите вышеуказанный фрагмент кода, вы увидите, что Get-CimInstance возвращает только один (или ограниченный набор) экземпляров.

Теперь, когда у вас есть единственный экземпляр CIM и вы знаете свойство, которое вы ищете (IPAddress), давайте посмотрим, как это выглядит. Вы увидите, что в этом случае он возвращает один экземпляр CIM, но с тремя строками для свойства IPAddress, включая адреса 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

Теперь вам нужно будет отфильтровать еще несколько элементов. Поскольку WQL не может фильтровать глубже, чем значение свойства IPAddress, вам теперь придется разобрать IPv4-адрес.

IPv4-адрес обычно является первым, определенным в массиве. Выберите его, обращаясь к индексу 0, как показано ниже. Когда вы это сделаете, вы увидите, что он возвращает только одну строку с IPV4-IP-адресом.

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

192.168.0.40

IPv4-адрес может не всегда быть первым элементом массива. Фактически, свойство IPAddress может вообще не быть массивом. Конфигурации IP существенно различаются среди адаптеров и различных настроек. Вам может потребоваться использовать творческий подход при их фильтрации.

Заключение

Если вам нужно использовать PowerShell для получения IP-адреса с компьютера, сначала обратите внимание на cmdlet Get-NetIPAddress. Если вы создаете более крупный сценарий или по какой-то причине не можете выполнить эту команду, изучите использование Get-CimInstance и сеанса CIM для выполнения необходимых действий.

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