如果我运行它,它会正确返回:
$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 }
答案 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用于默认任务总是更好)
再见