Как быстро «забросить» 100500 новых юзеров в Active Directory (поднятую на MS Windows Server 2003) или Скрипт для добавления учетных записей пользователей в Active Directory

в 19:09, , рубрики: 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 «wWWHomePage», «www.test.com»

' еще немного примеров:
'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:
Надеюсь приведенная информация окажется для кого-либо весьма полезной и нужной.

Автор: sirinbird

* - обязательные к заполнению поля