none
Массовое создание пользователей в AD с транслитом RRS feed

  • Вопрос

  • Добрый день!

    Необходим скрипт по созданию пользователей в AD.

    Суть вопроса:

    есть эксельный файл c 4-мя колонками:

    ФИО Должность Департамент и Телефон

    Необходимо создать пользователей в оприделённом OU в AD по оприделённому шаблону:

    DisplayName - должно быть ФИО

    SamAccountName  - транслитерировать имя и фамилию(на пример - Иванов Иван Иванович - > ivan.ivanov)

    Заполнить поля First name Last name из ФИО.

    Так же заполнить поля Job Title Department из файла. Поле Company у всех одно.

    Внести номер телефона и адрес почты сформировать из  SamAccountName +@domain.com.

    Пароль всем поставить по умолчанию один.

    Домен уровня функциональности 2012 Posh версии 4.

    Прошу сильно не ругать за наглость.Вы уж помогите...


    • Изменено Igor3000 19 сентября 2014 г. 6:33
    19 сентября 2014 г. 6:33

Ответы

  • Файл Csv должен быть в кодировке UTF-8.

    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
    }
    
    $password = ConvertTo-SecureString 'P@$$w0rd1' -AsPlainText -Force
    $ou = "OU=My,DC=Contoso,DC=Com"
    
    Import-Csv users.csv | Foreach {
    	$f = $_.ФИО.split(" ")
    	$sam = Translit "$($f[1]).$($f[0])"
    	$user = @{
    		DisplayName = $_.ФИО
    		SamAccountName = $sam
    		GivenName = $f[1]
    		Surname = $f[0]
    		Title = $_.Должность
    		Department  = $_.Департамент
    		Company = "Компания"
    		Enabled = $true
    		AccountPassword = $password
    		OfficePhone = $_.Телефон
    		EmailAddress = $sam + ",@domain.com"
    		Path = $ou
    	}
    	
    	New-ADUser @user
    }

    • Помечено в качестве ответа Igor3000 22 сентября 2014 г. 5:11
    19 сентября 2014 г. 6:55
    Отвечающий
  • Скрипт отработал и создал пользователя!!!

    Но не заполнил поле User Logon Name а так же не подтянул Job Title и Department...

    Скрипт все верно сделал, а то что Вы не можете правильно заполнить файл, тут уж к себе вопросы. Зачем в название поля добавлять в конец пробел(ДолжностьПРОБЕЛ;)? Поэтому для начала убрать пробелы из файла и привести к виду - ФИО;Должность;Департамент;Телефон

    User Logon Name - Т.е. скрипт сам должен додумать? Где-то об этом написано? Добавить поле в $user:

    $user = @{
          UserPrincipalName = $sam + ",@domain.com"

    • Помечено в качестве ответа Igor3000 22 сентября 2014 г. 5:11
    19 сентября 2014 г. 12:25
    Отвечающий

Все ответы

  • Файл Csv должен быть в кодировке UTF-8.

    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
    }
    
    $password = ConvertTo-SecureString 'P@$$w0rd1' -AsPlainText -Force
    $ou = "OU=My,DC=Contoso,DC=Com"
    
    Import-Csv users.csv | Foreach {
    	$f = $_.ФИО.split(" ")
    	$sam = Translit "$($f[1]).$($f[0])"
    	$user = @{
    		DisplayName = $_.ФИО
    		SamAccountName = $sam
    		GivenName = $f[1]
    		Surname = $f[0]
    		Title = $_.Должность
    		Department  = $_.Департамент
    		Company = "Компания"
    		Enabled = $true
    		AccountPassword = $password
    		OfficePhone = $_.Телефон
    		EmailAddress = $sam + ",@domain.com"
    		Path = $ou
    	}
    	
    	New-ADUser @user
    }

    • Помечено в качестве ответа Igor3000 22 сентября 2014 г. 5:11
    19 сентября 2014 г. 6:55
    Отвечающий
  • пишет:

    You cannot call a method on a null-valued expression.
    At C:\Scripts\user-translit.ps1:86 char:2
    + $f = $_.ФИО.split(" ")
    + ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

    19 сентября 2014 г. 8:03
  • Покажите csv файл, который получился.
    19 сентября 2014 г. 8:51
    Отвечающий
  • как файл прикрепить я ненашол так что вот:

    ФИО;Должность ;Департамент ;Телефон
    Иванов Иван Иванович;Начальник ПЖК;Контора;286-63-48
    ;;;
    ;;;
    ;;;
    ;;;
    ;;;
    ;;;
    ;;;
    ;;;
    ;;;
    ;;;
    ;;;
    ;;;

    19 сентября 2014 г. 9:18
  • 1) Сначала проверить вывод в консоле, что Import-Csv users.csv -Delimiter ";" данные корректны

    2) Изменить строку Import-Csv users.csv  на Import-Csv users.csv -Delimiter ";"

    19 сентября 2014 г. 9:54
    Отвечающий
  • По Вашим указаниям:

    1.Выводит на экран всё правильно.

    2.При замене строчки в скрипте пишет требует параметр:

    cmdlet New-ADUser at command pipeline position 1
    Supply values for the following parameters:
    Name:

    19 сентября 2014 г. 10:21
  • Добавить поле в $user:

    $user = @{
          Name = $_.ФИО

    И убрать из csv пустые строки типа:

    ;;;
    ;;;
    ;;;
    ;;;
    ;;;
    ;;;
    ;;;
    ;;;
    ;;;
    ;;;
    ;;;
    ;;;


    • Изменено KazunEditor 19 сентября 2014 г. 10:32
    19 сентября 2014 г. 10:31
    Отвечающий
  • Добавил строку и убрал ; 

    Теперь почему то стало писать:

    New-ADUser : Access is denied
    At C:\Scripts\user-translit.ps1:105 char:2
    + New-ADUser @user
    + ~~~~~~~~~~~~~~~~
      + CategoryInfo : PermissionDenied: (CN=Иванов Иван ...DC=domain,DC=local:String) [New-ADUser], UnauthorizedAccessException
    + FullyQualifiedErrorId : ActiveDirectoryCmdlet:System.UnauthorizedAccessException,Microsoft.ActiveDirectory.Management.Commands.NewADUser

    Запускаю скрипт под учёткой Enterprise Admins из PowerShell ISE. 

    Хотя я руками в оснастке могу создать пользователя.

    19 сентября 2014 г. 10:55
  • Перед Import-CSV добавить строчку:

    $cred = Get-Credential

    И изменить на:

    New-ADUser @user -Credential $cred -Server DOMAIN.LOCAL

    19 сентября 2014 г. 11:09
    Отвечающий
  • Скрипт отработал и создал пользователя!!!

    Но не заполнил поле User Logon Name а так же не подтянул Job Title и Department...

    19 сентября 2014 г. 11:33
  • Скрипт отработал и создал пользователя!!!

    Но не заполнил поле User Logon Name а так же не подтянул Job Title и Department...

    Скрипт все верно сделал, а то что Вы не можете правильно заполнить файл, тут уж к себе вопросы. Зачем в название поля добавлять в конец пробел(ДолжностьПРОБЕЛ;)? Поэтому для начала убрать пробелы из файла и привести к виду - ФИО;Должность;Департамент;Телефон

    User Logon Name - Т.е. скрипт сам должен додумать? Где-то об этом написано? Добавить поле в $user:

    $user = @{
          UserPrincipalName = $sam + ",@domain.com"

    • Помечено в качестве ответа Igor3000 22 сентября 2014 г. 5:11
    19 сентября 2014 г. 12:25
    Отвечающий
  • Замечательно!

    Извените если че не так


    22 сентября 2014 г. 5:11
  • Большое спасибо за скрипт. У меня не отрабатывает выдаёт ошибку:

    Нельзя вызвать метод для выражения со значением NULL.
    \Users.ps1:88 знак:19
    +     $f = $_.ФИО.split <<<< (" ")
        + CategoryInfo          : InvalidOperation: (split:String) [], RuntimeException
        + FullyQualifiedErrorId : InvokeMethodOnNull

    Тут было уже на это ошибка, но как исправить не понимаю.

    23 марта 2017 г. 10:02
  • Фраза "И убрать из csv пустые строки типа:" относится к вашей проблеме

    The opinion expressed by me is not an official position of Microsoft

    23 марта 2017 г. 10:08
    Модератор