none
Помогите допилить скрипт создания пользователя в AD + mailbox. RRS feed

  • Вопрос

  • Доброго времени, коллеги!

    Сделал следующий скрипт, работает как надо, только потом понял, что такой трюк с OU (чтобы в csv вкладывать просто название OU), не пройдет, если OU находится не в корне домена. Можно ли доделать так, чтобы скрипт сам находил нужную OU, просто по ее имени?! :

    $user = Get-Content c:\user.csv | ConvertFrom-Csv -Del ","
    foreach ($u in $user) {
    $dn = $u."фамилия" + " " + $u."имя" + " " + $u."отчество"
    $upn = $u.login + "@domain.local"
    $ou = "ou=" + $u.ou +  ",dc=domain," + "dc=local"
    New-ADUser -Name $dn -Path $ou -GivenName $u.имя -AccountPassword (convertto-secureString "Abc123" -AsPlainText -Force) -ChangePasswordAtlogon $true -enabled $true -Department $u.отдел -DisplayName $dn -MobilePhone $u.мобильный -Office $u.office -OfficePhone $u.РабочийТелефон -SamAccountName $u.login -Surname $u.фамилия -Title $u.должность -UserPrincipalName $upn}
    foreach ($u in $user) { 
    Enable-Mailbox -Identity $u.login -Database $u.database}

    Поле в csv, выглядит соответственно как просто "Подрядчики".

    1. Как можно упростить ввод имени\пути OU в скрипт? 
    2. В переменной $DN, если не ввести отчество, получается пробел, который не допустим в значении переменной, что посоветуете тут?
    $dn = $u."фамилия" + " " + $u."имя" + " " + $u."отчество"
    Спасибо отвечающим! :)
    16 июня 2014 г. 5:46

Ответы

  • 1) OU
    
    $name = $u.ou
    $ou = Get-ADOrganizationalUnit -Filter "Name -eq '$name'"
    if(-not $ou) {
    	$ou = "cn=users,dc=contoso,dc=local"
    }
    
    2) В переменной $DN, если не ввести отчество, получается пробел, который не допустим в значении переменной, что посоветуете тут?
    
    $dn.Trim()

    • Помечено в качестве ответа Oleg.A 16 июня 2014 г. 8:11
    16 июня 2014 г. 6:04
    Отвечающий

Все ответы

  • 1) OU
    
    $name = $u.ou
    $ou = Get-ADOrganizationalUnit -Filter "Name -eq '$name'"
    if(-not $ou) {
    	$ou = "cn=users,dc=contoso,dc=local"
    }
    
    2) В переменной $DN, если не ввести отчество, получается пробел, который не допустим в значении переменной, что посоветуете тут?
    
    $dn.Trim()

    • Помечено в качестве ответа Oleg.A 16 июня 2014 г. 8:11
    16 июня 2014 г. 6:04
    Отвечающий
    1. Если он не находит OU, то тогда он берет дефолтный CN = users?
    2. Трим да, есть такое. Только не уверен, что тут он подходит, т.к. пробелы там указываются явно и они должны там быть, между Ф И и О. Т.е., если значение указано, то он нормально выдает пробелы между данными, но если нет значения, то в поле "Отчество" попадает лишь " " указанный в скрипте.

    • Изменено Oleg.A 16 июня 2014 г. 6:43
    16 июня 2014 г. 6:42
  • 1. Можно указать любой контейнер, тут для примера CN=Users(т.к. создан по умолчанию).

    2. Trim() - обрезает в начала и конце строки, а не в середине или между слов. Т.е. в данном случае можно применить TrimEnd() - только в конце и в обоих случаях, будут убраны два пробела " " + $u."отчество" ,если отчество отсутствует.

    PS > "a b c".Trim()
    a b c
    PS > "a b c ".Trim()
    a b c
    PS > "a b c ".length
    6
    PS > "a b c ".Trim().length
    5


    • Изменено KazunEditor 16 июня 2014 г. 6:48
    16 июня 2014 г. 6:47
    Отвечающий
    1. Очень подошло, супер, спасибо большое!
    2. Что странно. При выводе значения в строке, показывает все правильно:
    фамилия имя отчество
    1        2   
    
    $dn = $u."фамилия" + " " + $u."имя" + " " + $u."отчество"
    
    
    $dn.length
    3
    
    $dn.Trim().length
    2
    
    Но в самом скрипте, выдает ошибку "leading or trailing whitespace"...
    16 июня 2014 г. 7:06
  • $dm.Trim() - строку не изменяет,как был пробел,так и останется.

    Поэтому в команду New-ADUser подставляем $dn.Trim()  или $dn = $dn.Trim() и используем $dn.


    • Изменено KazunEditor 16 июня 2014 г. 7:09
    16 июня 2014 г. 7:09
    Отвечающий
  • Именно в строку выполнения и подставлял $dm.Trim(), только я упустил, что у меня это значение указывается дважды - Name и DisplayName, в любом случае добавив 

    $dn = $dn.Trim() 

    все получилось. Низкий поклон Kazun!

    16 июня 2014 г. 8:11