Главная > Powershell > Изменение шлюза по умолчанию на нескольких компьютерах

Изменение шлюза по умолчанию на нескольких компьютерах

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

Вполне возможно, что эта операция будет проделываться несколько раз и количество компьютеров за один запуск скрипта может быть от одного до n (нет, n мало, лучше m :)). Поэтому скрипт сначала будет пытаться получить список через параметр, а в случае если список не задан через параметр то будет спрашивать файл со списком компьютеров (по одному в каждой строке):

param
(
    $Computers
)

# Если компьютеры не заданы нужно указать файл со списком компьютеров
if (-not $Computers)
{
    Write-Warning "Компьютеры не заданы"
    "`nПоэтому нужно указать путь к файлу со списком компьютеров`n"
    
    do
    {
        $FilePath = Read-Host "Файл"
        $Computers = Get-Content $FilePath
    }
    # Проверка правильности введённого пути
    while(-not (Test-Path $FilePath))
}

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

foreach ($Computer in $Computers)
{
    ...
}

Для получения/изменения настроек сети будем использовать WMI-класс Win32_NetworkAdapterConfiguration.

Для начала нужно определиться с каким сетевым адаптером будем работать.

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

Get-WmiObject Win32_NetworkAdapterConfiguration -ComputerName $Computer `
  -filter "IpEnabled = True" | Where-Object {$_.IPAddress -like '192.168.1.*'}

Вообще фильтрацию по IpEnabled можно не делать (работать будет), но многоразовые замеры показали, что с такой фильтрацией команда выполняется на 3-5 сек. быстрее, что вполне логично: если без фильтрации мы перебираем вообще все адаптеры, и из них выбираем один, то с фильтрацией поиск происходит только по тем адаптерам, у которых инициализировано свойство IpEnabled (протокол TCP/IP включён).

После того как нужный адаптер найден всё что остаётся – это изменить шлюз, вызвав метод SetGateways() и передав ему IP-адрес шлюза. Этот метод возвращает некую структуру, в которой нам в данном случае интересен лишь код возврата – ReturnValue: если он равен нулю, то операция выполнена успешно:

# Пытаемся изменить шлюз
Write-Host "`n$Computer..."
try
{
    if (((Get-WmiObject Win32_NetworkAdapterConfiguration `
        -ComputerName $Computer -filter "IpEnabled = True" |
        Where-Object {$_.IPAddress -like "192.168.1.*"}).`
        SetGateways('192.168.1.1')).ReturnValue -eq 0)
    {
        Write-Host -ForegroundColor Green "OK"
    }
    else
    {
        Write-Warning "Что-то пошло не так, шлюз не изменён"
    }
}
catch
{
    Write-Warning ("{0}: {1}" -f $Computer,$_.Exception.Message)
}

Выглядит громоздко, но на самом деле всё очень просто 🙂

Для отлавливания всяких неприятных ситуаций (вроде недоступности WMI) используется блок try-catch. Благодаря этому при возникновении нештатной ситуации будет выведено имя компьютера и причина отказа. Также производится проверка на доступность компьютера по сети, которую я здесь опустил, чтоб ещё больше не загромождать код 🙂

При успешном выполнении команды после имени компьютера выводится соответствующее сообщение.

Реклама
Рубрики:Powershell Метки: ,
  1. Комментариев нет.
  1. No trackbacks yet.

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

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

Логотип WordPress.com

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

Фотография Twitter

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

Фотография Facebook

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

Google+ photo

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

Connecting to %s

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