使用get-aduser过滤多个用户

Tho*_*s B 5 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

}
Run Code Online (Sandbox Code Playgroud)

mjo*_*nor 5

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

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

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


mkl*_*nt0 5

mjolinor 的回答优雅且有效,但脚本块的使用存在问题,原因两个:

  • 这是不必要的,因为脚本块将总是被转换回一字符串时,它被传递给Get-ADUser -Filter

  • 更重要的是,它延续了广泛的误解,即Get-ADUser -Filter接受支持PowerShell 语法的PowerShell脚本块,这是正确的;这是一种迟早会导致挫折的误解;简而言之:将您的-Filter参数构造为以 开头的字符串,并知道这些过滤字符串虽然类似于PowerShell 语法,但使用AD 提供程序特定的语法,这不仅受到更多限制,而且即使使用相同的运算符,其行为也略有不同PowerShell 中的名称 - 请参阅此答案以了解完整故事。

因此,使用字符串操作来构建您的过滤器

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

有关基于正则表达式的-replace运算符的信息,请参阅此答案

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

GivenName -eq "Bill" -or GivenName -eq "Joe" -or GivenName -eq "Sam"
Run Code Online (Sandbox Code Playgroud)