从 PowerShell 中的对象中选择某些属性

Selecting certain properties from an object in PowerShell

ADSI 查询工作正常,它 return 多个用户。

我想 select 'name' 和 'email' 来自 returned 的每个对象。

$objSearcher = [adsisearcher] "()"
$objSearcher.searchRoot = [adsi]"LDAP://dc=admin,dc=domain,dc=co,dc=uk"
$objSearcher.Filter = "(sn=Smith)"
$ADSearchResults = $objSearcher.FindAll()

$SelectedValues = $ADSearchResults | ForEach-Object { $_.properties | Select -property mail, name }

$ADSearchResults.properties.mail 给我邮箱地址

当我省略 'select -properties' 时,它将 return 所有属性,但尝试 select 某些属性返回时只有空值。

每当使用 ADSI 时,我发现使用 .GetDirectoryEntry()

扩展返回的对象更容易
$ADSearchResults.GetDirectoryEntry() | ForEach-Object{
    $_.Name
    $_.Mail
}

注意:这样做可以让您访问实际对象。因此可以更改这些值并使用 $_.SetInfo() 之类的内容完成更改。这本来是一个警告,但不会导致仅读取值的问题。

注意 Bacon Bits 的评论以及他已删除的答案。如果可用并且您正在使用 Active Directory,您应该使用 Get-Aduser

根据评论更新

部分问题是所有这些属性都不是字符串,而是 System.DirectoryServices.PropertyValueCollections。我们可能需要将该数据输出到自定义对象中?让我们试试这个。

$SelectedValues = $ADSearchResults.GetDirectoryEntry() | ForEach-Object{
    New-Object -TypeName PSCustomObject -Property @{
        Name = $_.Name.ToString()
        Mail = $_.Mail.ToString()
    }
}

这种简单的方法使用每个对象 toString() 方法将数据从对象中分离出来。请注意,虽然这适用于这些属性,但对其他属性使用 if 时要小心,它可能不会显示正确的结果。实验和调试!

您尝试过添加属性吗?

$objSearcher.PropertiesToLoad.Add("mail")
$objSearcher.PropertiesToLoad.Add("name")