Взаимодействие с TCP/IP через PowerShell (часть 3)

Опубликовано: 19 Марта, 2023

  • Взаимодействие с TCP/IP через PowerShell (часть 2)
  • Взаимодействие с TCP/IP через PowerShell (часть 4)

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

В конце моей последней статьи я неправильно заявил, что вы должны использовать WMI для получения информации о конфигурации IP-адреса. Конечно, вы можете использовать WMI, и я покажу вам, как это сделать. Однако можно получить информацию о конфигурации IP-адреса с помощью обычного командлета PowerShell. Вы просто не можете сделать это с помощью командлета Get-NetIPAddress. Вместо этого вам придется использовать командлет Get-NetIPConfiguration. Как видно на рис. A, этот командлет возвращает псевдоним интерфейса, индекс интерфейса, описание интерфейса, имя сетевого профиля (обычно это имя домена), IP-адрес, шлюз по умолчанию и DNS-сервер. Кроме того, этот командлет может возвращать информацию IPv4 и/или IPv6.

Изображение 4744
Рисунок A. Вы можете получить информацию о конфигурации IP-адреса с помощью командлета Get-NetIPConfiguration.

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

Чтобы показать вам, что я имею в виду, вспомните мою предыдущую статью, в которой я обсуждал командлет Get-NetIPAddress. Как вы помните, вы можете использовать командлет Get-NetIPAddress сам по себе, и PowerShell предоставит вам некоторую базовую информацию, связанную с использованием IP-адреса. Однако есть некоторые атрибуты, которые по умолчанию скрыты. Если вы хотите увидеть полный список атрибутов, вам нужно будет ввести Get-NetIPAddress | Выбрать объект *

Итак, какое отношение все это имеет к снимку экрана, показанному выше? Точно так же работает командлет Get-NetIP Configuration. Ну вроде. Как и большинство командлетов PowerShell, основанных на команде Get, командлет Get-NetIPConfiguration отображает некоторую базовую информацию, но есть и скрытые атрибуты. Как и в случае с командой Get-NetIPAddress, вы можете увидеть все эти атрибуты, добавив символ вертикальной черты (|) и Select-Object *

Честно говоря, полный набор атрибутов содержит не намного больше информации, чем показано выше. Тем не менее, с результирующим набором происходят некоторые действительно интересные вещи.

Чтобы показать вам, что я имею в виду, взгляните на рисунок B. Я начинаю с ввода командлета Get-NetIPConfiguration без каких-либо дополнительных командлетов. При просмотре результатов командлета обратите внимание на шлюз по умолчанию и DNS-сервер. Оба адреса IPv4. Теперь взгляните на шлюз по умолчанию и адреса DNS-серверов, когда я добавляю командлет Select-Object. Оба являются блоками текста, а не адресами. Так что же здесь происходит?

Изображение 4745
Рисунок B. Командлет Get-NetIPConfiguration не всегда возвращает ожидаемые результаты.

Чтобы показать вам, что происходит, нам нужно сосредоточиться на одном атрибуте. Давайте воспользуемся шлюзом IPv4DefaultGateway. Предположим, что мы вводим следующую команду:

Get-NetIPConfiguration | Select-Object IPv4DefaultGateway

PowerShell возвращает следующие результаты (по крайней мере, на моем сервере):

{MSFT_NetRoute (InstanceID = ":8:8:8:9:55?055;7AB;::8;::8;::55;")}

Очевидно, что приведенный выше текст совсем не похож на адрес IPv4. Тем не менее, забудьте на мгновение о том, что говорит строка выше. Первый признак того, что происходит что-то другое, заключается в том, что результат заключен в фигурные скобки {}. Если вы снова посмотрите на снимок экрана выше, вы заметите, что когда я ввел командлет Get-NetIPConfiguration сам по себе, ни один из результатов не был заключен в фигурные скобки. Вместо этого результаты состояли исключительно из текстовой строки. Так почему же мы видим брекеты сейчас? Давайте копнем в этом немного глубже.

Чтобы разгадать загадку того, почему мы видим закодированный текст, заключенный в фигурные скобки, давайте запустим командлет Get-Member. Мы сделаем это, введя следующую команду:

Get-NetIPConfiguration | Get-Member – имя IPv4DefaultGateway

Вы можете увидеть результаты этой команды на рисунке C.

Изображение 4746
Рисунок C. Вот что происходит, когда мы используем командлет Get-Member.

Как вы можете видеть на рисунке выше, определение шлюза IPv4DefaultGateway указано как ciminstance[]. Другими словами, свойство основано на экземпляре CIM.

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

Хорошо, это здорово, но что нам делать, если нам нужно работать со значением на основе CIM? Очевидно, что мы не можем выбрать свойство из команды Get-NetIPConfiguration.

Решение этой проблемы — углубиться в CIM. На самом деле это не так сложно сделать. Позвольте мне показать вам, как это делается.

Модель общего интерфейса разделена на классы, и каждый класс связан с определенным аспектом операционной системы. Поэтому наша первая задача — выяснить, какой класс CIM отвечает за настройку IP-адреса.

Один из способов выполнить эту задачу — создать список классов CIM и сделать обоснованное предположение. Чтобы просмотреть список классов CIM, введите следующую команду:

(Get-CimClass | Sort-Object –Property CimClassName).CimClassName;

Вы можете увидеть частичный список результатов на рисунке D.

Изображение 4747
Рисунок D: Это имена классов CIM по умолчанию.

Я избавлю вас от необходимости угадывать правильное имя класса CIM и скажу, что информация о конфигурации IP контролируется классом CIM с именем Win32_NetworkAdapterConfiguration.

Следующее, что нам нужно сделать, это выяснить, какие имена свойств используются в классе Win32_NetworkAdapterConfiguration. Для этого нам просто нужно посмотреть свойство Name для каждого объекта в классе. Это можно сделать с помощью следующих команд:

$NetworkAdapterConfigurationClass = Get-CimClass -ClassName Win32_NetworkAdapterConfiguration;

($NetworkAdapterConfigurationClass.CimClassProperties).Имя | Сортировать-Объект;

Первая строка кода определяет переменную с именем $NetworkAdapterConfigurationClass и связывает ее с классом Win32_NetworkAdapterConfiguration. Вторая строка кода извлекает все имена свойств в классе и отображает их в алфавитном порядке. Вы можете увидеть результаты на рисунке E.

Изображение 4748
Рисунок E. Это имена свойств, используемые в классе NetworkAdapterConfiguration.

Взглянув на рисунок выше, вы заметите, что есть свойство с именем DefaultIPGateway. Если мы хотим отобразить шлюз по умолчанию, все, что нам нужно сделать, это получить значение этого свойства. Для этого нам потребуется использовать следующие две строки кода:

$NetworkAdapterConfigurationList = Get-CimInstance -ClassName Win32_NetworkAdapterConfiguration;

$NetworkAdapterConfigurationList | Select-Object -Property DefaultIPGateway

Вы можете увидеть вывод этих команд на рисунке F. В этом случае вывод представляет собой читаемый текст, но результат по-прежнему заключен в фигурные скобки. Причина фигурных скобок в том, что результат является частью массива. Microsoft рассматривает шлюз по умолчанию как массив значений, поскольку система может иметь несколько шлюзов по умолчанию.

Изображение 4749
Рисунок F: Мы можем получить шлюз по умолчанию.

Вывод

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

  • Взаимодействие с TCP/IP через PowerShell (часть 2)
  • Взаимодействие с TCP/IP через PowerShell (часть 4)