1

すべてのアカウントの名前に OU (またはサブ OU) が含まれているため、Active Directory アカウントを表示名に基づいて整理するスクリプトを動作させようとしています。PowerShell の ForEach ループ内の If ステートメントでこれを実行しようとしています。ただし、実行するたびに、アイデンティティを求め続けます。誰でもこれを修正するのを手伝ってもらえますか? これは私が持っているものです...

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}
}
4

2 に答える 2

0

ここでいくつかの問題が発生しています

  1. Vesperが言ったように、何も渡していないMove-ADObjectため、エラーが発生しています
  2. $DisplayNames名前の文字列配列ではなく、displayname プロパティを持つオブジェクトです。それがFYI-ExpandPropertyのパラメータです。Select-Object
  3. すべてのユーザーをプルしていますが、実際には特定のユーザーのみを処理したいと考えています。代わりに-Filter *、より的を絞ったアプローチを使用しましょう。
  4. 魅力的ですが、そのような条件をネストすることはできません-like。それを取得"*Supply*" -or "*Supplies*"して入力すると、true と評価されます。長さがゼロでないすべての文字列と同じです。

私たちが計画していることのために、これらすべての問題に対処する必要はありません。これを支援するには、パイプラインを使用する必要があります。分散の数によっては、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
}

new を追加することで、これに簡単にスケールできるはずです$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}
    }
}
于 2015-06-18T11:37:21.150 に答える