none
Добавление новых пользователей в AD скриптом PowerShell RRS feed

  • Вопрос

  • Доброго времени суток!

    Появилась задача добавить 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-файл необходимые поля (если возможно конечно...)?

    Спасибо!



    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.NewADUser

    CSV:

    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.
       AddADGroupMember

    CSV

    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
  • 4 августа 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
    Отвечающий