Если вы занимаетесь администрированием DNS в системах Windows Server, то, возможно, помните мои публикации, посвященные Dnscmd – мощному инструменту командной строки, позволяющему выполнять практически любые задачи управления DNS. Не умаляя достоинств Dnscmd, я рад сообщить, что теперь администраторы DNS обрели новую группу поддержки в лице 100 команд PowerShell. В этом выпуске я расскажу о трех из них, а также приведу пример, как один простой «мощный инструмент» PowerShell можно сделать еще более мощным.

Подготовка

Какую версию Windows Server нужно иметь, чтобы использовать 100 новых команд? Я еще не успел опробовать всю сотню, но, насколько могу судить, для их применения в отношении системы Windows Server 2008 R2 достаточно иметь рабочую станцию Windows 8, которая присоединена к домену, и на которой загружены и установлены средства удаленного администрирования сервера (RSAT) для Windows 8. Для вывода списка из 100 команд DNS воспользуйтесь следующей командой:

get-command *-dnsserver*

Если же вы работаете с системой Windows Server 2012, то просто установите встроенные средства управления DNS, и команды DNS будут в вашем распоряжении.

Две команды Get-

Как вы, вероятно, уже поняли, знакомство с блоками команд PowerShell следует начинать с тестирования команд Get-. Get-dnsserveredns выдает информацию о том, включены ли у сервера DNS расширения DNS (у меня были включены). Get-dnsserverrecursion позволяет узнать, принимает ли сервер DNS запросы к зонам, которых не существует на этом сервере. Предположим, я запрашиваю у локального DNS-сервера, обслуживающего AD, ресурс www.microsoft.com. На локальном сервере DNS работа с общедоступной зоной Microsoft не ведется, и запросы к интернет-ресурсам он будет выполнять только после включения рекурсии.

Чем полезна эта функция? К сожалению, за последние годы сильно возросло число попыток использования серверов DNS для организации вредоносных распределенных атак типа «отказ в обслуживании» (DoS), что вынуждает администраторов выключать рекурсию на серверах DNS (по умолчанию она включена). В таких случаях полезно иметь возможность проверить данный сервер DNS или задействовать превосходные средства удаленного взаимодействия PowerShell. Например, если имеется пять DNS-серверов D1, D2, D3, D4 и D5, то простой отчет об их состоянии рекурсии можно вывести с помощью команды

invoke-command -computername d1,d2,d3,d4,d5 -scriptblock {get-dnsserverrecursion|select pscomputername,enable}

Команда invoke-command уже упоминалась выше. Мы знаем, что параметр –scriptblock позволяет в фигурных скобках дать удаленным компьютерам команду, которую следует выполнить. В данном случае в фигурных скобках стоит команда DNS, за которой следует оператор Select с указанием имени компьютера, на котором следует выполнить эту команду, а также результат.

Одна команда Add-

В Server 2012 одной из команд DNS, позволяющих экономить время, является add-dnssecondaryzone. Я обнаружил ее, выполняя настройку нового сервера DNS в качестве вторичного сервера для определенной группы зон DNS. Настройка вторичного сервера DNS для существующего домена с помощью графического интерфейса или Dnscmd – тривиальная задача. Как выяснилось, настроить вторичный сервер DNS для домена bigfirm.com с основным IP-адресом 71.23.1.5 и сохранением данных зоны в текстовый файл bigfirm.com.dns можно с помощью следующей команды:

add-dnssecondaryzone bigfirm.com «bigfirm.com.dns» 71.23.1.5

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

$zones=«bigfirm.com»,«minasi.com»,«mmco.com»,«pungogrill.com»,«thesoftwareconspiracy.com»,«softwareconspiracy.com»,«steadierstate.com»

Затем с помощью конвейера и команды foreach-object я организовал передачу имени каждой зоны команде add-dnssecondaryzone с помощью встроенной переменной $_, содержимым которой является то, что в данный момент находится в конвейере:

$zones | foreach-object {Add-DnsServerSecondaryZone $_ $_+«.dns» «71.23.1.5»}

Это сработало сразу же, так что теперь мы будем говорить о средствах конвейерной передачи ForEach-Object и $_, но уже в следующий раз.