2016-08-16 100 views
0

一個微不足道的問題,但希望對那些知道的人來說真的很明顯。ADSI/System.DirectoryServices.DirectorySearcher結果解析

搜索構造函數:

$Search = New-Object System.DirectoryServices.DirectorySearcher 
(([adsi]"LDAP://ou=Domain Users,dc=example,dc=pri"),'(objectCategory=person)', 
('name','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]) } 

回答

0

只是刪除if聲明和過濾搜索結果:

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

感謝您的解決方法,並且將它作爲過濾器更好。 – Trix