Назад | Перейти на главную страницу

Как мне проверить конкретный 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")}

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

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

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

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

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

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

    Условие теста в ответе TessellatingHeckler,

    ($wmi.IPAddress -notcontains "10.0.0.15")
    

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

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

    потому что оно будет ложным, только если Айпи адрес массив включает 10.0.0.15.

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

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

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

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

if ($wmi.IPAddress -notcontains "10.0.0.15") { ... }