Администраторы информационных технологий могут делать многое с помощью 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-адрес на всех сетевых адаптерах на локальном компьютере, выполните одну строку.

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

Готово! Просто использование 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
, PowerShell должен найти удаленный компьютер, передать ему учетные данные пользователя и, наконец, запросить CIM для получения нужной информации. Запуск Get-CimInstance
без сеанса сопряжен с некоторыми издержками.
Что если вы создаете сценарий инвентаризации сервера и также хотите получить информацию о хранении, памяти, сети и так далее? В этом случае у вас будет много команд Get-CimInstance
, подобных приведенным ниже.
Ваш сценарий будет подключаться к REMOTECOMPUTER
четыре раза в приведенном выше фрагменте кода, а что, если изменится имя компьютера? Вам придется находить/заменять это имя компьютера, что никогда не является хорошим признаком при кодировании.
Создание сеанса CIM
Вместо использования Get-CimInstance
с сеансом, вы должны создать один сеанс CIM с помощью New-CimSession
cmdlet и использовать этот сеанс повторно.
Вместо многократной аутентификации на удаленном компьютере создайте одну сессию CIM с помощью New-CimSession
и передайте эту сессию в Get-CimInstance
, как показано ниже.
Когда вы закончите с сеансом, отключитесь и удалите его из памяти.
Использование CIM-сессий, как показано выше, отличный способ работы с CIM/WMI.
Поиск правильного сетевого адаптера
Поскольку у компьютера под управлением Windows может быть несколько сетевых адаптеров, сначала необходимо определить, с какого сетевого адаптера вы хотели бы получить IP-адрес. При использовании WMI используйте класс Win32_NetworkAdapterConfiguration. Этот класс предоставляет много информации, которую возвращает Get-NetIPAddress
.
Сначала создайте сценарий PowerShell с именем удаленного компьютера, создайте новую сессию CIM, а затем добавьте строку удаления сессии CIM ниже.
После написания кода сессии CIM добавьте WMI-запрос.

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

На каждом адаптере вы должны увидеть свойство 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
возвращает только один (или ограниченный набор) экземпляров.
Теперь, когда у вас есть единственный экземпляр CIM и вы знаете свойство, которое вы ищете (IPAddress
), давайте посмотрим, как это выглядит. Вы увидите, что в этом случае он возвращает один экземпляр CIM, но с тремя строками для свойства IPAddress
, включая адреса IPV6.
Теперь вам нужно будет отфильтровать еще несколько элементов. Поскольку WQL не может фильтровать глубже, чем значение свойства IPAddress
, вам теперь придется разобрать IPv4-адрес.
IPv4-адрес обычно является первым, определенным в массиве. Выберите его, обращаясь к индексу 0, как показано ниже. Когда вы это сделаете, вы увидите, что он возвращает только одну строку с IPV4-IP-адресом.
IPv4-адрес может не всегда быть первым элементом массива. Фактически, свойство IPAddress может вообще не быть массивом. Конфигурации IP существенно различаются среди адаптеров и различных настроек. Вам может потребоваться использовать творческий подход при их фильтрации.
Заключение
Если вам нужно использовать PowerShell для получения IP-адреса с компьютера, сначала обратите внимание на cmdlet Get-NetIPAddress
. Если вы создаете более крупный сценарий или по какой-то причине не можете выполнить эту команду, изучите использование Get-CimInstance
и сеанса CIM для выполнения необходимых действий.
Source:
https://adamtheautomator.com/powershell-get-ip-address/