Импорт пользователей из каталога Active Directory. Добавление пользователей в Active Directory из CSV файла при помощи скрипта PowerShell

Импорт пользователей из каталога Active Directory. Добавление пользователей в Active Directory из CSV файла при помощи скрипта PowerShell

18.04.2019
авторитет 23 февраля 2014 в 04:47

Скрипт PowerShell для импорта в лес Active Directory и создания файла с пользователями

Сначала установил и настроил WS 2012R2 как DC и после этого встал вопрос как добавлять пользователей в него. Список сотрудников у меня был в xls файле и тогда я решил, чтобы не забивать пользователей вручную, оптимизировать это с помощью PowerShell.

В интернете много примеров, но они мало чем подходили для моего решения, некоторые были кусками кода, другие вовсе не работали с WS2012R2, а третьи добавляли пользователей в определенные каталоги, а мне необходимо было раскидать пользователей в более чем 70 каталогов. Так же встала задача как сделать CSV - файл для PowerShell в соответствии с его стандартами.

В первую очередь необходимо разделить ФИО на разные столбцы и оказалось, что в MS Excel 2013 есть достаточно интересный инструмент для этого под названием «Текст по столбцам» который находится во вкладке ДАННЫЕ.

После этого был принят формат логинов для пользователей и было принято решение, что это будут первые буквы от имени и отчества и после нижнего подчеркивания полностью фамилия (например: aa_petrov). Для этого пришлось транслитерировать их с помощью VB-скрипта.

