2009-08-27

Offline Domain Join

Идея Offline Domain Join состоит в том, чтобы сначала “подготовить” AD к подключению клиента. Затем выполнить подготовку клиентской машины. Возможно без сети, но с помощью файла полученного на первом этапе. Когда клиентская машина будет в сети, она максимально быстро начнет работать в домене. При больших масшатабах очень удобно и экономно. Что интересно, для подготовки клиентской машины она не обязана быть включенной. Необходима только возможность модификации файлов ОС. Это удобно при использовании виртуальных машин. Далее разберем еще одну проблему, которую решает Offline Domain Join.

С выходом Windows 2008 появились контроллеры домена только для чтения. Это огромный шаг вперед с точки зрения безопасности AD (читай: безопасности всей инфраструктуры) и надежности репликации (читай: надежности всей инфраструктуры). Все просто. В контроллере только для чтения нельзя изменить доменные данные. Туда не реплицируются лишние(не нужные в филиале) пароли. С RODC нет исходящей репликации, это сильно упрощает топологию репликации и повышает ее надежность. Все проблемы, возникшие при использовании RODC  (e.g. Dynamic DNS Updates), MS изящно решила. Ну или почти все...

Представьте ситуцию с развертыванием филиала. Для филиала вы создали сайт, определили подсети в нем. На виртуальную машину установили RODC. Все протестировали и выслали образ в филиал. Сетевые инженеры решили свои вопросы. Местный техник успешно запустил подготовленную виртуальную машину(машины) с RODC, DNS и прочими ролями/сервисами. Остается самое простое: подключить клиентские машины в домен и, наконец, начать зарабатывать деньги, эксплуатируя офисный планктон. Но тут начинаются проблемы. Нет, не с офисным планктоном, а с подключением рабочих станций в домен при использовании RODC.

Но если на эти самые клиентские рабочие станции развернут Windows 7, жить становится легче. Задача подлючения к домену рабочих станций в филиале с RODC решается по шагам:

  1. Provisioning. Этот этап включает в себя создание учетных записей компьютеров и подготовку файлов для клиентских машин.
  2. Форсировать репликацию.
  3. Offline Domain Join. Подлючить рабочие станции в домен с использованием подготовленных файлов.

Второй пункт не содержат ничего интересного, а первый и третий пункты относятся к Offline Domain Join. При использовании RWDC (Read-Write DC) подключение в домен элементарно. С клиентской стороны есть графический интерфейс, команда netdom, программный интерфейс. При подключении понадобится доменная учетка с правом подключения компьютеров в домен и локальная учетка с правами администратора. Кстати, по умолчанию все доменные пользователи могут подключить в домен до 10 компьютеров, если конечно они будут владеть административными учетками на самих рабочих станциях.

При подключении в домен происходят: сетевое общение клиента с DNS сервером и контроллером, внесенение изменений в базу данных AD, внесение изменений на рабочей станции. Идея Offline Domain Join состоит в том, чтобы некоторые операции “вынести за скобки” т.е. выполнить заранее:

  1. Избавиться от относительно длительного сетевого взаимодействия.
  2. Заранее создать учетные записи для компьютеров. Правда, это можно было сделать и раньше.
  3. Подготовить данные для OC. Ведь мы не общаемся с контроллером, откуда мы узнаем что нужно подправить у себя? ОС это узнает из файла, который был заранее подготовлен.

Что нужно для Offline Domain Join:

  • Компьютер с помощью которого производится “Provisioning” должен работать на Windows 7/Windows Server 2008 R2. Так-же он должен быть членом домена, необходим доступ к контроллеру. Является ли данная машина контроллером или нет --- не имеет значения. Контроллер может работать под управлением более старой ОС.
  • Машина которую вводим в домен должна работать на Windows 7/Windows Server 2008 R2.

Как это делается? На доменной машине даем команду:

blog_04

Если ОС контроллера домена ниже чем Windows Server 2008 R2, надо добавить опцию /downlevel:

blog_06

Что в итоге? Мы получили пару бинарных файлов:

blog_10

А так-же пару учеток в AD:

blog_11

Далее, переносим файл на машину, которую хотим подключить к домену и с правами локального администратора выполняем команду djoin /requestodj и перегружаем машину:

