我是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
}
答案 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"