使用get-aduser过滤多个用户

时间:2013-03-07 10:03:10

标签: powershell active-directory

我是PowerShell的新手,必须根据名称列表从AD中获取用户。有没有办法使用类似于SQL中的in-statement来过滤AD? (从名为('Joe','Bill)的用户中选择*?

至于现在我在foreach循环中获取用户并将它们添加到arraylist中,但我不知道这是否是一个好习惯:

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

}

2 个答案:

答案 0 :(得分:4)

你可能想把它放到一个函数中:

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

$filter = 
[scriptblock]::create(($dummydata| foreach {"(GivenName -eq '$_')"}) -join ' -or ')
Get-ADUser -f $filter

答案 1 :(得分:2)

mjolinor's answer优雅且有效,但是使用脚本块存在问题,原因有两个:

  • 这是不必要,因为脚本块在传递给Get-ADUser -Filter时总是会转换回 string

  • 更重要的是,它使人们普遍误解Get-ADUser -Filter接受支持 PowerShell语法的PowerShell 脚本块 >不是为真;这是一个误解,迟早会导致挫败感;简而言之:将您的-Filter参数构造为以字符串开头的,并知道这些过滤器字符串同时相似 PowerShell语法,使用 AD-provider-specific 语法,该语法不仅受到更多限制,而且即使使用与PowerShell中同名的运算符,其行为也会有所不同-参见{{3} }。

因此,使用字符串操作来构造过滤器

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

有关基于正则表达式的-replace运算符的信息,请参见this answer

-Filter参数的计算结果为以下字符串文字,这是AD提供程序最终看到的内容:

GivenName -eq "Bill" -or GivenName -eq "Joe" -or GivenName -eq "Sam"