Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Параметр -Path в New-ADUser, как подставлять если структура AD большая. (http://forum.oszone.net/showthread.php?t=336985)

dyshes90 03-10-2018 10:25 2834090

Параметр -Path в New-ADUser, как подставлять если структура AD большая.
 
Товарищи, доброго времени суток.

Есть скрипт для добавления пользователя в AD. Структура AD очень большая, с большим количеством OU для пользователей в 4 и 5 колене.

Есть окно формы -

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

$form = New-Object System.Windows.Forms.Form
$form.Text = 'Новый сотрудник'
$form.Size = New-Object System.Drawing.Size(300,160)
$form.StartPosition = 'CenterScreen'

$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Point(40,70)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = 'OK'
$OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$form.AcceptButton = $OKButton
$form.Controls.Add($OKButton)

$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = New-Object System.Drawing.Point(170,70)
$CancelButton.Size = New-Object System.Drawing.Size(75,23)
$CancelButton.Text = 'Cancel'
$CancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$form.CancelButton = $CancelButton
$form.Controls.Add($CancelButton)

$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,20)
$label.Size = New-Object System.Drawing.Size(280,20)
$label.Text = 'Подразделение'
$form.Controls.Add($label)

$textBox = New-Object System.Windows.Forms.TextBox
$textBox.Location = New-Object System.Drawing.Point(10,40)
$textBox.Size = New-Object System.Drawing.Size(260,20)
$form.Controls.Add($textBox)


$form.Topmost = $true

$form.Add_Shown({$textBox.Select()})
$result = $form.ShowDialog()

if ($result -eq [System.Windows.Forms.DialogResult]::OK)
{
$x = $textBox.Text
$x
}

куда вводим название нужной OU, например UIT.GK, вот полный путь до нее в AD - ou=uit.gk,ou=ui,ou=users,ou=base,dc=domain,dc=ru

Далее есть переменная -

$SetOU = get-ADOrganizationalUnit -filter 'Name -like $x' -SearchScope 'Subtree' -SearchBase "ou=base,dc=domain,dc=ru"

Она вроде как находит OU, но не может подставить в параметр -Path

Ошибка - New-ADUser : Не удается преобразовать "System.Object[]" в тип "System.String", необходимый для параметра "Path". Указанный метод не поддерживается.

Впр логично, то, что объект не может преобразоваться в строку, поэтому прошу помощи, а то я завис =)

По любому, кто-то, да сталкивался. Как сделать правильно?

Kazun 03-10-2018 10:50 2834093

$SetOU - возращает несколько OU( "System.Object[]" - массив) , поэтому и ошибка. Указывайте более четкий фильтр.

dyshes90 03-10-2018 11:02 2834097

Kazun, да, Вы правы, почему-то двоит запись. Не понятно кстати почему.

Подскажите пожалуйста, какой более четкий фильтр чем 'Name -like $x', это же указание четкого имени OU в домене.

Kazun 03-10-2018 11:11 2834100

Цитата:

Цитата dyshes90
Kazun, да, Вы правы, почему-то двоит запись. Не понятно кстати почему.
Подскажите пожалуйста, какой более четкий фильтр чем 'Name -like $x', это же указание четкого имени OU в домене. »


1. Ограничить область действия или добавить в фильтр доп.параметр, скажем описание OU.
-SearchScope 'Subtree' -SearchBase "ou=base,dc=domain,dc=ru" - Ограничить область поиска

2. Придумать фильтр по свойствам
$SetOU = $SetOU | Where-Object {фильтр}

dyshes90 03-10-2018 11:44 2834104

Kazun, Вы знаете, дело в том, что у меня куча OU с одинаковыми названиями в разных подразделениях по местоположению, поэтому возвращается двойное значение, из-за этого и ошибка.

Подскажите, как через where-object выбрать именно то OU где находится Instance-сотрудник, т.е. сотрудник с которого я делаю копию нового.

Kazun 03-10-2018 11:49 2834106

Зачем тогда поиск OU,если у сотрудника уже есть путь.

Код:

$SetOU="CN=UserInstance,OU=MyComapny,OU=RU,DC=contoso,DC=com".split(",",2)[1]

dyshes90 03-10-2018 11:54 2834109

Путь есть, но он постоянно другой, так как сотрудники создаются в разных OU, через 2-3 колена друг от друга. Я не совсем понял выражение .split(",",2)[1]

Я думал, как бы выцепить у сотрудника образца значение атрибута "distinguishedName", в нем же указан полный путь, но что-то так и не разобрался. Это было бы вообще идеально.

Busla 03-10-2018 12:03 2834111

Цитата:

Цитата Kazun
Придумать фильтр по свойствам
$SetOU = $SetOU | Where-Object {фильтр} »

Оно же всё равно будет возвращать массив, но только из одного элемента. И всё-равно надо писать $SetOU[0]

dyshes90 03-10-2018 12:03 2834112

Kazun, Все, разобрался. Получилось еще лучше чем надо =)

Спасибо огромное за помощь!!!!! +10 в карму


Время: 00:49.

Время: 00:49.
© OSzone.net 2001-