Всем привет. Сегодня я покажу вам как можно автоматизировать добавление пользователей в AcriveDirecotory при помощи скрипта. Данные о пользователе будем брать из CSV файла.
Скачать архив со скриптом можно здесь. В этот же архив я положил установщик .net 4.5 и powershell 5.1 для 2008R2.
Пример моего файла CSV:
ФИО;должность;отдел;номер комнаты;номер телефона;электронная почта;идентификатор
Иванов Иван Иванович;директор;76;345;123;ivanov@mail.ru;00000001
Петрова Ирина Петровна;лаборант;77;367;124;petrova@mail.ru;00000002
Васильев Василий Васильевич;управляющий;78;389;125;vasiliev@mail.ru;00000003
Александров Александ Александрович;зам. Директора;79;411;126;aleksandrov@mail.ru;00000004
Сергеев Сергеей Сергеевич;лаборант;80;433;127;sergeev@mail.ru;00000005
Соответственно все поля мы будем заносить в AD. ФИО будет разбиваться на фамилию, имя и отчество. Имя пользователя у нас будет формироваться из первой буквы имени и фамилии, переведенных в транслит.
В случае, если имя пользователя уже существует — мы берем 2 буквы из имени и так далее.
Обратите внимание на поле идентификатор. Он как раз нужен для того, чтобы определить добавлять нового пользователя или редактировать существующего, если появляется однофамилец.
В случае появления записи с существующим идентификатором — данные о пользователе обновляются.
Так же при запуске нашего скрипта с ключом -del — пользователи, которые присутствуют в CSV файле будут удалены из AD.
Я тестировал работу скрипта на Windows 2008R2 с установленным powershell 5.1, т. е. он должен так же работать и на 2012 и на 2016 виндах.
Для того что бы установить PowerShell 5.1 на 2008R2 — на ней должен быть установлен как минимум первый service pack. А также .net 4.5. (установщик .net и powershell я добавил в архив со скриптом. Скачать SP1 для Windows 2008R2 можно по ссылке).
Для того что бы powershell дал запусткать скрипт нужно выполнить команду от имени администратора:
Set-ExecutionPolicy bypass
Обратите внимание на переменные в начале скрипта, в них задается путь и имя файла csv, пароль, который будет назначаться пользователям, а так же название домена.
Текст скрипта:
#Написано для сайта https://www.mytechnote.ru
#Для работы скрипта нужно обновить powershell, для этого
#сперва нужно установить sp1 (https://www.microsoft.com/ru-ru/download/details.aspx?id=5842)
#на сервер, если еще не установлен.
#Далее .net 4.5 (dotNetFX45_Full_setup)
#После чего нужно обновить powershell до версии 5.1 (в powershell запущенном от имени администратора выполняеем Set-ExecutionPolicy bypass, и запускаем скрипт установки из архива powershell51.zip)
#при запуске скрипта poweshell длжен быть запущен от имени администратора
#при запуске без ключа, будут добаляться и обновляться пользователи
#при запуске с ключом -del будут удалться пользователи
####################################################################################################################################################################################################
import-module activedirectory
#переменные:
#путь до CSV файла
$pathToCSV=".\f_151592b94af8a58e.csv"
#пароль который будет задан новым пользователям
$defpass="As12345^"
#указываем наш домен
$domain="@test.loc"
#функция транслитерации
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]'Ё' = "eo"
[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]'ц' = "ts"
[char]'Ц' = "ts"
[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}
#импортируем csv файл в переменную
$csv=import-Csv $pathToCSV -Encoding OEM -Delimiter ';'
#разбираем переменную
foreach ($user in $csv)
{
#заносим в переменные значения из csv файла
$fio="$($user.ФИО)"
$surname=$fio.split(' ')[0]
$name=$fio.split(' ')[1]
$sname=$fio.split(' ')[2]
$dolzhnost="$($user.должность)"
$depart="$($user.отдел)"
$room="$($user.'номер комнаты')"
$phone="$($user.'номер телефона')"
$mail="$($user.'электронная почта')"
$id=$($user.'идентификатор')
#переводим в транслит имя и фамилию
$transName=Translit($name)
$transSurname=Translit($surname)
#отчищаем первые буквы имени
$shortName=""
#добаляем буквы к переменной shortname (переменная для создания логина)
for ($i=1; $i -lt $transName.length; $i++)
{
#в зависимости от числа проходов цикла, добавляем i букв
$shortName=$transName.substring(0,$i)
#добавляем буквы имени к фамилии
$userName=$shortName+$transSurname
try
{
#проеряем, есть ли пользователь
$user=Get-ADUser "$userName"
}
catch
{
$user=$false
}
#если пользователь существует
if ($user)
{
#получаем id из AD
$IDinAD=Get-ADUser $userName -Properties comment | select comment | ft -HideTableHeaders | out-string
#если номер страхового из AD совпал с номером из csv
if ($IDinAD -match $id)
{
#если запутили скрипт без аргументов
if ($args[0] -eq "" -or !$args[0] )
{
#обновляем данные пользователя
Set-ADUser -Identity "$userName" -Surname "$surname" -DisplayName "$surname $name $sname" `
-OfficePhone "$phone" -EmailAddress "$mail" -Department "$depart" -Title "$dolzhnost" `
-UserPrincipalName "$userName$domain" -GivenName "$name" -Office "$room" -enabled $true -SamAccountName "$userName"
#прерываем цикл
break
}
#если запустили скрипт с аргументом -del
if ($args[0] -eq "-del")
{
#удаляем пользователя
Remove-ADUser -Identity $userName -Confirm:$false
}
}
#если id не совпадают, и найдено имя пользователя, идем к следующему шагу цикла
else
{
}
}
#если пользователя не существует
else
{
#и запустили без аргументов
if ($args[0] -eq "" -or !$args[0])
{
try
{
$users=get-aduser -Filter "*" -Properties comment | select comment, name
}
catch
{
$users=$false
}
if ($users)
{
foreach ($user in $users)
{
#если у какого то пользователя есть id из csv, обновляем его
if ($user.comment -match $id)
{
$uname=$user.name.toString()
$distName=Get-ADObject -Filter 'name -eq $uname'
Set-ADUser -Identity "$uname" -Surname "$surname" -DisplayName "$surname $name $sname" `
-OfficePhone "$phone" -EmailAddress "$mail" -Department "$depart" -Title "$dolzhnost" `
-UserPrincipalName "$userName$domain" -GivenName "$name" -Office "$room" -enabled $true `
-SamAccountName "$userName"
Rename-ADObject $distName.DistinguishedName -NewName $userName
}
}
}
try
{
#добавляем пользователя и прерываем цикл
New-ADUser -Name "$userName" -Surname "$surname" -DisplayName "$surname $name $sname" `
-OfficePhone "$phone" -EmailAddress "$mail" -Department "$depart" -Title "$dolzhnost" `
-UserPrincipalName "$userName$domain" -GivenName "$name" -Office "$room" -OtherAttributes @{comment="$id"} `
-AccountPassword (ConvertTo-SecureString -AsPlainText "$defpass" -force) -enabled $true `
-ChangePasswordAtLogon $true -SamAccountName "$userName" -erroraction 'silentlycontinue'
}
catch
{
}
break
}
}
}
}

Александр, спасибо большое за
Александр, спасибо большое за скрипт, отрабатывает на w2016! Но возник вопрос: Если некоторые поля в файле csv не заполнены, например Отдел или телефон или еще какое-то, то скрипт не отрабатывает. Как его дополнить, чтобы он игнорировал не заполненные поля?
Cпасибо.
Думаю, можно добавить
Думаю, можно добавить проверки на существования полей, и если то или иное поле окажется $null — давать ему какое-нибудь значение.
Например за место
$dolzhnost="$($user.должность)"можно сделатьif ($user.должность -ne $null){
$dolsznost=»$($user.должность)»
}
else
{
$dolszhnost=’что-нибдь, ну или пробел’
}
Извините, а где именно
Извините, а где именно прописать этот код?
Здравствуйте, подскажите
Судя по всему — не обновлен
Судя по всему — не обновлен wmf (powershell).
Но я сделал все по инструкции
Но я сделал все по инструкции, сначала установил нетфрейм, потом повершел ,сервер перезагрузился , установил сам компоненты, снова перезагрузился, но версия не изменился стоит V2, как быть? никакой ощибки при установке не было
Все спасибо, получилось,
Все спасибо, получилось, действительно проблема была в версии ПШ. он не устанавливался потому что Фреймворк не обновился, скачал и установил с https://download.microsoft.com/download/1/6/7/167F0D79-9317-48AE-AEDB-17120579F8E2/NDP451-KB2858728-x86-x64-AllOS-ENU.exe
и все заработал.
СПАСИБО АВТОРУ!!!!
Еще один вопрос, а можноли
Еще один вопрос, а можноли добавить в этот же скрипт команду с паролями?
что вы имеете ввиду под
что вы имеете ввиду под командой с паролями?
с паролями я уже решил с
с паролями я уже решил с параметрами
-AccountPassword (ConvertTo-SecureString -AsPlainText "$room" -force) -enabled $true
вот беда в другом, при обновлении юзеров у меня выскакивает ошибка :
Set-ADUser : replace At C:ADuser5.ps1:161 char:7 + … Set-ADUser -Identity "$userName" -Surname "$surname" -Dis … + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (ShmidtSI:ADUser) [Set-ADUser], ADInvalidOperationException + FullyQualifiedErrorId : replace,Microsoft.ActiveDirectory.Management.Commands.SetADUser
помагите пожалуйста
и при добавление в код
и при добавление в код параметр -Manager , все пользователи удаляются или же не добавляются
Здравствуйте, При запуске
Причина выявлена, проблема в
Причина выявлена, проблема в том что все поля не должны быть пустыми что и связан с вопросом максима, спасибо всем
Здравствуйте, а как добавить
Здравствуйте, а как добавить точку после первой буквы имени в логине?
Здравствуйте, подскажите
Здравствуйте, подскажите пожалуйста, как поставить точку после первой буквы имени в логине?
чтобы ставить точку после имя
чтобы ставить точку после имя нужно изменить здесь
$userName=$shortName+$transSurname на$userName=$shortName+'.'+$transSurnameто тогда получется из Иванов Динур Сергеевича D.Ivanov@domainДобрый день, надеюсь пост еще
Добрый день, надеюсь пост еще читается. Подскажите а как можно сделать, чтобы логин формилровался как первая буква имени + первая буква отчетсва + фамилия. И возможно ли, чтобы пользователь прописывался в консоле на русском? https://skr.sh/s7oqklOTWV1?a
Здравствуйте, пойже буду за
Здравствуйте, пойже буду за компом там готовый шаблон я сделал там все капрызы я испонил.
Для себя сделал так:
Султанбаев Динур Иванов
учетку создает
dilnur.sultanbayev@domain.com
отображение имя(Display name):
Dilnur I. Sultanbayev
автоматический в подразделении по отделам по требованию статусам отключённой или включенный.
там все мелочи я устрянял…
вечером буду за компом готовый csv и скрипт отправлю
параметр -name отвечает за
параметр -name отвечает за имя, которое отображается в оснастке (вроде бы).
New-ADUser -Name «Иванов Иван Иванович» …
Касательно формирования — sname нужно использовать по сути также, как используется name в скрипте.