Самый простой способ создать нового пользователя в домене Active Directory – воспользоваться графической mmc оснасткой ADUC (Active Directory Users and Computers). Но в том случае, если в домене нужно завести сразу несколько учетных записей, их создание в ручном режиме может стать довольно утомительной для администратора процедурой. В этой статье мы рассмотрим пример автоматизации создания учетных записей пользователей в AD с помощью командлета PowerShell New-ADUser.
Используем командлет New-ADUser для создания новой учетной записи AD
Командлет New-ADUser входит в состав модуля Active Directory для PowerShell. Для использования этого модуля, нужно установить на компьютере соответствующую ОС версию RSAT и включить компонент Active Directory Module for Windows PowerShell.
Для импорта модуля в сессию PowerShell выполните команду:
Import-Module activedirectory
Полный синтаксис командлета New-ADUser можно получить с помощью команды
Get-Command New-ADUser –Syntax
В минимальной версии для создания новой учетной записи пользователя в AD достаточно указать только его имя.New-ADUser testuser1
Как вы видите, новая учетная запись пользователя создалась в контейнере Users и является отключенной. Для использования данной учетной записи, ее нужно включить (командлет Enable-ADAccount), задать пароль (командлет Set-ADAccountPassword) и/или другие атрибуты (по необходимости).
Чтобы создать полноценную работоспособную учетную запись в определенном контейнере (OU) домена с паролем и сразу активировать ее, воспользуйтесь такой командой.
New-ADUser -Name "Test User2" -GivenName "Test" -Surname "User2" -SamAccountName "testuser2" -UserPrincipalName "testuser2@contoso.com" -Path "OU=Users,OU=Accounts,OU=SPB,DC=winitpro,DC=loc" -AccountPassword(Read-Host -AsSecureString "Input Password") -Enabled $true
Команда предложит сразу указать пароль нового пользователя (в защищенном виде)
Информацию о созданном пользователе домена можно получить с помощью командлета Get-ADUser:
Get-ADUser testuser2
Массовое создание новых пользователей в AD из CSV скриптом PowerShell
В том случае, если в Active Directory нужно создать сразу большое количество пользователей, удобнее сохранить список пользователей в формате CSV (Excel) файла, а затем запустить специальный PowerShell скрипт. В данном файле нужно заполнить все значимые для вас атрибуты пользователей.
К примеру, мой Excel файл с пользователями состоит из 9 колонок и имеет следующий формат шапки:
FirstName;LastName;Initials;SamAccountName;Phone;Department;JobTitle;Password;OU
Заполните данные пользователей и сохраните Exсel файл с в формате CSV c запятыми, в качестве разделителей. Кодировка файла должна быть обязательно UTF-8 (важно!). Кроме того, т.к. в значениях столбца OU есть запятые, нужно экранировать их, взяв в двойные кавычки.
Теперь можно импортировать данный CSV файл (new_ad_users2.csv) и создать в домене новых пользователей. Код готового PowerShell скрипта представлен ниже:
- Имя пользователя в домене мы будем заводить на английской языке, поэтому для транслитерации имен и фамилий пользователей с кириллицы в латиницу мы добавим в скрипт отдельную функцию Translit.
- Если в качестве разделителя CSV файла используется “;”, в командлет Import-Csv нужно добавить аргумент -delimiter «;»
Import-Module activedirectory
Import-Csv "C:\ps\new_ad_users2.csv" | ForEach-Object {
$upn = $_.SamAccountName + “@contoso.loc”
$uname = $_.LastName + " " + $_.FirstName + " " + $_.Initials
#переводим в транслит фамилию, имя и отчество
$transLastName=Translit($_.LastName)
$transFirstName=Translit($_.FirstName)
$transInitials=Translit($_.Initials)
$transuname = $transLastName + " " + $transFirstName + " " + $transInitials
New-ADUser -Name $transuname `
-DisplayName $uname `
-GivenName $_.FirstName `
-Surname $_.LastName `
-Initials $_.Initials `
-OfficePhone $_.Phone `
-Department $_.Department `
-Title $_.JobTitle `
-UserPrincipalName $upn `
-SamAccountName $_.samAccountName `
-Path $_.OU `
-AccountPassword (ConvertTo-SecureString $_.Password -AsPlainText -force) -Enabled $true
}
#сама функция транслитерации
function global:Translit {
param([string]$inString)
$Translit = @{
[char]'а' = "a"
[char]'А' = "A"
[char]'б' = "b"
[char]'Б' = "B"
[char]'в' = "v"
[char]'В' = "V"
[char]'г' = "g"
[char]'Г' = "G"
[char]'д' = "d"
[char]'Д' = "D"
[char]'е' = "e"
[char]'Е' = "E"
[char]'ё' = "yo"
[char]'Ё' = "Yo"
[char]'ж' = "zh"
[char]'Ж' = "Zh"
[char]'з' = "z"
[char]'З' = "Z"
[char]'и' = "i"
[char]'И' = "I"
[char]'й' = "j"
[char]'Й' = "J"
[char]'к' = "k"
[char]'К' = "K"
[char]'л' = "l"
[char]'Л' = "L"
[char]'м' = "m"
[char]'М' = "M"
[char]'н' = "n"
[char]'Н' = "N"
[char]'о' = "o"
[char]'О' = "O"
[char]'п' = "p"
[char]'П' = "P"
[char]'р' = "r"
[char]'Р' = "R"
[char]'с' = "s"
[char]'С' = "S"
[char]'т' = "t"
[char]'Т' = "T"
[char]'у' = "u"
[char]'У' = "U"
[char]'ф' = "f"
[char]'Ф' = "F"
[char]'х' = "h"
[char]'Х' = "H"
[char]'ц' = "c"
[char]'Ц' = "C"
[char]'ч' = "ch"
[char]'Ч' = "Ch"
[char]'ш' = "sh"
[char]'Ш' = "Sh"
[char]'щ' = "sch"
[char]'Щ' = "Sch"
[char]'ъ' = ""
[char]'Ъ' = ""
[char]'ы' = "y"
[char]'Ы' = "Y"
[char]'ь' = ""
[char]'Ь' = ""
[char]'э' = "e"
[char]'Э' = "E"
[char]'ю' = "yu"
[char]'Ю' = "Yu"
[char]'я' = "ya"
[char]'Я' = "Ya"
}
$outCHR=""
foreach ($CHR in $inCHR = $inString.ToCharArray())
{
if ($Translit[$CHR] -cne $Null )
{$outCHR += $Translit[$CHR]}
else
{$outCHR += $CHR}
}
Write-Output $outCHR
}
После выполнения скрипта, откройте консоль ADUC, разверните указанный контейнер и убедитесь, что в AD появились новые учетки пользователей (отследить создание учетных записей в AD можно так: Получение списка учетных записей AD, созданных за последние 24 часа.)
Создаваемые учетные записи можно сразу добавить в определенную группу AD с помощью командлета Add-AdGroupMember, для этого нужно немного модифицировать скрипт, добавив в цикле строку:
Add-AdGroupMember -Identity AllowPublicInet -Members $_.samAccountName
Или сразу установить фотографию пользователя в AD, чтобы она отображалась в Outlook и Lync:
Set-ADUser $_.samAccountName -Replace @{thumbnailPhoto=([byte[]](Get-Content "C:\ps\user1_photo.jpg" -Encoding byte))}
Спасибо за статью, очень полезная информация.
Вот только не увидел, если пользователь с такой фамилией уже существует, что скрипт сделает в этом случае?
Если учетка уже есть, скрипт возвращает ошибку. По хорошему нужно добавить пару строк, проверки существования учетной записи в AD и если такая учетка уже есть, добавлять к имени учетки индекс 2, 3, 4 (например, aaivanov2, aaivanov3 и т.д.). Так вы обеспечите уникальность учетных записей в Active Directory.
Аккаунты с индексами не совсем гуд :). Лучше добавлять к учетке первый символ имени.
По моему индексы вполне нормальное решение. У меня в домене более 10000 учеток. Тёсок очень много. В этом случае цифровые индексы у аккаунтов — единственное удобноее решение. Ну и пусть, что aaivanov10 🙂
В этом случае может возникнуть путаница). У нас правда не 10 тыс. учеток :).
Но я принцип понял).
при создании пользака есть галочка заводить почту\не заводить, как ее в скрипт втулить? какие колонки добавить для графы «описание» и графы «комната»?? спс
Расскажите, чем вы вы завожите учетки пользователям? Насколько я помню возможность сразу создать учетку и ящик была в спец консоли ADUC в Exchange 2003.
Описание — поле в AD «description», комната — roomNumber
Здравствуйте, выдает такую ошибку:
Translit : Имя «Translit» не распознано как имя командлета, функции, файла сценария или выполняемой программы. Проверьт
е правильность написания имени, а также наличие и правильность пути, после чего повторите попытку.
строка:5 знак:16
+ $transLastName=Translit($_.LastName)
+ ~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Translit:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Какая версия PowerShell и Windows? Думаю что < 4.0.
Возможно в коде нужно поднять объявление функции Translit раньше ее вызова….
К сожалению, разрабы PS не удосужились добавить параметр поля «Remote Desktop Profile Path», так что полноценно New-ADUser невозможо использовать, приходится городить порно с adsi
Да, действительно, объектная модель модуля AD POsh не поддерживает прямое редактирование атрибута terminalservicesprofilepath через new-aduser или set-aduser.
Почему так, не знаю.
Народ действительно пользуется adsi
$users = Get-ADUser -Filter {(Enabled -eq $true)} -server $DC[1] -Properties * -SearchBase "OU=Users,DC=,DC=" | Select-Object SAMAccountName,DisplayName,DistinguishedName,Mail,Homemdb,@{Name="TSP";Expression={([adsi]("LDAP://$($users.distinguishedName)")).psbase.InvokeGet("terminalservicesprofilepath")}\\")
$nullTSP = Where-Object {$_.TSP -eq $null}
foreach ($TSP in $nullTSP) {
$TSP.DistinguisedName.psbase.Invokeset("terminalservicesprofilepath","\\
$TSP.DistinguishedName.setinfo()
}
Не заводится скрипт..
New-ADUser : Имя объекта имеет недопустимый синтаксис
строка:11 знак:1
+ New-ADUser -Name $transuname `
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (CN=Ponomarev K...Staff/OU=DTRII"
:String) [New-ADUser], ADException
+ FullyQualifiedErrorId : ActiveDirectoryServer:8335,Microsoft.ActiveDirec
tory.Management.Commands.NewADUser
Что-то не так в синтаксисе вашего скрипта или в csv файле (чаще всего проблемы с кодировкой, специсимволами и пробелами в именах).
Подскажите, я создал файл с русскими символами но когда загружаю получаю кодировку по типу 30 ���� можно как то указать кодировку для аплета?
Скорее всего вам просто нужно переконвертировать файл в кодировку UTF8