Powershell は値と配列で異なる動作をしますか?

Powershell は値と配列で異なる動作をしますか?

Powershell を使用して Active Directory から情報を取得しようとしていますが、奇妙な動作が発生します。これが私のスクリプトです:

$toFind = ( 'bobjones', 'samsmith' )

filter Get-AdUser {
    $strFilter = "(&(objectCategory=User)(sAMAccountName=$_))"

    $objDomain = New-Object System.DirectoryServices.DirectoryEntry
    $objSearcher = New-Object System.DirectoryServices.DirectorySearcher
    $objSearcher.SearchRoot = $objDomain
    $objSearcher.PageSize = 1000
    $objSearcher.Filter = $strFilter

    $colProplist = ("name", "department")
    foreach ($i in $colPropList){$objSearcher.PropertiesToLoad.Add($i)}

    ($objSearcher.FindAll() | %{$_.Properties})
}

"paul" | get-aduser # Works
$toFind | get-aduser # Doesn't work?!

前者は期待どおりのプロパティのテーブルを出力します。後者は結局「0 1」を繰り返し出力しますが、その理由はよくわかりません。単一のケースは機能するのに、配列は機能しないのはなぜでしょうか。

答え1

フォレスト全体を検索したいので、グローバルカタログをクエリする必要があります。いくつかの方法がありますが、最も簡単なのは検索ルートをGCに変更することです。例:

$objSearcher.SearchRoot = [ADSI]"GC://$($objDomain.Name)" 

あるいは、フォレストをクエリしてグローバル カタログのリストを要求し、そのうちの 1 つを最初のディレクトリ エントリとして使用することもできますが、これは、検索するフィールドが GC 内にある限り、必要な操作を実行する簡単な変更です。デフォルトではグローバルであるユーザー名で検索しているため、検索部分は問題にならないはずですが、Department はデフォルトではグローバルではないため、検索結果から Department フィールドは返されません。それを取得するには、検索結果の識別名を使用して、完全な AD ユーザー オブジェクトのユーザー ドメインに対して後続の AD 検索を実行し、そこから Department を取得する必要があります。Department がグローバルになるようにスキーマを変更することもできますが、それは少し過激だと思います。

包括的なリストは以下からご覧いただけます。デフォルトのグローバル属性はここにあります。

答え2

foreach ($user in $toFind) { get-aduser $user } のような foreach ループを指定する必要があるかもしれません。

プロンプトで単に $toFind と入力するとどうなりますか? 両方の名前が 1 行に 1 つずつリストされると思います。

同じコードをADに対して実行してみたところ、次の結果が得られました: 0 1

名前 値 ---- ----- name {Sahnti L. Aphil} adspath {LDAP://CN=Sahnti L. Aphil,OU=Users,OU=Jackson,DC=company,DC=local} 0 1 name {Hamong Justice} adspath {LDAP://CN=Hamong Justice,OU=Users,OU=Jackson,DC=company,DC=local}

答え3

補足ですが、Quest ADコマンドレットパッケージ(http://www.quest.com/powershell/activeroles-server.aspx) は、すべての AD 関連 PowerShell の機能に使用できます。PowerShell に組み込まれている AD サポートがかなり貧弱なので、これで穴を埋めることができます。これにより、開発時間を大幅に節約できます。

答え4

ちなみに、0 と 1 の出力が得られる理由は、$objSearcher.PropertiesToLoad.Add() の呼び出しが、追加されたプロパティのインデックス (最初のプロパティの場合は 0、2 番目のプロパティの場合は 1) を返すためです。これは、スクリプト内のユーザーごとに 1 回発生します。戻り値を Out-Null にパイプすることで、戻り値を抑制できます。

関連情報