简单的LDAP查询多个CN选择都不返回任何内容

时间:2017-05-02 17:57:48

标签: powershell filter ldap adsi

如果我运行它,它会正确返回:

$DirSearcher = New-Object System.DirectoryServices.DirectorySearcher([adsi]'')
$DirSearcher.Filter = '(&(objectClass=Computer) (cn=*dc*))'
$DirSearcher.FindAll().GetEnumerator() | sort-object { $_.Properties.name } `
| ForEach-Object { $_.Properties.name }

如果我用两个选项运行它就会失败:

$DirSearcher = New-Object System.DirectoryServices.DirectorySearcher([adsi]'')
$DirSearcher.Filter = '(&(objectClass=Computer) (cn=*dc*) (cn=*adm*))'
$DirSearcher.FindAll().GetEnumerator() | sort-object { $_.Properties.name } `
| ForEach-Object { $_.Properties.name }

如果我用OR运行它,它将返回所有计算机:

$DirSearcher = New-Object System.DirectoryServices.DirectorySearcher([adsi]'')
$DirSearcher.Filter = '(|(objectClass=Computer) (cn=*dc*) (cn=*adm*))'
$DirSearcher.FindAll().GetEnumerator() | sort-object { $_.Properties.name } `
| ForEach-Object { $_.Properties.name }

为了只搜索两个通配符名称,我在Filter部分中缺少什么?顺便说一句,如果我试图排除计算机,它似乎工作正常:

$DirSearcher = New-Object System.DirectoryServices.DirectorySearcher([adsi]'')
$DirSearcher.Filter = '(&(objectClass=Computer)(!(cn=*esx*)) (!(cn=*slng*)) (!(cn=*dcen*)) )'
$DirSearcher.FindAll().GetEnumerator() | sort-object { $_.Properties.name } `
| ForEach-Object { $_.Properties.name }

2 个答案:

答案 0 :(得分:2)

我找到了一种更简洁的方法:

Get-ADComputer -Filter { Name -like '*dc*' -or Name -like '*adm*'} | sort-object Name | select-object -ExpandProperty Name `
| Out-File -FilePath C:\Scripts\PI_Computers.txt

谢谢!

答案 1 :(得分:1)

仅适用于协议:

您的查询的正确LDAP过滤器是

(&(objectClass=Computer)(|(cn=*dc*)(cn=*adm*)))

但是你的解决方案更好(将预定义的Cmdlet用于默认任务总是更好)

再见