关于Powershell:使用get-aduser过滤多个用户

Filtering multiple users with get-aduser

我是Powershell的新手,必须根据具有名称的列表从AD中获取用户。是否有任何方法可以使用类似于SQL中的语句从AD进行过滤? (从*的用户名中选择*,(" Joe"," Bill")?

就目前而言,我在foreach循环中获取用户并将其添加到arraylist中,但是我不知道这是否是一种好习惯:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

}


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

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

  • 更重要的是,它延续了人们普遍的误解,即Get-ADUser -Filter接受支持PowerShell语法的PowerShell脚本块,这是不正确的。这是一个误解,迟早会导致挫败感;简而言之:首先将-Filter参数构造为字符串,并知道这些过滤器字符串虽然类似于PowerShell语法,但使用AD提供程序特定的语法,该语法不仅受到更大的限制,而且即使对于运算符,其行为也有细微的不同与PowerShell中的名称相同-有关完整故事,请参见此答案。

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

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

有关基于正则表达式的-replace运算符的信息,请参见以下答案。

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

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

您可能希望将其放入函数中:

1
2
3
4
5
$dummydata = @('Bill','Joe','Sam')

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