Организация учетных записей 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 ответа
Вы столкнулись с несколькими проблемами здесь
- Как сказал Веспер, вы ничего не передаете
Move-ADObject
следовательно ошибка, которую вы получаете $DisplayNames
это не строковый массив имен, а объект со свойством displayname. Что это-ExpandProperty
параметр для сSelect-Object
FYI.- Вы вытягиваете всех пользователей, но действительно хотите обработать определенных. Вместо
-Filter *
давайте использовать более целенаправленный подход. - Хотя это заманчиво, вы не можете гнездиться
-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, чтобы лучше отражать их содержание.