Скрипт транслит - скрипта для Excel`я

Function Translit(Txt As String) As String Dim Rus As Variant Rus = Array("а", "б", "в", "г", "д", "е", "ё", "ж", "з", "и", "й", "к", _ "л", "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ц", "ч", "ш", _ "щ", "ъ", "ы", "ь", "э", "ю", "я", "А", "Б", "В", "Г", "Д", "Е", _ "Ё", "Ж", "З", "И", "Й", "К", "Л", "М", "Н", "О", "П", "Р", _ "С", "Т", "У", "Ф", "Х", "Ц", "Ч", "Ш", "Щ", "Ъ", "Ы", "Ь", "Э", "Ю", "Я") Dim Eng As Variant Eng = Array("a", "b", "v", "g", "d", "e", "jo", "zh", "z", "i", "j", _ "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "h", "c", "ch", _ "sh", "sch", "", "y", "", "e", "yu", "ya", "A", "B", "V", "G", "D", _ "E", "Jo", "Zh", "Z", "I", "J", "K", "L", "M", "N", "O", "P", "R", _ "S", "T", "U", "F", "H", "C", "Ch", "Sh", "Sch", "", "Y", "", "E", "Yu", "Ya") For I = 1 To Len(Txt) с = Mid(Txt, I, 1) flag = 0 For J = 0 To 65 If Rus(J) = с Then outchr = Eng(J) flag = 1 Exit For End If Next J If flag Then outstr = outstr & outchr Else outstr = outstr & с Next I Translit = outstr End Function

А также добавлена функция для генерации данных логинов:

СТРОЧН(ЛЕВСИМВ(Translit(ЛЕВСИМВ(D2)))&ЛЕВСИМВ(Translit(ЛЕВСИМВ(E2)))&"_"&Translit(C2))

Пароли были сгенерированны с помощью фразы и набора случайных символов:

="Habrhabr"&СЛУЧМЕЖДУ(1000;9999)

После этого сохранил файл в.csv с 6 заголовками Login; Password; LastName; FirstName; MiddleName; OU; JobTitle и изменил кодировку файла в Unicode, так как с ANSI часто бывают проблемы.

Затем написал следующий скрипт PS:

Import-Module ActiveDirectory $Users = Import-Csv -Delimiter ";" -Path "C:\Users\Администратор\Desktop\user.csv" $allou = Get-ADOrganizationalUnit -Filter * -SearchBase "OU=Forest,DC=habr,DC=ru" foreach ($User in $Users) { $ou = $allou | Where {$_.Name -eq $User.OU} if ($ou) { $OU = $ou.DistinguishedName } else { $OU = "OU=Others,DC=habr,DC=ru" <#Если каталог с таким именем не найден отправляем в OU other#> } $Password = $User.Password $Detailedname = $User.LastName + " " + $User.FirstName + " " + $User.MiddleName $UserFirstname = $User.FirstName $UserLastName = $User.LastName $JobTitle = $User.JobTitle $SAM= $User.Login + "@habr.ru" New-ADUser -Name $Detailedname -SamAccountName $User.Login -UserPrincipalName $SAM -DisplayName $Detailedname -GivenName $User.FirstName -Surname $User.LastName -Title $JobTitle -AccountPassword (ConvertTo-SecureString -AsPlainText "H@brHabr" -Force) -Enabled $true -Path $OU }

Данный скрипт позволяет раскидать пользователей по своим каталогам, а тех у кого их нет отправить в каталог Other.

Спасибо за внимание.

Теги: powershell, active directory, excel, csv, windows server 2008, windows server 2008 r2, windows server 2012, windows server 2012r2,

Всем привет. Сегодня я покажу вам как можно автоматизировать добавление пользователей в AcriveDirecotory при помощи скрипта. Данные о пользователе будем брать из CSV файла.

Скачать архив со скриптом можно . В этот же архив я положил установщик.net 4.5 и powershell 5.1 для 2008R2.

Пример моего файла CSV:

ФИО;должность;отдел;номер комнаты;номер телефона;электронная почта;идентификатор
Иванов Иван Иванович;директор;76;345;123; ;00000001
Петрова Ирина Петровна;лаборант;77;367;124; ;00000002
Васильев Василий Васильевич;управляющий;78;389;125; ;00000003
Александров Александ Александрович;зам. Директора;79;411;126; ;00000004
Сергеев Сергеей Сергеевич;лаборант;80;433;127; ;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($inString) $Translit = @{ "а" = "a" "А" = "a" "б" = "b" "Б" = "b" "в" = "v" "В" = "v" "г" = "g" "Г" = "g" "д" = "d" "Д" = "d" "е" = "e" "Е" = "e" "ё" = "yo" "Ё" = "eo" "ж" = "zh" "Ж" = "zh" "з" = "z" "З" = "z" "и" = "i" "И" = "i" "й" = "j" "Й" = "j" "к" = "k" "К" = "k" "л" = "l" "Л" = "l" "м" = "m" "М" = "m" "н" = "n" "Н" = "n" "о" = "o" "О" = "o" "п" = "p" "П" = "p" "р" = "r" "Р" = "r" "с" = "s" "С" = "s" "т" = "t" "Т" = "t" "у" = "u" "У" = "u" "ф" = "f" "Ф" = "f" "х" = "h" "Х" = "h" "ц" = "ts" "Ц" = "ts" "ч" = "ch" "Ч" = "ch" "ш" = "sh" "Ш" = "sh" "щ" = "sch" "Щ" = "sch" "ъ" = "" "Ъ" = "" "ы" = "y" "Ы" = "y" "ь" = "" "Ь" = "" "э" = "e" "Э" = "e" "ю" = "yu" "Ю" = "yu" "я" = "ya" "Я" = "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(" ") $name=$fio.split(" ") $sname=$fio.split(" ") $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 -eq "" -or !$args) { #обновляем данные пользователя 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 -eq "-del") { #удаляем пользователя Remove-ADUser -Identity $userName -Confirm:$false } } #если id не совпадают, и найдено имя пользователя, идем к следующему шагу цикла else { } } #если пользователя не существует else { #и запустили без аргументов if ($args -eq "" -or !$args) { 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 } } } }

Опять понадобилось и НИЧЕГО нет готового Все пишут как забацать контакты с помощью консоли MS Exchange 2007 \ 2010. А вот бывают ситуации - контроллер домена Win2008, а Exchange- 2003. Дурдом, но имеет место быть, что ж делать... И вот требуется создать там примерно 6000 контактов. Просто контакт создать несложно, но вот атрибуты прописать, те которые требуются Exchange для работы с контактами - задача еще та.
Итак, требуется создать кучу почтовых контактов средствами powershell v. 2.0.1.1 с использованием модуля работы с AD. Попытаюсь, как обычно, описать самым простейшим языком, понтяным самому неопытному администратору.

1. Создаем файл в MS Excel с именем contacts_list, сохраем в формате CSV по пути С:\CSV, и именуем в файле столбцы вот так:

Name Mail mailNickname Type proxyAddresses targetAddress

в принципе этих параметров хватает для создания полноценного контакта и Exchange его видит, и может с ним работать, в какой бы папке-OU в вашем AD он у вас не был бы.
Какие конкретно поля в свойствах объекта "контакт" отражают эти столбцы?
Вот разъяснения, типа табличка)))

Параметр столбца - Название в редакторе атрибутов ADSI (пояснение) - Русскоязычное обозначение на свойствах контакта

Name - CN (каноническое имя объекта) - Имя
Mail - Mail (электронная почта) - Эл.почта
mailNickname - mailNickname (алиас Exchange, псевдоним) - отображается только в редакторе атрибутов
Type - ObjectClass (класс (тип) объекта) - отображается только в редакторе атрибутов
proxyAddresses - proxyAddresses (адрес внешней по отношению к домену электропочты в формате SMTP:[email protected]) - отображается только в редакторе атрибутов
targetAddress - targetAddress (адрес внешней по отношению к домену электропочты в формате SMTP:[email protected]) - отображается только в редакторе атрибутов
Заполняем столбцы, например

Name Mail mailNickname Type proxyAddresses targetAddress
Vasiliy Terkin [email protected] Partners_Sales_0001 contact SMTP:[email protected] SMTP:[email protected]

Примечание:
mailNickname должен отображать принадлежность к какой-либо группе рассылки, и лучше, если будет иметь порядковый номер. Встречал глюки, когда все контакты имели одинаковый mailNickname и глюки были неприятные и странные.
proxyAddresses, targetAddress обязаельно должные быть в указанном формате SMTP:[email protected], иначе Exchange не поймет контакта и будет выдавать ошибку о неверном формате.

2. Создаем файл с create_contact и расширением ps1 и копируем туда вот такой код:

Import-CSV -Path "C:\CSV\contacts_list.csv" | ForEach-Object -process {New-ADObject -Path "OU=PostContact,DC=domain,DC=corp,DC=loc al" -Name $_.Name -Type $_.Type -DisplayName $_.Name -OtherAttributes @{"Mail"=$_.mail; "proxyAddresses"=$_.proxyAddresses; "targetAddress"=$_.targetAddress; "mailNickname"=$_.mailNickname}}

Что тут куда? Разберем по кускам:

Import-CSV -Path "C:\CSV\contacts_list.csv" - команда забирает данные из файла расположенного по пути C:\CSV\contacts_list.csv

| ForEach-Object -process { - и передает данные в конвейер обработки, причем каждое значение обрабатывается отдельно в соответствии с именами столбцов

New-ADObject - сам конвейер представляет собой команду создания в AD объекта (справка в powershell по вызову get-help new-adobject - full)

-Path "OU=PostContact,DC=domain,DC=corp,DC=loc al" - путь, по которому будет создан почтовый контакт. Посмотреть его можно открыв AD и щелкнув свойства OU (контейнера) и просмотрев путь во вкладе "Объект" и переделав его в соответствии с форматом в примере. Если этот параметр убрать - контакты создадутся в Users, это путь по умолчанию.

-Name $_.Name -Type $_.Type -DisplayName $_.Name - обязательные параметры (Name и Type) и не очень обязательный -
DisplayName. Их надо создавать понятыми, можно и кириллицей, можно латинскими буквами. Есть ограничение по длине, вроде бы, точно не помню - 64 символа.

-OtherAttributes @{"Mail"=$_.mail; "proxyAddresses"=$_.proxyAddresses; "targetAddress"=$_.targetAddress; "mailNickname"=$_.mailNickname}} - самое важное. Почтовые адреса нельзя передать просто так, как Name и Type. Почтовые адреса это типа otherattributes - дополнительные атрибуты, но их также можно передать из столбцов файла.CSV. Не забывайте проверить все символы и скобки, в конце должно быть 2 скобки.

3. Сохраняем файлы и проверяем пути -C:\CSV - в файле и в реале)))
4. Открываем powershell на контроллере домена (контроллер не должен быть типа ReadOnly!!!), выполняем последовательно 2 команды :

Set-ExecutionPolicy Unrestricted

import-module activedirectory

5. Выполняем C:\CSV\create_contact.ps1
6. Наблюдаем (не забываем сделать рефреш консоли) в OU PostContact новые почтовые контакты.

Ну и напоследок, несколько советов .
- Если у вас полноценная версия powershell, то вызов из нее powershell_ise откроет очень удобный редактор скриптов с возможностью запуска и прочими удобствами.
- Файлы CSV должны быть в кодировке Unicode, если у вас ANSI - будет ошибка.
- Можно добавить еще массу столбцов и, следовательно, атрибутов, к почтовому контакту. Например, некоторым Exchange может потребоваться такой атрибут контакта, как legacyExchangeDN. Узнать его несложно - создаем руками почтовый контакт в АД, смотрим этот параметр во вкладке "Редактор атрибутов" (если этой вкладки нет - включаем ее в консоли вот так: меню Вид \ Дополнительные компоненты). Соответственно к файлу с данными добавляем столбец legacyExchangeDN, заполняем его отредактированным значением, скопированным из только что созданного контакта, а в скрипте после "mailNickname"=$_.mailNickname добавляем
"legacyExchangeDN"=$_.legacyExchangeD N. Не забываем скобки.

авторитет 23 февраля 2014 в 04:47

Скрипт PowerShell для импорта в лес Active Directory и создания файла с пользователями

  • PowerShell ,
  • IT-инфраструктура

Сначала установил и настроил WS 2012R2 как DC и после этого встал вопрос как добавлять пользователей в него. Список сотрудников у меня был в xls файле и тогда я решил, чтобы не забивать пользователей вручную, оптимизировать это с помощью PowerShell.

В интернете много примеров, но они мало чем подходили для моего решения, некоторые были кусками кода, другие вовсе не работали с WS2012R2, а третьи добавляли пользователей в определенные каталоги, а мне необходимо было раскидать пользователей в более чем 70 каталогов. Так же встала задача как сделать CSV - файл для PowerShell в соответствии с его стандартами.

В первую очередь необходимо разделить ФИО на разные столбцы и оказалось, что в MS Excel 2013 есть достаточно интересный инструмент для этого под названием «Текст по столбцам» который находится во вкладке ДАННЫЕ.

После этого был принят формат логинов для пользователей и было принято решение, что это будут первые буквы от имени и отчества и после нижнего подчеркивания полностью фамилия (например: aa_petrov). Для этого пришлось транслитерировать их с помощью VB-скрипта.

Скрипт транслит - скрипта для Excel`я

