Организация учетных записей Active Directory

Я пытаюсь заставить работать скрипт, который организует мои учетные записи в активном каталоге на основе их отображаемого имени, поскольку все наши учетные записи имеют свои OU в своем имени (или subOU). Я пытаюсь сделать это с помощью оператора If внутри цикла ForEach в PowerShell. Хотя каждый раз, когда я запускаю его, он постоянно спрашивает меня о личности. Может кто-нибудь помочь мне исправить это? Это то, что у меня есть...

Import-Module ActiveDirectory
$OU = "OU=Test, OU=com"
$Test1OU = "OU=Test1, OU=Test, OU=Com"
$Test2OU = "OU=Test2, OU=Test, OU=Com"

$Users = (Get-ADUser -SearchBase $OU -Filter * -Properties samAccountName,DisplayName)
ForEach ($user in $users)
{
If ($($user.DisplayName -like ("*Supply*" -or "*Supplies*"))
{Move-ADObject -Identity $($user.samAccountName -TargetPath $Test1OU}
ElseIf ($($user.DisplayName -like ("*Accounting*" -or "*Accountant*"))
{Move-AdObject -TargetPath $Test2OU}
}

2 ответа

Решение

Вы столкнулись с несколькими проблемами здесь

  1. Как сказал Веспер, вы ничего не передаете Move-ADObject следовательно ошибка, которую вы получаете
  2. $DisplayNames это не строковый массив имен, а объект со свойством displayname. Что это -ExpandProperty параметр для с Select-Object FYI.
  3. Вы вытягиваете всех пользователей, но действительно хотите обработать определенных. Вместо -Filter * давайте использовать более целенаправленный подход.
  4. Хотя это заманчиво, вы не можете гнездиться -like такие условия Если вы берете "*Supply*" -or "*Supplies*" и напечатайте, что это оценит как истинное. То же, что и все строки ненулевой длины.

Для того, что мы планируем делать, нам не придется решать все эти вопросы. Мы должны использовать конвейер, чтобы помочь с этим. В зависимости от того, сколько различий у вас есть что-то вроде оператора switch, может быть лучше, как описано ниже.

$supplyFilter = 'DisplayName -like "*Supply*" -or DisplayName -like "*Supplies*"'
$accountFilter = 'DisplayName -like "*Accounting*" -or DisplayName -like "*Accountant*"'

Get-ADUser -SearchBase $OU -Filter $supplyFilter -Properties displayName | Move-ADObject -TargetPath $Test1OU
Get-ADUser -SearchBase $OU -Filter $accountFilter -Properties displayName | Move-ADObject -TargetPath $Test2OU

Вы могли бы сойти с ума с этим и сделать пользовательский объект в цикле с фильтрами и целевыми парами, чтобы вам не нужно было повторять вызов командлета для каждого Get-ADuser пример.

$moves = @(
    @{
        Filter = 'DisplayName -like "*Supply*" -or DisplayName -like "*Supplies*"'
        OU = "OU=Test1, OU=Test, OU=Com"  
    },
    @{
        Filter = 'DisplayName -like "*Accounting*" -or DisplayName -like "*Accountant*"'
        OU = "OU=Test2, OU=Test, OU=Com"
    }
) | ForEach-Object{New-Object -TypeName PSCustomObject -Property $_}

ForEach($move in $moves){
    Get-ADUser -SearchBase $OU -Filter $move.Filter -Properties displayName | Move-ADObject -TargetPath $move.OU
}

Вы должны быть в состоянии легко масштабировать это, добавляя новые $moves, Это было бы лучше с PowerShell v3.0, но я не знаю, какая у вас версия.

Используя переключатель

Если вы хотите что-то ближе к тому, что у вас есть, я бы тогда предложил что-то подобное.

$Users = Get-ADUser -SearchBase $OU -Filter * -Properties DisplayName
ForEach ($user in $users){
    switch($user.DisplayName)  {
        ($_ -like "*Supply*" -or $_ -like "*Supplies*"){Move-ADObject -Identity $user -TargetPath $Test1OU}
        ($_ -like "*Accounting*" -or $_ -like "*Accountant*"){Move-ADObject -Identity $user -TargetPath $Test1OU}
    }
}

Я не могу проверить в настоящее время, но это должно сработать:

Import-Module ActiveDirectory

$OU = "OU=Test, OU=com"
$Test1OU = "OU=Test1, OU=Test, OU=Com"
$Test2OU = "OU=Test2, OU=Test, OU=Com"

$users = (Get-ADUser -SearchBase $OU -Filter * -Properties displayName)
foreach ($user in $users)
{
    if ($($user.displayName) -like "*Supply*" -OR $($user.displayName) -like "*Supplies*")){
        Move-ADObject -Identity $user -TargetPath $Test1OU
    }
    elseif ($($user.displayName) -like "*Accounting*" -OR $($user.displayName) -like "*Accountant*")) {
        Move-AdObject -Identity $user -TargetPath $Test2OU
    }
}

Я добавил параметр идентификации в Move-ADObject Также я изменил некоторые имена var, чтобы лучше отражать их содержание.

Другие вопросы по тегам