【问题标题】:Export-Csv doesn't show AD group name while exporting its membersExport-Csv 在导出其成员时不显示 AD 组名称
【发布时间】:2019-06-04 11:59:26
【问题描述】:

我有一个 CSV 文件中包含 AD 组的列表:Input_ADGroup.csv A 列如下所示:

CN  
ADgroup1  
ADgroup2

我已经有一些代码列出了 output.csv 文件中组的所有用户,但是我缺少 ADgroup 名称。所以不清楚哪些用户属于哪个组。

$Manager = @{Name = "Manager"; Expression = {%{(Get-ADUser $_.Manager -Properties DisplayName).DisplayName}}}
$Manager_Location = @{Name = "Manager_Location"; Expression = {%{(Get-ADUser $_.Manager -Properties Office).Office}}}
$Fields = @(
'SamAccountName'
'CN'
'DisplayName'
'Office'
'mail'
'Department'
$Manager
$Manager_Location
)

Import-Csv -Path H:\Test\Input_ADGroup.csv | 
ForEach-Object {
    Get-ADGroup -Filter "CN -eq '$($_.CN)'" -Properties * -ErrorAction SilentlyContinue |
    Get-ADGroupMember | Get-ADUser -properties * | Select $Fields
} | Export-Csv -Path H:\Test\Output_ADGroup.csv -NoTypeInformation
H:\Test\Output_ADGroup.csv

那么是否有可能获得一个显示“source-ADgroup”的列...或另一种格式,它使用 ADGroup 名称或其他东西打破列表?

【问题讨论】:

    标签: powershell


    【解决方案1】:

    IMO 我的另一个建议的解决方案是更有效地从输入中应用相同的 CN:

    $Data = ForEach($CN in (Import-Csv -Path H:\Test\Input_ADGroup.csv).CN) {
       Get-ADGroup -Filter "CN -eq '$CN'" -Properties CN -ErrorAction SilentlyContinue |
          Get-ADGroupMember | Get-ADUser -Properties * | Select-Object ($Fields+@{n="Group";e={$CN}})
    }
    $Data
    $Data | Export-Csv -Path H:\Test\Output_ADGroup.csv -NoTypeInformation
    

    【讨论】:

    • 太好了,效果更好,因为它现在只显示组名(没有 OU=...等)。 2个问题:1:为什么/是什么让它更有效率? 2:是否有理由在底部 2 行运行两次 $Data?不过还是谢谢 :-)
    • 效率更高的从输入中应用 CN 而无需进一步努力。第一个$Data 用于输出显示,第二个用于存储。
    【解决方案2】:

    由于您已经在 $_ 中拥有 AD 组名称,因此您可以通过更改以下内容向您的 Select-Object 添加另一个计算属性:

    Get-ADGroup -Filter "CN -eq '$($_.CN)'" -Properties * -ErrorAction SilentlyContinue |
    Get-ADGroupMember | Get-ADUser -properties * | Select $Fields
    

    对此(将第一个组名保存到变量中,以免与稍后在管道中使用的$_ 混淆):

    $GroupName = $_.CN
    
    Get-ADGroup -Filter "CN -eq '$($_.CN)'" -Properties * -ErrorAction SilentlyContinue |
    Get-ADGroupMember | Get-ADUser -properties * | Select ($Fields+@{n="Group";e={$GroupName}})
    

     

    感谢 @LotPings 和 @Maikel 指出 cmets 中 $_ 使用不正确的问题


    注意:请记住括号,否则您会收到如下错误:

    Select-Object : 找不到接受参数 n="Group";e={$GroupName}

    的位置参数

    【讨论】:

    • 嗨 Robdy,不幸的是,您提到的 $_.CN 可能指向 Get-ADUser 部分中的 CN:它显示的是用户 CN,而不是 Group CN。
    • 但是在最后一个管道阶段,$_.CN 不会引用 ADUser 属性吗?所以要么使用-Pipelinevariable,要么将ForEach-Object 更改为foreach($item in Import-csv...)
    • @LotPings 你是对的,我在我身边复制它,显然我不是 100% 严格的。已解决。
    • @Maikel - 你是对的,我编辑了我的答案来解决这个问题
    • @LotPings 和 @robdy - 以下是成功的秘诀:Get-ADGroup -Filter "CN -eq '$($_.CN)'" -Properties CN -PipelineVariable nameSelect ($Fields+@{n="Group";e={$name}})。所以非常感谢
    【解决方案3】:

    @Lotpings @robdy - 感谢您的意见,非常感谢。见下面的代码

    Import-Csv -Path H:\Test\Input_ADGroup.csv | 
    ForEach-Object {
        Get-ADGroup -Filter "CN -eq '$($_.CN)'" -Properties CN -PipelineVariable name -ErrorAction SilentlyContinue |
        Get-ADGroupMember | Get-ADUser -properties * | Select ($Fields+@{n="Group";e={$name}})
    } | Export-Csv -Path H:\Test\Output_ADGroup.csv -NoTypeInformation
    H:\Test\Output_ADGroup.csv
    

    最后一点:AD 组显示为 CN=Groupname,OU=...OU=...等
    我无法让它只显示“组名”,但​​这确实不是问题。

    【讨论】:

    • Select ($Fields+@{n="Group";e={$name.name}}) 会给出组名
    猜你喜欢
    • 2013-10-27
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 2021-06-05
    • 1970-01-01
    • 2020-11-11
    相关资源
    最近更新 更多