Самый простой способ создать нового пользователя в домене 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 файле (чаще всего проблемы с кодировкой, специсимволами и пробелами в именах).
Помогите пожалуйста разобраться….выходит такая же ошибка
Import-Module activedirectory
Import-Csv -path «C:\ad.csv» -Delimiter «;»| ForEach-Object {
$upn = $_.SamAccountName + “@house.local”
Get-Content C:\ad.csv | ConvertFrom-Csv -Delimiter «;»
$uname = $_.LastName + » » + $_.FirstName + » » + $_.DisplayName
#переводим в транслит фамилию, имя и отчество
$transLastName=Translit($_.LastName)
$transFirstName=Translit($_.FirstName)
$transDisplayName=Translit($_.DisplayName)
$transuname = $transLastName + » » + $transFirstName + » » + $transDisplayName
New-ADUser -Name $transuname `
-DisplayName $uname `
-GivenName $_.FirstName `
-Surname $_.LastName `
-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
}
Подскажите, я создал файл с русскими символами но когда загружаю получаю кодировку по типу 30 ���� можно как то указать кодировку для аплета?
Скорее всего вам просто нужно переконвертировать файл в кодировку UTF8
Добрый день!
Случайно не знаете, каким образом можно добавить что-либо в поле «Заметки», которая находится во вкладке «Телефоны»?
Нужно ввести туда инфу вида 01.01.1993, битрикс из этого поля вытягивает дату рождения сотрудника.
Вроде бы все поля нужные подобрал для себя, но это не могу найти…
Решил так.
Set-ADuser -identity ryboff -Add @{‘info’=$birthday}