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

时间:2015-04-21 14:13:17

标签: arrays powershell object select adsi

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

我想从返回的每个对象中选择“名称”和“电子邮件”。

$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'时,它将返回所有属性,但是尝试选择某些属性时只返回空值。

2 个答案:

答案 0 :(得分:2)

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

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

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

听取培根比特的评论以及他删除的答案。如果可用,则应使用Get-Aduser并使用Active Directory。

从评论中更新

部分问题是所有这些属性都不是字符串而是System.DirectoryServices.PropertyValueCollection。我们需要将数据输出到自定义对象中吗?让我们尝试一下。

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

这种简单的方法使用每个对象toString()方法来打破对象的数据。请注意,虽然这适用于这些属性,但要小心使用if for other,它可能无法显示正确的结果。实验和调试!

答案 1 :(得分:1)

您是否尝试过添加属性?

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