需要列表中的每个名称来查询活动目录

时间:2015-05-06 20:09:10

标签: string powershell foreach split line

为什么这只显示最后一个对象而不是每个循环都显示所有对象?

$str = @"
First1 Last1
First2 Last2
First3 Last3
First4 Last4
"@

foreach ($line in $str.Split("`n")) {
    $userOBJ = Get-ADUser -Filter {Name -like $line} 
    $userOBJ
}

输出只有一条记录。

DistinguishedName : CN=First Last,OU=BLAH and BLAH,OU=BLAH BLAH,DC=corp,DC=domain,DC=com
Enabled           : True
GivenName         : First
Name              : First Last
ObjectClass       : user
ObjectGUID        : XXXXXX-XXXXXXXXX
SamAccountName    : useranme
SID               : XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Surname           : Last
UserPrincipalName : username@comain.com

2 个答案:

答案 0 :(得分:2)

试试这个:

$str = @"
First1 Last1
First2 Last2
First3 Last3
First4 Last4
"@

#Split your string and remove empty/null values.
$Names = $str.Split("`r`n") | ? { $_ }

#Make one filter request with all your names.
$Filter = "Name -like '$($Names -Join "' -or Name -like '")'"

Get-ADUser -Filter $Filter

使用多个过滤器向AD发出一个请求将提高域控制器的速度和开销。

澄清如何创建过滤器

如果想要构建包含多个搜索结果的长过滤器,则需要以这种方式格式化过滤器:

$Filter = "Name -Like 'First1 Last1' -or Name -Like 'First2 Last2' -or Name 'First3 Last3' -or Name -Like 'First4 Last4'"

最简单的方法是使用数组中每个值之间的任何内容进行连接。在这种情况下,' -or Name -Like '位于$ Names中的每个值之间。

$JoinResult = $Names -Join "' -or Name -Like '"

$ JoinResult -eq:

First1 Last1' -or Name -Like 'First2 Last2' -or Name 'First3 Last3' -or Name -Like 'First4 Last4

下一步是关闭它...(该过滤器字符串的开头和结尾)您希望过滤器以Name -Like '开头,并以尾随'

结束
$Filter = "Name -Like '$JoinResult'"

在一行中完成所有这些是:

$Filter = "Name -like '$($Names -Join "' -or Name -like '")'"

答案 1 :(得分:0)

foreach ($line in $str -Split('\r\n')) {
Get-ADUser -Filter {Name -eq $line} 
}

添加-Split和\ r修复了我的问题。感谢@gbabu和@Bacon Bits带领我朝着正确的方向前进。