我是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
}
3条答案
按热度按时间hivapdat1#
你可能会想把它放到一个函数中:
jq6vz3qz2#
mjolinor's answer是优雅的,可以工作,但是使用 * 脚本块 * 是有问题的,原因有两个:
Get-ADUser -Filter
时总是会被转换回 * 字符串 *。Get-ADUser -Filter
接受支持 PowerShell语法 * 的PowerShell * 脚本块 ,这是 * 不 * 真;这是一种误解,迟早会导致挫折;简而言之:将-Filter
参数构造为以开始的 * 字符串 *,并且知道这些过滤器字符串虽然 * 类似于 * PowerShell语法,但使用 AD-provider-specific 语法**,这不仅限制更多,而且即使与PowerShell中同名的运算符的行为也有细微的不同-请参阅this answer了解完整的故事。因此,使用字符串操作来构造您的过滤器:
有关基于正则表达式的
-replace
运算符的信息,请参见this answer。-Filter
参数计算为以下字符串文字,这是AD提供程序最终看到的内容:wi3ka0sx3#
虽然我在精神上同意mklement0,但脚本块相对于单引号字符串有以下两个优点。
1.该值可以有单引号(如在D'Sean中),甚至可以有双引号,而无需转义引号。
1.语法突出显示。