7

私はPowerShellを初めて使用し、名前のリストに基づいてADからユーザーを取得する必要があります。SQLのinステートメントに似たものを使用してADからフィルタリングする方法はありますか?(('Joe'、'Bill)の名前のユーザーから*を選択しますか?

今のところ、foreachループでユーザーをフェッチし、それらを配列リストに追加しますが、これが適切な方法かどうかはわかりません。

function GetUsers()
{
$dummydata = @('Bill','Joe','Sam')
$users = New-Object System.Collections.ArrayList($null)

foreach($user in $dummydata)
{
 $aduser = get-aduser -f {GivenName -eq $user} -Properties * | select *
  $users.add($aduser) | Out-Null
}

Return ,$users

}
4

2 に答える 2

5

あなたはおそらくこれを関数に入れたいと思うでしょう:

$dummydata = @('Bill','Joe','Sam')

$filter = 
[scriptblock]::create(($dummydata| foreach {"(GivenName -eq '$_')"}) -join ' -or ')
Get-ADUser -f $filter
于 2013-03-07T11:34:08.080 に答える
5

mjolinorの答えはエレガントで機能しますが、スクリプトブロックの使用には2つの理由で問題があります。

  • スクリプトブロックは、に渡されるときに常に文字列に変換されるため、不要です。Get-ADUser -Filter

  • さらに重要なことに、PowerShell構文をサポートするPowerShellスクリプトブロックを受け入れるという誤解が広まっていますが、これは真実ではありませんGet-ADUser -Filter。遅かれ早かれ欲求不満につながるのは誤解です。つまり、引数をで始まる文字列として作成-Filterし、これらのフィルター文字列がPowerShell構文に似ている一方で、 ADプロバイダー固有の構文を使用することを知ってください。これは、はるかに制限されているだけでなく、同じ演算子を使用しても動作が微妙に異なります。 PowerShellの場合と同じように名前を付けます-詳細については、この回答を参照してください。

したがって、文字列操作を使用してフィルターを作成します

Get-AdUser -Filter ('Bill', 'Joe', 'Sam' -replace 
                      '^.*', 'GivenName -eq "$&"' -join ' -or ')

正規表現ベースの-replace演算子については、この回答を参照してください。

引数は次の文字列リテラルに評価されます。-Filterこれは、ADプロバイダーが最終的に認識するものです。

GivenName -eq "Bill" -or GivenName -eq "Joe" -or GivenName -eq "Sam"
于 2018-11-07T20:14:57.287 に答える