Как быстро «забросить» 100500 новых юзеров в Active Directory (поднятую на MS Windows Server 2003) или Скрипт для добавления учетных записей пользователей в Active Directory
- Системное программирование
Так уж случилось, что я выбрал профессию системного администратора. И занимаюсь этим порою неблагодарным делом уже без малого около 6 лет.
Однажды, пару лет назад, передо мною встал вопрос, позже переросший в задачу, заключающийся в том, как же относительно быстро завести новые учётные записи пользователей в AD под MS Windows Server 2003?
Я думаю что всем известен способ добавления пользователя в домен, так сказать, «ручками». То есть, для добавления новых учётных записей пользователей AD приходится делать примерно следующие вещи: открыть оснастку «Пользователи и компьютеры» вышеназванной ОС, открыть соответствующую OU (Organization Unite), инициировать любым из известных способов создание пользователя, и затем в открывшемся окне создавать пользователей одного за другим. Согласитесь, это достаточно долго и муторно, особенно если необходимых учётных записей пользователей не 10, а скажем - 300, 500 и более. Особенно это станет рутинным делом тогда, когда нужно будет заполнить не только поля «логин» и «пароль», но и, расположенные во всевозможных вкладках, поля «Фамилия», «Имя Отчество», «Должность», «Отдел», «Организация» и т.д. Конечно, Вы скажете что методы «копипасты» и «слепого набора» еще никто не отменял, но вы попробуйте, и ощутите на каком по счету пользователе вы устанете, а если не устанете, то посчитайте потом количество совершенных ошибок при забивке данных.
В общем, поняв что нужно что-то делать с этим и так как время у меня было ограничено, я обратился к интернет ресурсам с целью поиска скрипта, который должен был существовать и решить эту проблему, как подсказывало мое чутье. Увы, я практически разочаровался в том, что увидел. В интернете было полно всевозможных скриптов для автоматизации различных задач в среде AD, но то, что мне было нужно - отсутствовало напрочь. Пришлось обратиться к англоязычным ресурсам, на одном из которых (увы, сайт-ссылку на момент написания статьи я уже утерял, есть мысли где искать, и если найду, то опубликую) был некий скрипт-«рыба» на VBS в очень «сыром» виде, что выяснилось при попытке его применить на тестовой системе ни к чему не приведшей - он просто, априори, не работал, ввиду наличия в нем множества недоработок и банальных ошибок, как выяснилось мною позже. Пришлось исправлять, дописывать код и стать, вдобавок ко всему, немного программистом на языке VBS:)
За сим, позвольте представить на суд уважаемой публики скрипт для добавления учетных записей пользователей в AD в предварительно созданные OU (1-го уровня). Если возникнет вопрос почему и OU не создаются автоматически, то отвечу заранее, что не нашел как это осуществить, да и контроль так жестче за производимыми изменениями в AD - все же приходится не в песочнице играться, а вносить ощутимые изменения в мощную и функционирующую в реальном времени систему, так называемую «Active Directory».
Важное замечание!
Заранее нужно создать файл, содержащий через разделитель ";" необходимые параметры:
Логин; Пароль; Имя Отчество; Фамилия; Должность; Отдел; Организация;
Обязательно наличие замыкающего разделителя ";" в каждой строке, например:
sirin-bird1; пароль1; Имя Отчество1; Фамилия1; Должность1; Отдел1; Организация1;
sirin-bird2; пароль2; Имя Отчество2; Фамилия2; Должность2; Отдел2; Организация2;
sirin-bird4; пароль3; Имя2 Отчество3; Фамилия3; Должность3; Отдел3; Организация3;
sirin-bird3; пароль4; Имя Отчество4; Фамилия4; Должность4; Отдел4; Организация4;
sirin-bird5; пароль5; Имя2 Отчество5; Фамилия5; Должность5; Отдел5; Организация5;
… … … … … … …
Создание такого файла можно поручить и неквалифицированному персоналу, умеющему обращаться с элементарным текстовым редактором. А потом всего лишь проверить правильность набора текста и расстановки разделителей, как и поступил Ваш покорный слуга.
Еще одно важное замечание!
Параметр «Организация» является OU для соответствующего пользователя и не создается этим скриптом, поэтому чтобы все сработало - предварительно создайте соответствующие OU в корне домена (возле папки OU «Users»). Это объясняется тем, что у меня в домене было несколько организаций-клиентов со своими пользователями-сотрудниками, отсюда и такое разделение.
Итак, сам скрипт:
Set objArgs = WScript.Arguments
if objArgs.Count = 0 then
WScript.Echo «Добавляет пользователей в домен.»
WScript.Echo «add_to_ad.vbs [имя файла]»
WScript.Echo " [имя файла] - файл со списком пользователей"
WScript.Echo " формат файла: Логин; Пароль; Имя-Отчество; Фамилия; Должность; Отдел; Организация;"
WScript.Quit
end if
path = objArgs(0)
Set fso = CreateObject(«Scripting.FileSystemObject»)
Set objFile = fso.OpenTextFile(path, 1)
Do Until objFile.AtEndOfStream
str = objFile.ReadLine
for i = 1 to Len(str) step 1
strCh = Mid (str, i, 1)
if strCh = ";" then
select case Z
case 0
UserName = strRez " *** Логин
case 1
UserPassword = strRez " *** Пароль
case 2
FirstName = strRez " *** Имя-Отчество
case 3
LastName = strRez " *** Фамилия
case 4
Title = strRez " *** Должность
case 5
Department = strRez " *** Отдел
case 6
Company = strRez " *** Организация
"case 7
"Manager = strRez" *** Руководитель
"case 8
"OfficeRoom = strRez " *** Комната
end select
strRez = ""
strCh = ""
Z = Z + 1
else
strRez = strRez + strCh
end if
next
strRez = ""
strCh = ""
Z = 0
Set objRoot = GetObject(«LDAP://RootDSE»)
Set objADSystemInfo = CreateObject(«ADSystemInfo»)
DomainDNSName = objADSystemInfo.DomainDNSName
DomainDN = objRoot.Get(«DefaultNamingContext»)
ContainerDN = «ou=» & Company & "," & DomainDN
PName = UserName & "@" & DomainDNSName ""@snb.local"
"!!! ВАЖНО!!!***Указываем ЗАРАНЕЕ СОЗДАННУЮ OU в которую кидаются новые пользователи *******
Set objOU = GetObject(«LDAP://» & ContainerDN)
"*************************** Создаем учетку пользователя домена ***********************
Set objUser = objOU.Create(«User», «cn=» + UserName)
" **** Login *****
objUser.Put «sAMAccountName», UserName
objUser.SetInfo
" ****** пароль *******
Set objUser = GetObject («LDAP://cn=» + UserName + "," + ContainerDN)
objUser.SetPassword UserPassword
" ******* UPN **********
objUser.Put «userPrincipalName», pName
"****** выключение аккаунта *******
objUser.AccountDisabled = TRUE
" ******** Имя *********
objUser.Put «givenName», FirstName
" ***** Фамилия *********
objUser.Put «sn», LastName
" ***** Выводимое имя ******
objUser.Put «displayName», LastName & " " & FirstName
" Инициалы
objUser.Put «initials», left(FirstName,1) & "." "& left(LastName,1)
" ***** Должность ******
objUser.Put «title», Title
" ***** Отдел ******
objUser.Put «department», Department
" Организация
objUser.Put «Company», Company
" Руководитель
"objUser.Put«manager», Manager
" комната
"objUser.Put «physicalDeliveryOfficeName», OfficeRoom
" ***** Уст. Требовать смену пароля при следующем входе в систему ***
objUser.Put «pwdLastSet», CLng(0)
ObjUser.SetInfo
" WScript.Echo «Пользователь - » + UserName + " добавлен в AD"
Loop
WScript.Echo «Пользователи добавлены в AD»
objFile.Close
дополнительный код для вставки в скрипт:
" Домашний каталог
"objUser.Put «HomeDirectory», strHomeDirPath
" почтовый ящик
"objUser.Put «mailNickname», strName
" еще немного примеров:
"ObjUser.Put «Description», «Year 2»
"objUser.Put «physicalDeliveryOfficeName», sOfficeName
"objUser.Put «ProfilePath», sScPath
"sHDrive objUser.Put «HomeDrive», «Z»
"objUser.Put «TerminalServicesProfilePath», sTermProf
"objUser.Put «TerminalServicesHomeDirectory», sTermHDir
Код из текстового редактора сохранить нужно с расширением.vbs
Запуск скрипта осуществляется с передачей параметров из файла.
Например: script.vbs users.txt
, где
script.vbs - сам скрипт
users.txt - файл с входными данными.
Выполнение скрипта занимает секунды с мгновенным результатом на выходе.
Как видно из кода, если раскомментить еще пару строк и внести дополнения в файл с входными параметрами, то можно «на автомате» внести еще и Руководителя и Номер комнаты. Скрипт можно развивать неограниченно. Например, добавить возможность внесения таким же образом такого поля как «Телефон».
В качестве текстового редактора под Windows могу посоветовать свободный для использования и весьма функциональный Notepad++.
Одна из полезных ссылок, где есть скрипты на VBS.
В самом простом варианте создание новой учетной записи пользователя занимает примерно пару минут. Открываем оснастку «Active Directory – Users and Computers», заходим в нужное подразделение (OU), в меню выбираем Создать - Пользователь, вводим имя пользователя и пароль. Все, учетка готова, можно работать.
А теперь представьте, что таким образом вам надо создать не одну, а скажем 50 учетных записей, и делать это регулярно.
Поскольку наврядли кому-то нравится проводить время, тупо набирая учетные данные пользователей, то делаем простой вывод - процесс заведения пользователей надо автоматизировать
. И поможет нам в этом PowerShell.
Итак, представим, что нам нужно срочно создать 50 однотипных учетных записей. Пишем вот такой скрипт:
$username=″student″
$count=1..50
foreach ($i in $count)
{ New-AdUser -Name $username$i -Path $org -passThru }
Запускаем скрипт, и в подразделении Students создается 50 пользователей с именами student1-student50. По умолчанию учетки создаются отключенными, и пользователи все равно будут вынуждены к вам обращаться для их активации. Попробуем этого избежать:
$username=″student″
$count=1..50
foreach ($i in $count)
-AccountPassword (ConvertTo-SecureString «p@$$w0rd» -AsPlainText -force) -passThru }
Здесь создаем учетные записи уже активными и задаем p@$$w0rd как пароль по умолчанию, а также указываем сменить его при первом входе в систему. Чтобы не передавать пароль в открытом виде, используем командлет ConvertTo-SecureString , который переводит текстовую строку в защищенный формат
Теперь сделаем наш скрипт чуть более гибким. Используя командлет Read-Host заставим наш скрипт запрашивать имя и количество пользователей:
$org=″OU=Students,DC=contoso,DC=com″
$count=1..$number
foreach ($i in $count)
{ New-AdUser -Name $username$i -Path $org
Учетные записи созданы, пользователи могут заходить в систему и работать. Теперь их надо настроить - добавить в группы безопасности, прописать домашний каталог, сценарии входа и т.п. Сделать это можно с помощью шаблона. Проще говоря, создаем шаблонную учетную запись, полностью настраиваем ее, а затем делаем с нее нужное количество копий с помощью параметра -Instance :
$template = Get-AdUser -Identity ″student″
$org=″OU=Students,DC=contoso,DC=com″
$username=Read-Host ″Enter name″
$number=Read-Host ″Enter number″
$count=1..$number
foreach ($i in $count)
{ New-AdUser -Name $username$i -UserPrincipalName $username$i -Path $org -Instance `
$template
-Enabled $True -ChangePasswordAtLogon $true `
-AccountPassword (ConvertTo-SecureString ″p@$$w0rd″ -AsPlainText -force) -passThru }
Еще один способ автоматизировать создание учетных записей - импортировать их из CSV-файла. Этот способ подойдет в том случае, если вам предоставили список пользователей, и им надо завести учетные записи в соответствии с этим списком. Как правило, подобные списки создаются в Excel в виде таблицы со столбцами Имя, Должность, Отдел и т.п., примерно такого вида:
Наша задача - сохранить его в формате CSV и затем указать в скрипте с помощью командлета Import-CSV. Если ваш CSV-файл содержит все необходимые столбцы, то New-ADUser автоматически свяжет их с правильными атрибутами пользователя:
$csv = Import-CSV -Path ″C:\scripts\users.csv″
$csv | New-AdUser -Path $org
-Enabled $True -ChangePasswordAtLogon $true `
-AccountPassword (ConvertTo-SecureString ″p@$$w0rd″ -AsPlainText -force) -passThru
Таким образом можно импортировать сотни новых пользователей за несколько секунд, но есть в этом методе и подводные камни:
- Названия столбцов должны полностью совпадать с названиями атрибутов пользователя, например Name (Имя), Organization (Организация), Title (должность), иначе ничего не получиться. Полный список атрибутов можно посмотреть .
- В таблице обязательно нужно указать SamAccountName, в противном случае будет выдана ошибка о том, что учетная запись уже существует.
- Если атрибуты задаватьть в русской раскладке, как в нашем примере, то могут возникнуть проблемы с кодировкой. В решении этой проблемы мне помогло извлечение содержимго CSV-файла с помощью командлета Get-Content и сохранение его в другой CSV-файл: Get-Content users.csv >> users1.csv. После этого все русскоязычные атрибуты стали отображаться нормально.
И еще один немаловажный момент: для запуска командлета New-ADUser необходимо предварительно импортировать модуль Active Directory для PowerShell. Делается это командой Import-Module ActiveDirectory, можно просто вставить эту строку в скрипт. Исключение составляет случай, когда вы запускаете скрипт из специальной оснастки «Модуль Active Directory для Windows PowerShell».
Автоматизируем создание учетных записей с помощью PowerShell
В самом простом варианте создание новой учетной записи пользователя занимает примерно пару минут. Открываем оснастку «Active Directory – Users and Computers», заходим в нужное подразделение (OU), в меню выбираем Создать — Пользователь, вводим имя пользователя и пароль. Все, учетка готова, можно работать.
А теперь представьте, что таким образом вам надо создать не одну, а скажем 50 учетных записей, и делать это регулярно.
Поскольку наврядли кому-то нравится проводить время, тупо набирая учетные данные пользователей, то делаем простой вывод — процесс заведения пользователей надо автоматизировать . И поможет нам в этом PowerShell.
Итак, представим, что нам нужно срочно создать 50 однотипных учетных записей. Пишем вот такой скрипт:
$username=″student″
$count=1..50
foreach ($i in $count)
{ New-AdUser -Name $username$i -Path $org -passThru }
Запускаем скрипт, и в подразделении Students создается 50 пользователей с именами student1-student50. По умолчанию учетки создаются отключенными, и пользователи все равно будут вынуждены к вам обращаться для их активации. Попробуем этого избежать:
$org=″OU=Students,DC=contoso,DC=com″
$username=″student″
$count=1..50
foreach ($i in $count)
-AccountPassword (ConvertTo-SecureString «p@$$w0rd» -AsPlainText -force) -passThru }
Здесь создаем учетные записи уже активными и задаем p@$$w0rd как пароль по умолчанию, а также указываем сменить его при первом входе в систему. Чтобы не передавать пароль в открытом виде, используем командлет ConvertTo-SecureString , который переводит текстовую строку в защищенный формат
Теперь сделаем наш скрипт чуть более гибким. Используя командлет Read-Host заставим наш скрипт запрашивать имя и количество пользователей:
$org=″OU=Students,DC=contoso,DC=com″
$count=1..$number
foreach ($i in $count)
{ New-AdUser -Name $username$i -Path $org -Enabled $True -ChangePasswordAtLogon $true `
Учетные записи созданы, пользователи могут заходить в систему и работать. Теперь их надо настроить — добавить в группы безопасности, прописать домашний каталог, сценарии входа и т.п. Сделать это можно с помощью шаблона. Проще говоря, создаем шаблонную учетную запись, полностью настраиваем ее, а затем делаем с нее нужное количество копий с помощью параметра -Instance :
$template = Get-AdUser -Identity ″student″
$username=Read-Host ″Enter name″
$number=Read-Host ″Enter number″
$count=1..$number
foreach ($i in $count)
{ New-AdUser -Name $username$i -UserPrincipalName $username$i -Path $org -Instance `
$template -Enabled $True -ChangePasswordAtLogon $true `
-AccountPassword (ConvertTo-SecureString ″p@$$w0rd″ -AsPlainText -force) -passThru }
Еще один способ автоматизировать создание учетных записей — импортировать их из CSV-файла. Этот способ подойдет в том случае, если вам предоставили список пользователей, и им надо завести учетные записи в соответствии с этим списком. Как правило, подобные списки создаются в Excel в виде таблицы со столбцами Имя, Должность, Отдел и т.п., примерно такого вида:
Наша задача — сохранить его в формате CSV и затем указать в скрипте с помощью командлета Import-CSV. Если ваш CSV-файл содержит все необходимые столбцы, то New-ADUser автоматически свяжет их с правильными атрибутами пользователя:
$csv = Import-CSV -Path ″C:\scripts\users.csv″
$csv | New-AdUser -Path $org -Enabled $True -ChangePasswordAtLogon $true `
-AccountPassword (ConvertTo-SecureString ″p@$$w0rd″ -AsPlainText -force) -passThru
Таким образом можно импортировать сотни новых пользователей за несколько секунд, но есть в этом методе и подводные камни:
- Названия столбцов должны полностью совпадать с названиями атрибутов пользователя, например Name (Имя), Organization (Организация), Title (должность), иначе ничего не получиться. Полный список атрибутов можно посмотреть .
- В таблице обязательно нужно указать SamAccountName, в противном случае будет выдана ошибка о том, что учетная запись уже существует.
- Если атрибуты задаватьть в русской раскладке, как в нашем примере, то могут возникнуть проблемы с кодировкой. В решении этой проблемы мне помогло извлечение содержимго CSV-файла с помощью командлета Get-Content и сохранение его в другой CSV-файл: Get-Content users.csv >> users1.csv. После этого все русскоязычные атрибуты стали отображаться нормально.
В заключение несколько важных моментов:
Для запуска командлета New-ADUser необходимо предварительно импортировать модуль Active Directory для PowerShell. Делается это командой Import-Module ActiveDirectory, можно просто вставить эту строку в скрипт. Исключение составляет случай, когда вы запускаете скрипт из специальной оснастки «Модуль Active Directory для Windows PowerShell».
Модуль ActiveDirectory доступен на серверах под управлением Windows Server 2008R2/2012, а также на рабочих станциях Windows 7/8 c установленным пакетом администрирования RSAT.
Для работы модуля ActiveDirectory необходима веб-служба Active Directory (ADWS), предоставляющая веб-интерфейс для доступа к службе каталогов. По умолчанию эта служба устанавливается автоматически при добавлении ролей сервера AD DS и AD LDS на серверах под управлением Windows Server 2008R2 и выше. Для Windows Server 2003\2008 эту службу можно установить отдельно, скачав
Скрипт проходит по всем серверам из Active Directory , смотрит состав локальной группы Администраторы и сохраняет список в файл. Будет полезным для поддержания безопасности в среде с большим количеством серверов.
Пример скрипта
Описание скрипта
1 - 4 | Определяем переменные для дальнейшего использования. |
1 | Путь к файлу, в который будет сохранен результат. |
2 | Контейнер в Active Directory, в котором находятся учетные записи компьютеров серверов. |
3 | Создаем и хэш-массив. В Powershell необходимо делать до начала использования. |
4 | Создаем пустую переменную. Ее будем наполнять списком пользователей, которые входят в группу Администраторы. |
6 - 21 | Функция для поиска пользователей в группе Администраторы. |
7 | Функции будет передаваться имя сервера. Его будем сохранять в переменную $strcomputer |
8 - 12 | Создаем исключение для выполняемой операции. Если запрос не будет выполнен корректно, на экран будет выведено название сервера. |
9 | Обращаемся в WMI объекту win32_groupuser со списком групп Windows. |
11 | Если обращение к WMI выполнено с ошибкой (чаще всего из-за недоступности RPC), на экран будет выведено название сервера, к которому в данный момент идет обращение. |
13 | Условие, при котором проверяется существование переменной со списком групп, полученной в строчке 9 |
14 | Создаем переменную, в которую войдет список пользователей группы Администраторы или Administrators (на серверах с английской версией). |
15 - 18 | Вытаскиваем пользователей из административной группы и удаляем лишнюю служебную информацию. |
19 | Функция возвращает список пользователей. |
23 | Создаем переменную и помещаем в нее список компьютеров, на которых будем искать администраторов. В данном примере, это компьютеры из Active Directory. |
24 - 29 | Извлекаем по одному сервера, которые были получены в строчке 23. |
25 | Запускаем функцию и передаем ей имя сервера. Результат работы записываем в переменную $UserList |
26 | Условие проверяет наличие значения переменной $UserList |
27 | Если список пользователей есть, добавляем его в массив $AdminList |
31 - 35 | Перебираем массив $AdminList и пополняем список серверов и администраторов для них. |
32 | Создаем переменную, в которую запишем имя сервера. |
33 | Создаем переменную, в которую поместим список пользователей для сервера из строчки 32. |
34 | В переменной $ToCSV находятся строчки для будущего файла. Каждая строчка — имя сервера и перечень администраторов, разделенные точкой с запятой. |
37 - 39 | Проверяем наличие в системе файла, в который хотим поместить результат работы скрипта. Если файл существует, удаляем его. |
41 | Создаем файл выгрузки и помещаем в него список администраторов. |