Лучший отвечающий
Добавление новых пользователей в AD скриптом PowerShell

Вопрос
-
Доброго времени суток!
Появилась задача добавить 1500 пользователей в AD.
Написал скрипт для добавления из CSV-файла:
Import-CSV -Path "D:\scripts\CreateNewUsersAD.csv"|ForEach-Object -process {New-ADUser -Name $_.Name -UserPrincipalName $_.UserPrincipalName -SamAccountName $_.SamAccountName -AccountPassword $_.Password -GivenName $_.GivenName -Surname $_.Surname -DisplayName $_.DisplayName -Company $_.Company -Department $_.Department -Title $_.Title -OfficePhone $_.OfficePhone -MobilePhone $_.MobilePhone -State $_.State -City $_.City -Country "RU" -StreetAddress $_.StreetAddress -PostalCode $_.PostalCode -CannotChangePassword $false -ChangePasswordAtLogon $false -PasswordNotRequired $true -Enabled $true -Path "ou=Users_Test,dc=domain,dc=ru" -PassThru}
Пользователи добавляются, но осталось несколько проблем:
1. Как добавить поле Path в CSV-файл если значение имеет вид "ou=Users_Test,dc=domain,dc=ru"?
2. Как добавить пользователю необходимые группы безопасности?
Добавление одной группы реализовал вторым скриптом (так же из CSV-файла), но как добавить сразу несколько групп не понятно.
Import-CSV -Path "D:\scripts\UserAddGpoup.csv"|ForEach-Object -process{Add-ADGroupMember -Identity $_.Group-Members $_.SamAccountName}
И последнее: можно ли оба действия сделать одним скриптом, добавив в первый CSV-файл необходимые поля (если возможно конечно...)?
Спасибо!
- Изменено Nord18 3 августа 2014 г. 10:17
- Изменен тип Maksim MarinovMicrosoft contingent staff, Moderator 4 августа 2014 г. 5:45
3 августа 2014 г. 10:15
Ответы
-
Получается что переменную $gr определять не нужно?
Возможно-ли объеденить два скрипта, чтобы выполнять и загрузку пользователей и добавление групп? Попытался добавить по аналогии с New-ADUser - не получилось.
Зачем задавать один и тот-же вопрос, когда ответ уже был в первом сообщении. Да можно, сначала создаем пользователя , потом добавляем в группу.
1) $gr - это делается в цикле foreach
2) Задать поле Group в csv файле и перечислить в двойных кавычках список групп - "Группа1,Группа2,Группа3"
Import-CSV -Path "D:\scripts\CreateNewUsersAD.csv" | Foreach { New-ADUser -Name $_.Name -UserPrincipalName $_.UserPrincipalName...... $grs = $_.Group.split(",") $sam = $_.SamAccountName foreach($gr in $grs) { Add-ADGroupMember -Identity $gr -Members $sam } }
- Помечено в качестве ответа Nord18 5 августа 2014 г. 2:24
4 августа 2014 г. 9:49Отвечающий
Все ответы
-
1. Как добавить поле Path в CSV-файл если значение имеет вид "ou=Users_Test,dc=domain,dc=ru"?
Использовать другой разделитель,скажем ; - import-csv -Delimiter ";" или заключить в двойные кавычки.
Name,Surname,Path,Group
Alex,Ivanov,"OU=Test,Dc=Contoso,DC=Com","Group1,Group2,Group3"
2) См. п1
Import-CSV -Path "D:\scripts\UserAddGpoup.csv"| ForEach-Object { $grs = $_.split(",") $sam = $_.SamAccountName foreach($gr in $grs) { Add-ADGroupMember -Identity $gr -Members $sam } }
3 августа 2014 г. 19:25Отвечающий -
Если заключаю ou=Users_Test,dc=domain,dc=ru в двойные кавычки то при выполнении скрипт ругается что аргумент для параметра Path пустой.
То же самое если группы заключаю в кавычки.
Разъясните пожалуйста
Import-CSV -Path "D:\scripts\UserAddGpoup.csv"| ForEach-Object { $grs = $_.split(",") $sam = $_.SamAccountName foreach($gr in $grs) { Add-ADGroupMember -Identity $gr -Members $sam } }
4 августа 2014 г. 4:18 -
Приведите пример csv файла и вывод на проблемном месте.
Передаем по конвейеру объект содержащий группы пользователя и samaccountname. $grs = $_.split(",") тут я забыл добавить свойство Group(или какое указано в CSV). Например для Group: $grs = $_.Group.split(",") - Возвращает строковый массив, содержащий подстроки данного экземпляра, разделенные элементами заданной строки
Используя цикл foreach, передаем каждый элемент(группу) в переменной grs командлету Add-ADGroupMember,т.к. параметр Identity не поддерживает массив.
- Изменено KazunEditor 4 августа 2014 г. 4:40
4 августа 2014 г. 4:39Отвечающий -
Ошибка:
PS C:\Users\Администратор> D:\Scripts\CreateNewUsersAD\CreateNewUsersAD.PS1
New-ADUser : Не удается найти позиционный параметр, принимающий аргумент "Path".
D:\Scripts\CreateNewUsersAD\CreateNewUsersAD.PS1:1 знак:104
+ Import-CSV -Path "D:\Scripts\CreateNewUsersAD\CreateNewUsersAD.csv"|ForEach-Object -process {New-ADUser <<<< -Nam
_.Name -UserPrincipalName $_.UserPrincipalName -SamAccountName $_.SamAccountName -AccountPassword $_.Password Path $
ath -GivenName $_.GivenName -Surname $_.Surname -DisplayName $_.DisplayName -Company $_.Company -Department $_.Depar
nt -Title $_.Title -OfficePhone $_.OfficePhone -MobilePhone $_.MobilePhone -State $_.State -City $_.City -Country $_
untry -StreetAddress $_.StreetAddress -PostalCode $_.PostalCode -CannotChangePassword $false -ChangePasswordAtLogonlse -PasswordNotRequired $true -Enabled $true -PassThru}
+ CategoryInfo : InvalidArgument: (:) [New-ADUser], ParameterBindingException
+ FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.ActiveDirectory.Management.Commands.NewADUserCSV:
Name,UserPrincipalName,SamAccountName,AccountPassword,Path,GivenName,Surname,DisplayName,Company,Department,Title,OfficePhone,MobilePhone,State,City,Country,StreetAddress,PostalCode,Path
Иванов Иван Иванович,ivan.ivanov@domain.ru,ivan.ivanov,123456Q!,"ou=Users_Test,dc=domain,dc=ru",Иван,Иванов,Иванов Иван Иванович,ООО Рога и Копыта,Отдел продаж,Менеджер,877777777,877777777,Алтайский край,Барнаул,RU,Проспект Ленина 1,656000Плюс только сейчас заметил, попытавшись залогиниться на компьютер - неверное имя пользователя или пароль. Пользователь создался, но войти невозможно. Проблема с атрибутом -AccountPassword?
4 августа 2014 г. 6:19 -
Ошибки:
1) В csv два поля Path
2) Path $ath - Тут сразу 2 ошибки, отсутствует дефис перед Path, $ath - переменная не опеределена, должно быть -Path $_.Path
3) -AccountPassword $_.Password - должно быть:
-AccountPassword $(ConvertTo-SecureString $_.Password -AsPlainText -Force)
- Изменено KazunEditor 4 августа 2014 г. 6:28
4 августа 2014 г. 6:28Отвечающий -
Спасибо! Добавить пользователя получилось, все корректно проходит.
Для понимания:
Import-CSV -Path "D:\scripts\UserAddGpoup.csv"| ForEach-Object { - импорт значений из CSV-файла, передача по конвейеру
$grs = $_.Group.split(",") - определение переменной $grs (значения столбца Group разделены запятыми)
$sam = $_.SamAccountName - определение переменной $sam
foreach($gr in $grs) { - запуск цикла на добовление групп
Add-ADGroupMember -Identity $gr -Members $sam
}
}Не понятно что означает переменная $gr? Можете уточнить?
4 августа 2014 г. 8:40 -
$grs = $_.Group.split(",") - Допустим здесь мы получаем 3 элемента ("Группа1","Группа2","Группа3"). $gr - получает значение следующего элемента коллекции на каждом шаге выполнения цикла
4 августа 2014 г. 8:55Отвечающий -
Получается что переменную $gr определять не нужно?
Возможно-ли объеденить два скрипта, чтобы выполнять и загрузку пользователей и добавление групп? Попытался добавить по аналогии с New-ADUser - не получилось.
- Изменено Nord18 4 августа 2014 г. 9:35
4 августа 2014 г. 9:34 -
Получается что переменную $gr определять не нужно?
Возможно-ли объеденить два скрипта, чтобы выполнять и загрузку пользователей и добавление групп? Попытался добавить по аналогии с New-ADUser - не получилось.
Зачем задавать один и тот-же вопрос, когда ответ уже был в первом сообщении. Да можно, сначала создаем пользователя , потом добавляем в группу.
1) $gr - это делается в цикле foreach
2) Задать поле Group в csv файле и перечислить в двойных кавычках список групп - "Группа1,Группа2,Группа3"
Import-CSV -Path "D:\scripts\CreateNewUsersAD.csv" | Foreach { New-ADUser -Name $_.Name -UserPrincipalName $_.UserPrincipalName...... $grs = $_.Group.split(",") $sam = $_.SamAccountName foreach($gr in $grs) { Add-ADGroupMember -Identity $gr -Members $sam } }
- Помечено в качестве ответа Nord18 5 августа 2014 г. 2:24
4 августа 2014 г. 9:49Отвечающий -
Прошу прощения за повтор.
Получилось следующее:
Import-CSV -Path "D:\Scripts\CreateNewUsersAD\CreateNewUsersAD.csv"|Foreach {New-ADUser -Name $_.Name -UserPrincipalName $_.UserPrincipalName -SamAccountName $_.SamAccountName -AccountPassword $(ConvertTo-SecureString $_.AccountPassword -AsPlainText -Force) -Path $_.Path -GivenName $_.GivenName -Surname $_.Surname -DisplayName $_.DisplayName -Company $_.Company -Department $_.Department -Title $_.Title -OfficePhone $_.OfficePhone -MobilePhone $_.MobilePhone -State $_.State -City $_.City -Country $_.Country -StreetAddress $_.StreetAddress -PostalCode $_.PostalCode -CannotChangePassword $false -ChangePasswordAtLogon $false -PasswordNotRequired $true -Enabled $true -PassThru $grs = $_.Group.split(",") $sam = $_.SamAccountName foreach($gr in $grs) { Add-ADGroupMember -Identity $gr -Members $sam } }
Пользователи не добавились, группы тоже.
4 августа 2014 г. 10:16 -
Привести текущий формат файла csv. Поле Group есть в csv? Какие ошибки?4 августа 2014 г. 10:30Отвечающий
-
Ошибка:
New-ADUser : Сделана попытка добавить к каталогу объект с уже существующим именем
D:\Scripts\CreateNewUsersAD\AddUsers.PS1:1 знак:88
+ Import-CSV -Path "D:\Scripts\CreateNewUsersAD\CreateNewUsersAD.csv"|Foreach {New-ADUser <<<< -Name $_.Name -UserPrin
cipalName $_.UserPrincipalName -SamAccountName $_.SamAccountName -AccountPassword $(ConvertTo-SecureString $_.AccountPa
ssword -AsPlainText -Force) -Path $_.Path -GivenName $_.GivenName -Surname $_.Surname -DisplayName $_.DisplayName -Comp
any $_.Company -Department $_.Department -Title $_.Title -OfficePhone $_.OfficePhone -MobilePhone $_.MobilePhone -State
$_.State -City $_.City -Country $_.Country -StreetAddress $_.StreetAddress -PostalCode $_.PostalCode -CannotChangePass
word $false -ChangePasswordAtLogon $false -PasswordNotRequired $true -Enabled $true -PassThru
+ CategoryInfo : NotSpecified: (CN=???????? ???...=domain,dc=ru:String) [New-ADUser], ADException
+ FullyQualifiedErrorId : Сделана попытка добавить к каталогу объект с уже существующим именем,Microsoft.ActiveDir
ectory.Management.Commands.NewADUser
Add-ADGroupMember : Не удается найти объект с удостоверением: "ivan.ivanov" в "DC=domain,DC=ru".
D:\Scripts\CreateNewUsersAD\AddUsers.PS1:5 знак:18
+ Add-ADGroupMember <<<< -Identity $gr -Members $sam
+ CategoryInfo : ObjectNotFound: (ivan.ivanov:ADPrincipal) [Add-ADGroupMember], ADIdentityNotFoundExc
eption
+ FullyQualifiedErrorId : SetADGroupMember.ValidateMembersParameter,Microsoft.ActiveDirectory.Management.Commands.
AddADGroupMemberCSV
Name,UserPrincipalName,SamAccountName,AccountPassword,Path,GivenName,Surname,DisplayName,Company,Department,Title,OfficePhone,MobilePhone,State,City,Country,StreetAddress,PostalCode,Group
Иванов Иван Иванович,ivanov.ivanov@domain.ru,ivanov.ivanov,123456Q!,"ou=Users_Test,dc=domain,dc=ru",Иван,Иванов,Иванов Иван Иванович,ООО Рога и копыта,Отдел продаж,Менеджер,877777777,877777777,Алтайский край,Барнаул,RU,Проспект Ленина 1,656000,"Администраторы,Operators"
4 августа 2014 г. 10:41 -
New-ADUser : Сделана попытка добавить к каталогу объект с уже существующим именем
Import-CSV -Path "D:\Scripts\CreateNewUsersAD\CreateNewUsersAD.csv" - Корректные данные в консоли PowerShell выводит?
- Изменено KazunEditor 4 августа 2014 г. 10:47
4 августа 2014 г. 10:46Отвечающий -
Да, данные корректные, изменил кодировку с ANSI на Unicode.
Пользователи загрузились нормально, группы добавились, но остается непонятно как связались два скрипта в один и все так же не понятно с циклами...
4 августа 2014 г. 10:55 -
Читайте документацию.
Get-Help about_ForEach - http://technet.microsoft.com/en-us/library/hh847816.aspx
http://powershell.com/cs/blogs/ebookv2/default.aspx - Глава Chapter 8.
Loops4 августа 2014 г. 11:22Отвечающий -
Большое спасибо!
По Get-Help about_ForEach стало более понятно (часть про добавление групп).
Уважаемый Kazun, если не затруднит, разъясните пожалуйста:
Команда ForEach, которая имеет синтаксис foreach ($<элемент> in $<коллекция>){<список_инструкций>} и полностью подходит ко второй части скрипта (Foreach($Group in...), и эта же команда используется после импорта данных из CSV. Получается, первый раз цикл работает именно с импортированными данными, и после того как они заканчиваются приступает к выполнению вложенного цикла?
4 августа 2014 г. 14:05 -
Не надо путать командлет Foreach-Object(у которого есть альяс foreach,данный альяс не может быть использован в начале,а только в конвейере,т.е. после | ) и оператор foreach. После импорта данных из CSV у нас образется коллекция элементов, которая передается по конвейеру командлету Foreach-Object и работа происходит с отдельным элементов коллекции. Берется первый элемент из коллекции и передается по конвейеру Foreach-Object,для обращения к этому объекту используется автоматическая переменная $_(или PSItem). После выполняется команда New-ADUser, за ней следует уже вложенный цикл foreach. Далее берется второй элемент и происходят теже самые дейсвтия.
Более подробно в статье - Обработка коллекций с помощью циклов foreach оболочки PowerShell
PS. Если ответ полезен ,нажимайте кнопку "Пометить как ответ"
4 августа 2014 г. 14:41Отвечающий