【问题标题】:Filtering multiple users with get-aduser使用 get-aduser 过滤多个用户
【发布时间】:2013-02-22 11:21:05
【问题描述】:

我是 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

}

【问题讨论】:

标签: powershell active-directory


【解决方案1】:

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

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

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

【讨论】:

  • 我从未见过在过滤器中使用 foreach,通常我使用它为每个用户运行一个 get-aduser。你能解释一下这是如何工作的吗?不确定 -join 和 -or 实际在做什么。
  • @Jessie:foreach[-object] 仅用于从输入字符串数组构造转换后的字符串数组(将它们嵌入到每个简单的过滤器表达式中),然后-join 加入简单的使用-or 过滤以形成复合表达式。生成的单个字符串被传递给[scriptblock]::Create()
【解决方案2】:

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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多