Главная > Администрирование, Powershell > Изменение IP-адреса через Powershell

Изменение IP-адреса через Powershell

Недавно довелось в одной небольшой сети (со статической IP-адресацией) повозиться с IP-адресами. А именно: изменить IP-адреса у некоторых компьютеров.

Естественно, что ходить по рабочим местам, сгонять оттуда пользователей, перелогиниваться – не вариант. Как всегда на помощь пришёл Powershell.

Действовать было решено через WMI. Наверное не самый лучший способ, но обо всём по порядку.

Итак, у скрипта будет два обязательных параметра: существующий IP-адрес, и IP-адрес, на который его нужно изменить:

Param
(
    [Parameter(Mandatory=$True)]
    [ipaddress]$IPAddress,
    
    [Parameter(Mandatory=$true)]
    [ipaddress]$NewIPAddress
 )

Кстати, в сравнительно недавно вышедшем Powershell 3.0 это же задание параметров будет выглядеть немного проще:

Param
(
    [Parameter(Mandatory)]
    [ipaddress]$IPAddress,
    
    [Parameter(Mandatory)]
    [ipaddress]$NewIPAddress
 )

Т.е. то, что параметр обязательный подразумевается по умолчанию при задании ключевого слова Mandatory.

Далее идёт ряд проверок на то, что заданный компьютер включён и доступен, и что его предполагаемый новый IP-адрес свободен:

# Проверяем включён-ли компьютер ($IPAddress)
# Если включён - продолжаем
if (Test-Connection -ComputerName $IPAddress -Count 1 -Quiet)
{
    # Если $NewIPAddress свободен - меняем
    if (-not (Test-Connection -ComputerName $NewIPAddress -Count 1 -Quiet))
    {
        try
        {
            ...
        }
        catch
        { Write-Warning ("{0}: {1}" -f $IPAddress,$_.Exception.Message) }
    }
    
    # Если $NewIPAddress занят - выходим
    else
    { Write-Warning "$NewIPAddress занят`n" }
}

# Если $IPAddress не включён - выходим
else
{ Write-Warning "$IPAddress недоступен" }

Все описанные ниже действия выполняются в теле блока try.

Для начала нужно добраться до того адаптера, с которым будем работать:

# Получаем настройки TCP/IP для данного IP-адреса
$NetworkAdapterConfiguration = Get-WmiObject Win32_NetworkAdapterConfiguration `
    -ComputerName $IPAddress -Filter "IPEnabled = $true" -ErrorAction Stop |
    Where-Object {$_.IPAddress -eq $IPAddress}

Само изменение IP-адреса выполняется вызовом метода EnableStatic, которому в качестве параметров передаются IP-адрес и маска подсети, поэтому эту маску нужно предварительно получить:

# Маска подсети
$Mask = $NetworkAdapterConfiguration.IPSubnet

# Меняем IP-адрес
$NetworkAdapterConfiguration.EnableStatic($NewIPAddress, $Mask)

Собственно вот и всё 🙂

Теперь о том, почему этот способ, наверное, не самый лучший.

В принципе всё прекрасно работает, IP-адреса меняются, но при вызове EnableStatic вылазит ошибка: “Исключение при вызове "EnableStatic" : "Сбой при удаленном вызове процедуры. (Exception from HRESULT: 0x800706BE)"”. К сожалению, разобраться в чём причина пока такого поведения не удалось. На русскоязычных ресурсах не нашёл вообще ничего подходящего, на англоязычных звучат неубедительные предположения от неправильной настройки файервола и до того, что Powershell не предусматривает никаких средств настройки тайм-аута. Как вариант предлагают использовать возможности .NET Framework и утилиту PsExec из пакета PsTools, но это уже совсем другая история. 🙂

Реклама
  1. Комментариев нет.
  1. No trackbacks yet.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: