Как проверить конкретный IP-адрес, а затем изменить его, если он не существует?

Я пытаюсь проверить определенный IP-адрес, а затем изменить его, если его нет в Powershell.

Я не уверен, что не так с моим кодом:

if($wmi.ipaddress -ne "10.0.0.15") {$wmi = Get-WmiObject win32_networkadapterconfiguration -filter "ipenabled ='true'"
                                       $wmi.EnableStatic("10.0.0.15", "255.255.255.0")
                                       $wmi.SetGateways("10.0.0.1", 1)
                                       $wmi.SetDNSServerSearchOrder("127.1.1.12")}

2 ответа

Пара проблем.

  1. Нет никакой гарантии, что $wmi - это отдельный объект, поэтому попытка вызова методов для него - это прыжок с верой, что ваш фильтр будет соответствовать только одному NIC. Если существует более одного NIC с IP-адресом, Get-WmiObject возвращает массив объектов, представляющих NIC. Это может иметь один из двух эффектов:

    • В версиях PowerShell 1 и 2 $wmi.ipaddress будет иметь значение null, и все вызовы ваших методов будут неудачными, потому что это недопустимые методы объектов массива.
    • В PowerShell версии 3 и выше $wmi.ipaddress будет массивом всех IP-адресов на всех сетевых картах в массиве. Хуже того, ваши вызовы методов будут применяться к каждому объекту в массиве, что означает, что вы пытаетесь настроить один и тот же IP-адрес для нескольких сетевых карт.

  2. Как уже упоминалось в TessellatingHeckler, свойство IPAddress является массивом. Если вы предоставляете массив в качестве левого операнда оператора сравнения, PowerShell возвращает массив всех совпадающих элементов (например, ('a', 'b', 'c', 'd') -ne 'c' возвращает массив строк a, b, а также d).

    Итак, если $wmi - это отдельный объект, ваше условие проверки ($wmi.ipaddress -ne "10.0.0.15") будет истинным, если у NIC есть какие-либо IP-адреса, кроме 10.0.0.15. Если ни один из ваших сетевых адаптеров не имеет нескольких IP-адресов, то это условие будет работать, чтобы определить, не имеет ли сетевой адаптер этого IP-адреса, но в обходном порядке - потому что возвращаемое значение сравнения представляет собой пустой массив, который преобразуется в Ложное логическое значение.

    С другой стороны, если у NIC есть IP-адрес 10.0.0.15 и любой другой IP-адрес (а), то условие вернет True, потому что сравнение вернет массив других IP-адресов.

    Условие теста в ответе Тесселлинг Хеклера,

    ($wmi.IPAddress -notcontains "10.0.0.15")
    

    будет работать, или следующее также будет работать

    (! ($wmi.IPAddress -eq "10.0.0.15"))
    

    потому что это будет False, только если массив IPAddress включает 10.0.0.15.

Однако ни одно из условий тестирования в 2. не поможет вам, если вы не решите проблему в 1.. В обоих случаях условие вернет значение False, если какой-либо из сетевых адаптеров имеет IP-адрес 10.0.0.15, что на самом деле, вероятно, то, что вам нужно, но затем вы попытаетесь установить один и тот же IP-адрес на нескольких сетевых картах.

Посмотрите последнюю часть этого ответа, который я разместил в Stack Overflow, чтобы узнать, как обеспечить получение только одного объекта. Get-WmiObject Win32_NetworkAdapterConfiguration, Однако это не гарантирует, что вы выберетеправильный сетевой адаптер. Это не то, что я мог бы рассказать вам, как это сделать, потому что я не знаю, по каким критериям вы хотите определить, какой сетевой карте будет назначен нужный IP-адрес, если существует несколько сетевых карт, где IPEnabled имеет значение true.

Одна заключительная мысль: вы случайно пытаетесь выполнить этот скрипт на удаленном компьютере? Если это так, посмотрите этот обходной путь, который я предоставил кому-то, у кого были проблемы со сценарием, который пытался использовать объект PowerShell WMI для изменения конфигурации IP на удаленном компьютере.

IPAddress в объекте Win32_NetworkAdapterConfiguration является строковым массивом, а не строкой, поэтому вам может потребоваться проверить, находится ли IP-адрес в массиве, а не равен ли он массиву:

if ($wmi.IPAddress -notcontains "10.0.0.15") { ... }
Другие вопросы по тегам