ADSI/System.DirectoryServices.DirectorySearcher 结果解析

ADSI/System.DirectoryServices.DirectorySearcher result parsing

一个微不足道的问题,但希望对于那些知道的人来说真的很明显。

搜索构造函数:

$Search = New-Object System.DirectoryServices.DirectorySearcher
(([adsi]"LDAP://ou=Domain Users,dc=example,dc=pri"),'(objectCategory=person)',
('name','employeeID'))

我想排除不存在 employeeID 属性的结果。

这个有效:

$users = $Search.FindAll()
ForEach ($u in $users) {
    If ($u.properties.employeeid) {
        Write-Host $($u.properties.name)
    }
}

以下不起作用 - 无输出。但是,当省略 IF 语句时,会输出结果。

ForEach ($user in $($Search.FindAll())) {
    If ($user.properties.employeeID) {
        Write-Host $($user.properties.name)
    } 
}

第二个示例中的语法问题,还是我只需要在 运行 条件语句之前将结果临时存储在对象中?

(为了避免任何关于为什么不使用 ActiveDirectory 模块和 Get-ADUser 的讨论,它适用于不能在其工作站上安装该模块的用户,也不能被授予通过主机上的 PSSession 调用它的权限它已安装。)

更新: 找到了一个更好的方法来处理 where 子句:

$searcher.FindAll() | where { ($_.properties['employeeid'][0]) }

只需删除 if 语句并过滤搜索结果:

$users = $Search.FindAll() | Where-Object {-not [string]::IsNullOrEmpty($_.properties.employeeID)}