【问题标题】:Selecting certain properties from an object in PowerShell从 PowerShell 中的对象中选择某些属性
【发布时间】:2015-04-21 14:13:17
【问题描述】:

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

【问题讨论】:

  • 如果您没有卡在 Windows XP 上,我鼓励您使用ActiveDirectory PowerShell 模块中的Get-ADUser,它是RSAT 的一部分。

标签: arrays powershell object select adsi


【解决方案1】:

每当使用 ADSI 时,我发现使用 .GetDirectoryEntry() 扩展返回的对象更容易

$ADSearchResults.GetDirectoryEntry() | ForEach-Object{
    $_.Name
    $_.Mail
}

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

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

来自 cmets 的更新

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

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

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

【讨论】:

  • 感谢马特,DirectoryEntry() 方法有效,它将所有值返回到屏幕,我遇到的困难是我希望 $SelectedValues 成为一个包含所有“邮件”和“名称”的对象' 它在目录中找到的所有 'Smiths' 的值
  • 再次感谢@Matt,效果很好:) 正是我想要的。认为我理解答案......了解 .NET 对象和方法是一个相当大的挑战
【解决方案2】:

您是否尝试过添加属性?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 2017-05-01
    • 2020-03-11
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多