Автоматизируем создание учетных записей с помощью PowerShell. Что вам нужно для начала

2 июля 2012 в 23:09

Как быстро «забросить» 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 Создаем файл выгрузки и помещаем в него список администраторов.