Поскольку мне часто приходится тестировать конфигурации компьютеров для клиентов, исследовать различные вопросы для будущих статей или настраивать демонстрационные системы для обучения, я постоянно строю с нуля сети с Active Directory (AD). Инструменты типа мастеров настройки быстро надоедают, и иногда я чувствую, что трачу слишком много времени впустую, ожидая приглашения программы с графическим интерфейсом на ввод настроек. Как убежденный пользователь пакетных файлов еще со времен PC-DOS 1.0, я создал на их базе ряд инструментов, которые позволяли мне быстро настраивать сети, оснащенные AD, и хочу поделиться с читателями опытом применения этих весьма полезных автоматизированных решений.
Ради простоты пример статьи ограничен сетью из двух серверов с именами UptownDC и DowntownDC. На одном сервере установлена Windows Server 2003, на другом Windows 2000 и на обоих предусмотрены средства поддержки и служба DNS Server. Прежде всего, необходимо назначить статические IP-адреса для UptownDC и DowntownDC и установить суффикс DNS для зоны DNS, которая будет создана впоследствии. IP-адрес сервера UptownDC — 192.168.0.2, а сервера DowntownDC — 10.0.0.2. Оба сервера расположены в сетях класса C, т. е. используют маску подсети 255.255.255.0.
Я собираюсь создать домен AD с именем bigfirm.biz, но сначала мне нужно сформировать зону DNS с именем bigfirm.biz, а это сделать проще, если мои серверы DNS уже имеют DNS-суффикс bigfirm.biz. Следовательно, сперва требуется назначить статический IP-адрес и DNS-суффикс. К сожалению, мне так и не удалось найти удобного способа переименовывать компьютеры Windows 2000 из командной строки. Инструмент Netdom Renamecomputer работает только на системах, уже включенных в состав доменов. Поэтому имена компьютеров UptownDC и DowntownDC я вынужден вводить через графический интерфейс.
Используем Netsh
Для назначения IP-адреса я воспользуюсь малоизвестным инструментом под названием Netsh, встроенным в Windows 2000 и более поздние версии. Для того чтобы с помощью Netsh назначить статический IP-адрес, следует ввести
netsh int ip set address
static
где nicsname — это имя сетевого адаптера, IP-адрес которого требуется настроить; ipaddress, subnetmask и gateway — это IP-адрес сетевого адаптера, маска подсети и IP-адрес шлюза, которые решено назначить настраиваемому сетевому адаптеру, и metric — это значение IP-метрики, которое будет назначено шлюзу. Например, если я введу
netsh int ip set address
«Local Area Connection» static 192.168.0.2
255.255.255.0 192.168.0.1 2
на сервере UptownDC, то произойдет назначение статического IP-адреса 192.168.0.2 с маской подсети 255.255.255.0 и шлюзом по умолчанию 192.168.0.1, а UptownDC будет знать, что шлюз по умолчанию требует наличия одного транзитного участка для доступа в Internet.
Эта команда выглядит весьма простой, хотя и длинной, однако следует отметить две ее особенности. Во-первых, Netsh во время исполнения делает паузу на одну-две минуты. Не знаю точно, что при этом происходит, но если от команды Netsh не последует немедленного отклика, беспокоиться не стоит. Во-вторых, параметр nicsname не совсем точно соответствует интуитивному представлению, которое заключено в его названии (nicsname — имя сетевого адаптера).
Команда Netsh Int Ip Set Address может установить IP-адрес сетевого адаптера, но на многих системах установлен не один сетевой адаптер, и именно поэтому Netsh имеет параметр nicsname. Чтобы просмотреть имена сетевых адаптеров, нужно щелкнуть правой кнопкой My Network Places, выбрать Properties и заголовок LAN or High-Speed Internet. Если в системе установлен только один сетевой адаптер, то, возможно, будет выведено имя по умолчанию Local Area Connection. Вводить Local Area Connection неудобно, поэтому я обрадовался, обнаружив, что Netsh не требует полного имени сетевого адаптера. Команде Netsh достаточно лишь нескольких букв, позволяющих отличить один сетевой адаптер от других. Например, если в системе имеется два сетевых адаптера с именами inner NIC и outer NIC, то в качестве идентификаторов можно использовать inner и outer или даже i и o. Если установлен только один сетевой адаптер с именем Local Area Connection, то вместо полного имени можно использовать Local или даже L, как в следующем примере:
netsh int ip set address
L static 192.168.0.2
255.255.255.0 192.168.0.1 2
Поскольку L не содержит пробелов, это имя заключать в кавычки не нужно.
Кстати, если потребуется настроить сетевой адаптер для использования DHCP, синтаксис Netsh предусматривает и такую возможность. Нужно просто удалить static и конкретные IP-адреса, маску подсети и значение метрики, а затем добавить source=dhcp или dhcp после имени адаптера. Для того чтобы изменить настройки сетевого адаптера Local Area Connection для DHCP, следует ввести:
netsh int ip set address L dhcp
Настройка DNS и WINS
Настройка TCP/IP на сетевом адаптере охватывает не только IP-адрес и шлюз. Потребуется также указать серверы DNS и WINS. Для этого я мог бы воспользоваться графическим интерфейсом, но почему бы не задействовать пакетный файл? Настройка на использование DNS или WINS производится с помощью Netsh следующим образом:
netsh int ip set [dns|wins]
static
Предположим, что в соответствии с моим планом сервер UptownDC (сервер с адресом 192.168.0.2) должен выступать в роли сервера WINS и DNS для этой сети. Но я уже настроил UptownDC, поэтому непонятно, какие адреса следует предоставить для DNS и WINS. Обычно я даю серверу (в данном случае UptownDC) команду разрешать имена в DNS и WINS локально, поэтому в пакетный файл просто добавляю следующие строки:
netsh int ip set dns
L static 192.168.0.2
netsh int ip set wins
L static 192.168.0.2
Еще одно соображение по Netsh: если требуется выполнить сложную настройку IP, которую вы хотели бы создать из командной строки, то помочь в этом может команда Netsh Int Dump. После настройки TCP/IP следует просто набрать:
netsh int dump
и Netsh создаст сценарий, позволяющий менять конфигурацию TCP/IP.
Доменный суффикс DNS
Итак, на данный момент мы имеем следующее: пакетный файл, содержащий три строки, с настройками IP-адреса, маски подсети, шлюза и серверов DNS и WINS. Теперь переходим к доменному суффиксу DNS. На собственном опыте я убедился, что настроить сервер DNS проще, если он уже имеет доменный суффикс. Иначе программное обеспечение сервера DNS оставляет предупреждения в системном журнале. Кроме того, сервер не может выполнять динамическую регистрацию своих записей в DNS, если он не знает, в какой зоне их регистрировать. Поэтому если UptownDC будет входить в состав домена bigfirm.biz, то серверу понадобится доменный суффикс bigfirm.biz как можно скорее.
Я не нашел ни одного задокументированного Microsoft способа установить доменный суффикс из пакетного файла, поэтому разработал собственный метод. Напомню, что я отталкиваюсь от простой системы, которая является членом рабочей группы, а не домена. Такие системы содержат минимум программного обеспечения: по существу, оно ограничено собственно сервером и серверными службами DNS и WINS. Так что, хотя я гарантирую, что теоретически этот метод работает на компьютерах рабочих групп с минимальным набором предустановленного программного обеспечения, ручаться за его эффективность на более сложных системах не могу. Поэтому советую протестировать данный метод, прежде чем на него полагаться.
Необходимо установить доменный суффикс через графический интерфейс, перезагрузиться, затем найти в реестре этот доменный суффикс. В результате вы обнаружите два изменения — оба в разделе реестра HKEY_LOCAL_MACHINESYSTEMCurrentControlSet ServicesTcpipParameters. И параметр NV Domain, и параметр Domain (оба типа REG_SZ) содержат имя доменного суффикса DNS. Чтобы превратить UptownDC в UptownDC.bigfirm.biz, я должен открыть реестр, перейти к подразделу HKEY_LOCAL_MACHINESYSTEMCurrentControlSet ServicesTcpipParameters, добавить новый параметр типа REG_SZ с именем NV Domain и задать его значение, bigfirm.biz, после чего проделать то же самое с Domain.
Но нельзя ли автоматизировать эту процедуру? В Windows 2003, Windows XP и Windows 2000 имеется полезный инструмент командной строки для управления реестром — reg.exe. Вот пример команды reg.exe, создающей параметр реестра и присваивающей ему значение в разделе HKEY_LOCAL_MACHINE:
reg add HKLM /v
/d /f
Ключ /v означает, что вы хотите присвоить параметру конкретное значение (а не создать пустой параметр). Ключ /f делает команду приоритетной. Если не сделать команду reg.exe приоритетной и в процессе выполнения она обнаруживает, что определенное значение или параметр уже существует, выполнение команды прерывается с требованием подтверждения необходимости выполнения изменений. Пополнив багаж своих знаний этой командой, я могу добавить в пакетный файл настройки еще две строки:
reg add
HKLMSYSTEMCurrentControlSetServicesTcpip
Parameters /v Domain /d «bigfirm.biz» /f
reg add
HKLMSYSTEMCurrentControlSetServicesTcpip
Parameters /v «NV Domain» /d «bigfirm.biz» /f
Обычно всякий раз при изменении доменного суффикса компьютера система настаивает на перезагрузке. Я не знаю, чем объясняется необходимость перезагрузки, но подозреваю, что дело в следующем: Windows запрограммирована на обязательную перезагрузку после смены имени компьютера, а доменный суффикс DNS расположен на той же самой странице Properties. По своему опыту могу сказать, что перезагрузку после настройки этих параметров реестра выполнять не обязательно.
Можно ли обеспечить обязательную перезагрузку после смены доменного суффикса? В Windows 2003 и XP имеется полезная команда под названием shutdown.exe, которая предназначена как раз для этого. Хотя в Windows 2000 такой команды нет, XP-версия хорошо работает в Windows 2000 и, кроме того, можно воспользоваться командой shutdown.exe из комплекта Microsoft Windows 2000 Server Resource Kit. Синтаксис команды shutdown.exe в Windows 2003 и Windows 2000 различен, поэтому пакетные файлы будут разные в зависимости от операционной системы. Пакетный файл в Windows 2003 будет заканчиваться строкой
shutdown /r /t 0 /f
а пакетный файл в Windows 2000 — строкой
shutdown /r /t:0 /c
Марк Минаси — редактоp Windows NT Magazine MCSE и автор книги «Mastering Windows NT Server 4.0» (издательство Sybex). С ним можно связаться по адресу: mark@minasi.com