angle-left

Оптимизация процесса перехода из workgroup в AD

Во многих предприятиях штат Windows машин живет в workgroup (изредка, в лушем случае, разбросаны по Workgroup' ам). В уже работающей инфраструктуре не исключен вариант внедрения домена и, соответственно возникающий процесс перевода клиентских машин из Workgroup в ActiveDirectory.

Добавление пользователя и компьютера в домен дело не сложное, но при большом штате пользователей и машин реализация «переселения» трудоёмкая: требуется добавить всех пользователей и все машины в домен, а также разбросать их по Organization Unit.

Можно сократить много времени и сил автоматизируя этот процесс.

Для начала необходимо определить этапы перехода из рабочей группы в домен :

  1. Сбор информации о машинах и о пользователях.
  2. Создание учетных записей пользователей и машин.
  3. Добавление машин в домен.

Многое можно сделать вручную, например нажав правую кнопку мыши и выбрав Свойства на значке Мой компьютер... Но это не наш путь!

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

Исходя из этапов, обозначенных выше, нам необходимо 3 последовательных действия :

  1. Собрать информацию ( имена пользователей, имя компьютера) с клиентской машины
  2. Добавить в домен машину и пользователей используя собранную информацию
  3. Добавить клиентскую машину в домен

Приступая к реализации надо помнить об ExecutionPolicy, определяющая возможность выполнения скриптов на машине. Получить текущую конфигурацию можно использовав cmdlet Get-ExecutionPolicy

Значение по умолчанию Restricted, которое запрещает выполнение любых скриптов на машине, позволяя выполнять только отдельные команды.

Помимо Restricted существуют :

  • AllSigned — политика этой конфигурации позволяет выполнять только подписанные скрипты
  • RemoteSigned — требования к подписи предъявляется к скриптам полученным из интернета
  • Unrestricted — не требует подписи скриптов
  • ByPass - без блокировок и предупреждений
  • Undefined — убивает текущую политику

Содержания достаточно ясно прослеживаются из названий. Забегая вперед, скажу что на сервере исполняемый скрипт будет локален ( Set-ExecutionPolicy RemoteSigned), на клиентах будем запускать с сетевого хранилища (Set-ExecutionPolicy UnRestricted ). Если нужна большая безопасность, то можно подписать скрипты с помощью программы makecert.exe.

 

 

 

 

Изменять ExecutionPolicy необходимо с правами администратора (в противном случае будет выведено сообщение о запрете доступа Set-ExecutionPolicy : Access to the registry key 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell' is denied.

 

 

Процесс добавления машины в домен может быть различен :

  1. Ручной с помощью графического интерфейса и мышкокликанья
  2. С помощью утилиты netdom.exe
  3. С помощью командлета Add-Computer
  4. С помощью команды автономного присоединения к домену Djoin

Первый вариант нас не интересует, по очевидным причинам.

Второй вариант требует дополнительной установки RSAT, что создает дополнительные трудности.

Интерес для нас будут представлять 3 и 4 варианты.

Корневое отличие в том, что djoin утилита автономного присоединения к домену, в отличии от Add-Computer, которая требует связи с доменом. В случае отсутствия (временного или постоянного) подключения к домен контроллеру, единственным вариантом остается djoin, что не исключает возможности его использования при наличие подключения.

Djoin предполагает запуска на двух машинах : Provision ( создание машины в домене, запуск на машине в домене) и RequestODJ ( Ввод в домен машины с использованием результата запуска /provision, ODJ- Offline Domain Join). Написав в PowerShell djoin / мы можем увидеть подробный список возможностей использования, в котором обозначены опциональные параметры и необходимые.

Итак, по порядку.

Этап 1:

Первым делом необходимо собрать информацию о машинах и пользователях на клиентских машинах, и передать ее серверу.

Получить список пользователей можно несколькими способами, но мы будем использовать WMIC (по сути интерфейс командной строки для написания сценариев для управления WMI (Windows Management Instrumentation)).

Для получения информации о юзерах на машине пишем в PowerShell

WMIC UserAccount

Можно выделить определенные поля написав Get Имя_Поля

WMIC UserAccount Get Name

Но здесь все не идеально,- есть лишние пользователи (Guest, Administrator) , которых не нужно включать в доменных пользователей. Так же нам не нужны неактивированные пользователи, о чем свидетельствует флаг true в поле Disabled.

Исключить неактивные учетные записи и записи локальных администраторов и гостей можно написав

WMIC UserAccount Where «Disabled=false and Name!='Guest' and Name!='Administrator'» Get Name

Чтобы удалить заголовок воспользуемся Where { $_ -notmatch «Name» }

 И удалим пустые строки Where { $_ -notmatch «Name» -and $_ -ne «» } 

Имя компьютера можно узнать с помощью команды Hostname

В итоге получаем первый скрипт клиентской машины :

#Variables

$path_to_file = "\\DC1\djoin\fromCli\"

$hostname = HOSTNAME.EXE

WMIC.exe UserAccount Where "Disabled=false and Name!='Guest' and Name!='Administrator'" Get Name |where {$_ -notmatch "Name" -and $_ -ne ""}

>> $path_to_file$hostname

 

Этап 2:

Для начала, на контролле домена мы создаем расшаренную директорию в которую можно получить доступ с клиентских машин. В расшаренной директории создадим папки для полученных с клиентов данных(fromCli) и папку для данных с сервера(fromSer).

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

Распределения пользователей по OU зависит от конкретной инфраструктуры конкретного предприятия. Обычно, на определенных машинах workgroup работают люди с определенных отделов. В случае, если имена машин имели человеческий вид ( например logistics5, stok12, sales1… ), есть возможность раскидать по OU в зависимости от имён. В этом может помочь оператор -match возвращающий $true или $false в зависимости от результата. Простой наглядный пример :

 

Добавление пользоватей осуществляется с помощью команды New-ADUser.

Для использования команд ActiveDirectory необходимо подключить модуль ActiveDirectory для PowerShell :

Import-Module activedirectory

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

Необходимо помнить о ненулевой вероятности существования нескольких юзеров с одинаковыми именами. Начиная с PowerShell 2.0 присутствует оператор try{} catch{}. При добавлении нового пользователя с уже существующим именем, будет выведена ошибка New-ADUser : The specified account already exists. Отловив ошибку, можно изменить ему имя. Простой пример отлова ошибки :

 

 

Сам скрипт сервера :

 

Import-Module ActiveDirectory
 
#VARIABLES
$DOMAIN = "d1.tune-it.ru"
$DOMAIN_SPLIT = "DC=d1,DC=tune-it,DC=ru"
$Path_To_Data_In = "\\dc1\djoin\fromCli\"
$Path_To_Data_Out = "\\dc1\djoin\fromSer\"
 
$OU_USER = "testou"
$OU_COMPUTER = "testou"
 
$OU_Warning = "WarningUsers" # OU to add user if this name already exist in domain
 
$machine_name #variable for add machine to domain and save information if user name already exist
 
#FUNCTIONS
function join()
{
djoin /PROVISION /DOMAIN d1.tune-it.ru /machine $machine_name /machineou "OU=testou,DC=D1,DC=tune-it,dc=ru" /savefile $Path_To_Data_Out
}
 
function useradd($user_name)
{
try
{
echo $user_name$machine_name 
New-ADUser -Name $user_name -AccountPassword (ConvertTo-SecureString -AsPlainText "Pa$$w0rd" -Force) -ChangePasswordAtLogon $true -City
"Saint-Petersbourg" -Path "OU=$OU_USER,$DOMAIN_SPLIT" -Description $machine_name
}
catch
{
$temp = $OU_USER
$OU_USER = $OU_Warning
try
{
New-ADOrganizationalUnit -Name $OU_Warning
}
catch
{
echo "user with name $user_name already exist. Add to OU $OU_Warning"
}
 
useradd("$user_name$machine_name")
 
$OU_USER = $temp
}
}
 
 
#MAIN
 
foreach ($machine in (Get-ChildItem $Path_To_Data_In -name))
{
$machine_name=$machine
join
foreach($user in (Get-Content $Path_To_Data_in$machine_name))
{
useradd($user)
}
}

 

По завершению пункта мы получаем файлы для добавления каждой клиентской машины в папке fromSer. С клиентской стороны второй скрипт должен использовать эти файлы, выполняя известный нам djoin.

Этап 3 :

Остается только выполнить Djoin /requestODJ с файлом предназначенным для данной машины.

Скрипт :

#Variable

$path_to_file = "\\DC1\djoin\fromSer\"

$hostname = HOSTNAME.exe

djoin /requestODJ /loadfile $path_to_file$hostname /windowspath C:\Windows /localos