String 需要列表中的每个名称才能查询active directory
为什么这只显示最后一个对象,而不是每个循环的所有对象String 需要列表中的每个名称才能查询active directory,string,powershell,foreach,split,line,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=BLA
$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
试试这个:
$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'"
最简单的方法是使用数组中每个值之间的任何值进行联接。在本例中,“”-或类似名称的“
位于$Names中的每个值之间
$JoinResult = $Names -Join "' -or Name -Like '"
$JoinResult-等式:
First1 Last1' -or Name -Like 'First2 Last2' -or Name 'First3 Last3' -or Name -Like 'First4 Last4
下一步是结束它。。(该筛选器字符串的开始和结束)您希望筛选器以名称开头,如“
”,以结尾的”
$Filter = "Name -Like '$JoinResult'"
在一行中完成所有这些是:
$Filter = "Name -like '$($Names -Join "' -or Name -like '")'"
添加-Split和\r修复了我的问题。感谢@gbabu和@Bacon Bits为我指引了正确的方向。可能是Windows行尾。尝试
Get ADUser-Filter{Name-like$line.Trim()}
或者,尝试$str.Split(`r`n”)
.Get ADUser:Property:'Trim'未在类型为:'System.String'的对象中找到。只需在事实之后添加注释,.Trim()
方法可以很好地工作,如果您使用子表达式,例如:Get ADUser-Filter{Name-like$($line.Trim())}
好奇,你能解释一下这个代码吗'$($Names-Join''-或Name-like')
您需要以下sting模式:(Name-like'$Name')-或(Name-like'
$Name')-或(Name-like'
$Name')等等。。你看到图案了吗?因此,将$names中的每个$name与中间的这个模式连接起来,就形成了一个漂亮的大过滤器字符串……)美妙之处在于,如果$names中只有一个名称,它不会将模式放在两者之间,只需输出$name..OIC如果名称在列表中有前导或尾随空格或名称?像First-Last先生或First-Last Jr.我走对了吗?那么你是在寻找字符串内部的模式吗?更新了我的答案,逐步介绍了如何从数组构建长筛选查询。希望这有帮助。
foreach ($line in $str -Split('\r\n')) {
Get-ADUser -Filter {Name -eq $line}
}