从分组对象中提取电子邮件

时间:2015-06-15 22:54:32

标签: powershell

我有一些代码可以从AD中的OU中提取用户帐户。我正在使用Group-Object对其进行排序,因此我知道有多少用户使用相同的电子邮件地址。 在下面的代码中,$OuUser使用Get-ADUser,其中属性和过滤器设置为*

$Duplicates = $OUUser | Select samaccountname, mail,UserPrincipalName |
              Group-Object Mail

然后我有一个ForEach循环来完成$Duplicates,然后放入 数据输入另一个变量用于输出。

我想在这里实现的是将信息输出到CSV,因此我可以使用Excel进行报告。我希望组数据中只包含一封电子邮件,而不是其中包含{}@=个字符的表达式数据。

$NewData = New-Object PSObject
ForEach ($x in $Duplicates) {
    IF ($x.Count -gt 1 ) {
        $NewData | Add-Member -NotePropertyName Name($x.Name) -Force | Format-Table -AutoSize -Wrap
        $NewData | Add-Member -NotePropertyName Count($x.Count) -Force | Format-Table -AutoSize -Wrap
        $NewData | Add-Member -NotePropertyName Group($x.Group) -Force | Format-Table -AutoSize -Wrap

        $NewData
        #$Duplicates | Select Count, Name, Group 
    }
}

1 个答案:

答案 0 :(得分:1)

你的第二段代码伤害了我的大脑,但我认为你想要的是输出多个帐户使用相同的电子邮件地址,按电子邮件地址分组。所以,让我们从重复开始。你的第一段代码有点功能,但它确实收集了比你想要的更多的方式。您应该做的是在分配Where时通过$Duplicates语句管道该命令,以便它实际上只包含重复项。这应该适合你:

$Duplicates = $OUUser | Select samaccountname, mail,UserPrincipalName |
              Group-Object Mail | Where{$_.Count -gt 1}

所以,现在你只有一组分组对象中的重复项。您想要什么取决于您希望如何布置CSV。让我们以简单的方式执行此操作,每个电子邮件地址只有1行,其中包含电子邮件地址,使用它的帐户数以及以分号分隔的帐户名。

$Duplicates | Select Name,Count,@{l='Accounts';e={($_.Group|Select -Expand samaccountname) -join ';'}} | ExportTo-CSV C:\Path\To\Duplicates.csv -NoTypeInfo

这将选择组的Name(它们都按电子邮件地址分组,这是名称),该组中的Count个帐户,然后添加计算属性每个组的Group属性并从中扩展samaccountname属性,然后用分号连接这些帐户名。你的输出看起来像这样:

  

“名称”, “计数”, “帐户”
  “jim.smith@company.com”,“2”,“Jim Smith; Jims服务帐户”
  “arcgroup@company.com”,“3”,“行动反应创建DL; arcsrvcacct; arcReadOnly”