powershell 使用get-aduser过滤多个用户

qgelzfjb  于 2023-04-12  发布在  Shell
关注(0)|答案(3)|浏览(162)

我是PowerShell的新手,必须根据名称列表从AD中获取用户。有没有什么方法可以使用类似于SQL中的in-statement的东西从AD中筛选用户?(select * from users where name in('Joe','Bill)?
至于现在,我在foreach循环中获取用户并将其添加到数组列表中,但我不知道这是否是一个好的实践:

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

}
hivapdat

hivapdat1#

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

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

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

jq6vz3qz2#

mjolinor's answer是优雅的,可以工作,但是使用 * 脚本块 * 是有问题的,原因有两个:

  • 这是 * 不必要的 *,因为脚本块在传递给Get-ADUser -Filter时总是会被转换回 * 字符串 *。
  • 更重要的是,它延续了广泛的误解,即Get-ADUser -Filter接受支持 PowerShell语法 * 的PowerShell * 脚本块 ,这是 * 不 * 真;这是一种误解,迟早会导致挫折;简而言之:-Filter参数构造为以开始的 * 字符串 *,并且知道这些过滤器字符串虽然 * 类似于 * PowerShell语法,但使用 AD-provider-specific 语法**,这不仅限制更多,而且即使与PowerShell中同名的运算符的行为也有细微的不同-请参阅this answer了解完整的故事。

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

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"
wi3ka0sx

wi3ka0sx3#

虽然我在精神上同意mklement0,但脚本块相对于单引号字符串有以下两个优点。
1.该值可以有单引号(如在D'Sean中),甚至可以有双引号,而无需转义引号。
1.语法突出显示。

相关问题