【问题标题】:Query only non-null value and rename the fields?只查询非空值并重命名字段?
【发布时间】:2016-04-02 16:05:53
【问题描述】:

这是我想要做的:

  1. 在AD中查询几个属性,只列出DisplayName不为空的那个。
  2. 保存到 CSV 并查询所有字段
  3. 删除 CSV 文件的第一行,然后重命名所有列名。

这是我目前拥有的:

Get-AdUser -Filter * -Properties DisplayName, Memberof |
  select DisplayName, Memberof |
  Export-Csv ********

以下是问题:

  1. MemberOf 字段显示在以下但现在是真实组名:

    Microsoft.ActiveDirectory.Management.ADPropertyValueCollection
    
  2. 我似乎找不到将列名替换为我希望将其称为“名称”、“组”等的方法。

  3. csv 文件的第一行包含以下内容:

    #TYPE Selected.Microsoft.ActiveDirectory.Management.ADUser
    

有没有办法快速解决这个问题?

【问题讨论】:

    标签: csv powershell active-directory


    【解决方案1】:

    这里要学习的关键概念之一是calculated properties。这让您可以在 Select 时即时修改数据,使其对您在脚本中的总体目标(无论是什么)更有用。

    所以对于你的问题:

    1. 这是因为memberOf 不是一个简单的字符串,它有自己的.NET 类型Microsoft.ActiveDirectory.Management.ADPropertyValueCollection。要扩展该值,请在 select 语句中使用此计算属性

      select displayName, @{name="MemberOf"; expression={$_.memberof -join ";"}}
      
    2. 同样,您可以使用计算属性。假设您想将“显示名称”更改为“显示名称:。您将使用类似:

      select @{name="Display Name";expression={$_.displayName}}, @{name="MemberOf"; expression={$_.memberof -join ";"}}
      
    3. 导出 CSV 以删除开头的 #TYPE 声明时,将 -NoTypeInformation 参数添加到您的 Export-Csv cmdlet。所以:

      Export-csv -NoTypeInformation "myfile.csv"
      

    此外,如果您只希望用户的 displayName 不为空,则可能需要更改初始 Get-AdUser 上的过滤器。比如:

    Get-AdUser -Filter {DisplayName -ne ''} -Properties DisplayName, Memberof
    

    【讨论】:

    • 您好,除了最后一个之外,您提供的所有内容都是正确的……它给了我 Get-AdUser -Filter {$_.DisplayName -ne ''} 的错误。知道为什么吗?
    • 抱歉,我认为我在不需要的时候使用了this 关键字。我编辑了我的回复,但尝试改用-Filter {DisplayName -ne ''}(注意我删除了$_.
    • PS C:\Windows> Get-AdUser -Filter {DisplayName -ne ''} -Properties DisplayName, Memberof Get-AdUser : 无法识别搜索过滤器 At line:1 char:1 + Get -AdUser -Filter {DisplayName -ne ''} -Properties DisplayName, Memberof + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [Get -ADUser], ADException + FullyQualifiedErrorId : 无法识别搜索过滤器,Microsoft .ActiveDirectory.Management.Commands.GetADUser
    • 我认为它不喜欢双单引号,这不是那么快,但它应该可以工作。抱歉,无法对此进行测试,无法再访问 AD 环境,但我认为它应该可以工作:Get-AdUser -Filter * -Properties DisplayName, Memberof | Where{ -not ([string]::IsNullOrEmpty($_.DisplayName)) } | Select ...
    • 你也可以试试Get-AdUser -Filter {DisplayName -like "*"}
    【解决方案2】:

    还发现了这个 QUEST AD 工具包。从戴尔网站下载它,然后只需添加-PASSnapin Quest.ActiveRoles.ADManagement。这让我们更容易查询任何广告相关数据。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 2016-02-28
    • 2011-04-26
    • 1970-01-01
    • 2020-07-08
    相关资源
    最近更新 更多