Всем привет. Сегодня я покажу вам как можно автоматизировать добавление пользователей в AcriveDirecotory при помощи скрипта. Данные о пользователе будем брать из CSV файла.
Скачать архив со скриптом можно здесь . В этот же архив я положил установщик .net 4.5 и powershell 5.1 для 2008R2.
Пример моего файла CSV:
ФИО;должность;отдел;номер комнаты;номер телефона;электронная почта;идентификатор
Иванов Иван Иванович;директор;76;345;123;[email protected];00000001
Петрова Ирина Петровна;лаборант;77;367;124;[email protected];00000002
Васильев Василий Васильевич;управляющий;78;389;125;[email protected];00000003
Александров Александ Александрович;зам. Директора;79;411;126;[email protected];00000004
Сергеев Сергеей Сергеевич;лаборант;80;433;127;[email protected];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='что-нибдь, ну или пробел'
}
Здравствуйте, подскажите пожалуйста в чем проблема, спасибоImport-Csv : Не удается найти параметр, соответствующий имени параметра "Encoding".C:\aduserstoAD.ps1:104 знак:37+ $csv=import-Csv $pathToCSV -Encoding <<<< OEM -Delimiter ';' + CategoryInfo : InvalidArgument: (:) [Import-Csv], ParameterBind ingException + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Comm ands.ImportCsvCommand
Но я сделал все по инструкции, сначала установил нетфрейм, потом повершел ,сервер перезагрузился , установил сам компоненты, снова перезагрузился, но версия не изменился стоит V2, как быть? никакой ощибки при установке не было
Все спасибо, получилось, действительно проблема была в версии ПШ. он не устанавливался потому что Фреймворк не обновился, скачал и установил с ]]>https://download.microsoft.com/download/1/6/7/167F0D79-9317-48AE-AEDB-17...]]>и все заработал.СПАСИБО АВТОРУ!!!!
Еще один вопрос, а можноли добавить в этот же скрипт команду с паролями?
что вы имеете ввиду под командой с паролями?
с паролями я уже решил с параметрами -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 , все пользователи удаляются или же не добавляются
Здравствуйте, При запуске скрипта выходет следующая ошибка, подскажите пожалуйста в чем причина?PS C:\> .\aduserstoad2Set-ADUser : Указанная учетная запись уже существуетAt C:\aduserstoAD2.ps1:194 char:9+ ... Set-ADUser -Identity "$uname" -Surname "$surname" -Displa ...+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ResourceExists: (TMamitova:ADUser) [Set-ADUser], ADIdentityAlreadyExistsException + FullyQualifiedErrorId : Указанная учетная запись уже существует,Microsoft.ActiveDirectory.Management.Commands.Se tADUser Rename-ADObject : Сделана попытка добавить к каталогу объект с уже существующим именемAt C:\aduserstoAD2.ps1:198 char:9+ ... Rename-ADObject $distName.DistinguishedName -NewName $use ...+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (CN=TMamitova,CN...stdomain,DC=han:ADObject) [Rename-ADObject], ADExceptio n + FullyQualifiedErrorId : Сделана попытка добавить к каталогу объект с уже существующим именем,Microsoft.ActiveDir ectory.Management.Commands.RenameADObject
Причина выявлена, проблема в том что все поля не должны быть пустыми что и связан с вопросом максима, спасибо всем
Извините, а где именно прописать этот код?
Здравствуйте, а как добавить точку после первой буквы имени в логине?
Здравствуйте, подскажите пожалуйста, как поставить точку после первой буквы имени в логине?
чтобы ставить точку после имя нужно изменить здесь
$userName
=
$shortName
+
$transSurname на
$userName
=
$shortName
+'.'+
$transSurname
то тогда получется из Иванов Динур Сергеевича D.Ivanov@domainДобрый день, надеюсь пост еще читается. Подскажите а как можно сделать, чтобы логин формилровался как первая буква имени + первая буква отчетсва + фамилия. И возможно ли, чтобы пользователь прописывался в консоле на русском? ]]>https://skr.sh/s7oqklOTWV1?a ]]>
параметр -name отвечает за имя, которое отображается в оснастке (вроде бы).
New-ADUser -Name "Иванов Иван Иванович" ...
Касательно формирования - sname нужно использовать по сути также, как используется name в скрипте.
Здравствуйте, пойже буду за компом там готовый шаблон я сделал там все капрызы я испонил.
Для себя сделал так:
Султанбаев Динур Иванов
учетку создает
[email protected]
отображение имя(Display name):
Dilnur I. Sultanbayev
автоматический в подразделении по отделам по требованию статусам отключённой или включенный.
там все мелочи я устрянял...
вечером буду за компом готовый csv и скрипт отправлю