Function Translit(Txt As String) As String Dim Rus As Variant Rus = Array("а", "б", "в", "г", "д", "е", "ё", "ж", "з", "и", "й", "к", _ "л", "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ц", "ч", "ш", _ "щ", "ъ", "ы", "ь", "э", "ю", "я", "А", "Б", "В", "Г", "Д", "Е", _ "Ё", "Ж", "З", "И", "Й", "К", "Л", "М", "Н", "О", "П", "Р", _ "С", "Т", "У", "Ф", "Х", "Ц", "Ч", "Ш", "Щ", "Ъ", "Ы", "Ь", "Э", "Ю", "Я") Dim Eng As Variant Eng = Array("a", "b", "v", "g", "d", "e", "jo", "zh", "z", "i", "j", _ "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "h", "c", "ch", _ "sh", "sch", "", "y", "", "e", "yu", "ya", "A", "B", "V", "G", "D", _ "E", "Jo", "Zh", "Z", "I", "J", "K", "L", "M", "N", "O", "P", "R", _ "S", "T", "U", "F", "H", "C", "Ch", "Sh", "Sch", "", "Y", "", "E", "Yu", "Ya") For I = 1 To Len(Txt) с = Mid(Txt, I, 1) flag = 0 For J = 0 To 65 If Rus(J) = с Then outchr = Eng(J) flag = 1 Exit For End If Next J If flag Then outstr = outstr & outchr Else outstr = outstr & с Next I Translit = outstr End Function

А также добавлена функция для генерации данных логинов:

СТРОЧН(ЛЕВСИМВ(Translit(ЛЕВСИМВ(D2)))&ЛЕВСИМВ(Translit(ЛЕВСИМВ(E2)))&"_"&Translit(C2))

Пароли были сгенерированны с помощью фразы и набора случайных символов:

="Habrhabr"&СЛУЧМЕЖДУ(1000;9999)

После этого сохранил файл в.csv с 6 заголовками Login; Password; LastName; FirstName; MiddleName; OU; JobTitle и изменил кодировку файла в Unicode, так как с ANSI часто бывают проблемы.

Затем написал следующий скрипт PS:

Import-Module ActiveDirectory $Users = Import-Csv -Delimiter ";" -Path "C:\Users\Администратор\Desktop\user.csv" $allou = Get-ADOrganizationalUnit -Filter * -SearchBase "OU=Forest,DC=habr,DC=ru" foreach ($User in $Users) { $ou = $allou | Where {$_.Name -eq $User.OU} if ($ou) { $OU = $ou.DistinguishedName } else { $OU = "OU=Others,DC=habr,DC=ru" <#Если каталог с таким именем не найден отправляем в OU other#> } $Password = $User.Password $Detailedname = $User.LastName + " " + $User.FirstName + " " + $User.MiddleName $UserFirstname = $User.FirstName $UserLastName = $User.LastName $JobTitle = $User.JobTitle $SAM= $User.Login + "@habr.ru" New-ADUser -Name $Detailedname -SamAccountName $User.Login -UserPrincipalName $SAM -DisplayName $Detailedname -GivenName $User.FirstName -Surname $User.LastName -Title $JobTitle -AccountPassword (ConvertTo-SecureString -AsPlainText "H@brHabr" -Force) -Enabled $true -Path $OU }

Данный скрипт позволяет раскидать пользователей по своим каталогам, а тех у кого их нет отправить в каталог Other.

Спасибо за внимание.

Теги: powershell, active directory, excel, csv, windows server 2008, windows server 2008 r2, windows server 2012, windows server 2012r2,



© 2024 beasthackerz.ru - Браузеры. Аудио. Жесткий диск. Программы. Локальная сеть. Windows