blog_07

Допустим, мы работаем не с работающей машиной, а с образом виртуальной машины. Для монтирования vhd файла можно использовать diskpart. Подмонтировать vmdk образ можно с помощью vmware-mount. Команда djoin /requestodj будет еще проще. Параметр /localos теперь не нужен. Параметр /windowspath <path> должен указывать на папку windows виртуальной машины.  После выполнения команды виртуальную машину можно включать.

blog_09

Вот и все. Надо помнить, что Offline Domain Join только ускоряет подключение в домен. Без контроллера не удасться воспользоваться доменными учетками для логина или скачать групповые политики.

Где, кроме сценария с RODC, может быть полезно использование Offline Domain Join:

  • Сверхбольшие ЦОД с огромным количество виртуальных машин с Windows Server 2008 R2 или Windows 7. Подключение этих машин необходимо не только автоматизировать, но и ускорить. Вы знаете, что в качестве шаблонов виртуальных машин всегда используют машины вне домена, на которых так или иначе отработал sysprep. После включения, машину вводят в домен, а это не  очень быстро. При использовании Offline Domain Join виртуальная машина, которая еще ни разу не запускалась, уже обладает информацией о домене, контроллере и т.д.
  • Техник, выполняющий подключение к домену должен обладать минимумом привиллегий.
  • Скрипты, выполняющие автоматическое подключение к домену, не должны содержать паролей.

 

Умельцы уже успели написать парсер для файла, используемого в Offline Domain Join.

Используем модули Powershell

В Powershell v.2 появилось понятие module. В Windows 7/R2 как-раз вторая версия Powershell. В ОС есть готовый набор модулей. Посмотреть доступные модули можно так:

image

Использовать модули очень просто. Get-Command –module <modulename> позволит узнать какие командлеты доступны в указанном модуле. Import-Module <modulename> подгружает модуль. Далее можно начать использовать командлеты.

Для установки ролей и фич с командной строки в Windows Server 2008 можно было использовать servermanagercmd или ocsetup. Теперь рекомендуемый способ – использование модуля servermanager. Там всего три командлета.

image

Вот как можно, например, создать объект групповой политики:

blog_01

Куда пропал netdom?

Если в Windows 7 попытаться воспользоваться командой netdom, получите такой результат

00

Нет этой команды в семерке. В  Windows Server 2008 R2 она, кстати, присутствует. Как же теперь из командной строки/скриптов подключать рабочую станцию в домен? Все просто. Запускаем powershell, читем ман по командлетам Add-Computer, Remove-Computer, Rename-Computer, Restart-Computer. В Windows 7/R2 появилось более ста новых командлетов. Add-Computer подключает машину в домен, Remove-Computer выводит из домена.

Не забывайте что, powershell надо запустить с адмнистративными привиллегиями. Иначе Add-Computer не отработает. Ну и помните про DNS, посредством которого ищуться контроллеры вашего домена. Основная проблема --- указание доменной учетки имеющей право подключения компьютера в домен. В командлете можно использовать параметр –credential для указания имени пользователя. Пароль, как в netdom join, указать нельзя.

02

Пароль спросили в отдельном окне. Для скриптов не годится.  Только для интерактивной работы.

03

В остальном все нормально. Напомнили о перезагрузке.

04

Для перезагрузки наряду с shutdown –r можно использовать Restart-Computer.

05

Попробуем разобраться с указанием доменной учетки. То есть с параметром –credential. В этом параметре вместо указания строки с именем пользователя можно использовать объект класса Management.Automation.PSCredential. Вот так вот. Не очень коротко. И как создать этот объект? Можно так:

06

Командлет get-credential возвращает нужный нам объект, спросив интерактивно логин и пароль. Пока не очень хорошо. Скрипт будет висет и ждать кого-то.

07

Смотрим, что в переменной $cred

08

Теперь в параметре –credential передаем не строку, а объект.

09

Можно не использовать Get-Credential,  а создать объект самостоятельно:

10

Скрипт все сделает автоматом. Но пароль у нас открытом текстом.  Как сделать тоже самое, но не держать пароль в скрипте? Можно и это! Но это другая история… Точнее другие истории, есть несколько вариантов…