7

I'm new to powershell and have to fetch users from AD based on a list with names. Is there any way to filter from AD using something similar to an in-statement in SQL? (select * from users where name in ('Joe','Bill)?

As for now I fetch users in a foreach loop and add them to an arraylist, but I don't know if this is good practice:

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 的回答很优雅且有效,但使用脚本块存在问题,原因有两个:

  • 这是不必要的,因为脚本块在传递给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 回答