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 ') |
有关基于正则表达式的
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 |