如何修改PowerShell脚本提取AD组用户所有SMTP地址至单列
解决PowerShell提取AD用户所有SMTP地址到单列的问题
嗨,我来帮你搞定这个问题!你的原脚本思路是对的,但有几个小细节没处理好,导致看起来只提取了第一个SMTP地址,咱们一步步修正:
先分析原脚本的问题
- 前缀替换不彻底:你用了
-replace 'smtp:',但AD里的主邮箱地址是大写SMTP:开头的,别名是小写smtp:,这个替换只会去掉小写前缀,大写的会保留,可能让你误以为只拿到了第一个地址。 - 分隔符不合理:
"rn';"`这种分隔符会在地址里插入多余的单引号和分号,导致CSV格式混乱,查看的时候容易出错。 - 缺少编码设置:导出CSV时没指定编码,遇到特殊字符可能乱码。
方案1:每个用户的所有SMTP地址放在同一单元格(单列换行)
如果希望每个用户的所有邮箱地址都在CSV的同一单元格里,每个地址单独一行,用这个脚本:
Get-ADGroupMember -Identity "EDL_ProEquities Smarsh" -Recursive | Get-ADUser -Properties ProxyAddresses | Select-Object @{ Name = "ProxyAddresses" Expression = { # 筛选所有SMTP开头的地址(不区分大小写),移除前缀后换行分隔 $_.ProxyAddresses | Where-Object { $_ -match '^smtp:' } | ForEach-Object { $_ -replace '^smtp:', '', 'IgnoreCase' } | -join "`n" } } | Export-Csv -Path "c:\temp\EDL.csv" -NoTypeInformation -Encoding UTF8
注意:
打开CSV后,在Excel里选中ProxyAddresses列,右键选择「设置单元格格式」→「对齐」→勾选「自动换行」,就能看到所有地址了。
方案2:每个SMTP地址单独一行记录(更易查看)
如果希望每个邮箱地址单独占一行CSV记录(同时可以关联用户名),用这个脚本更直观:
Get-ADGroupMember -Identity "EDL_ProEquities Smarsh" -Recursive | Get-ADUser -Properties ProxyAddresses | ForEach-Object { # 遍历当前用户的所有SMTP地址 $user = $_ $user.ProxyAddresses | Where-Object { $_ -match '^smtp:' } | ForEach-Object { [PSCustomObject]@{ UserName = $user.SamAccountName # 可选:添加用户名方便对应 ProxyAddresses = $_ -replace '^smtp:', '', 'IgnoreCase' } } } | Export-Csv -Path "c:\temp\EDL.csv" -NoTypeInformation -Encoding UTF8
这个脚本会给每个邮箱地址生成一行记录,还能看到对应的用户名,排查起来更方便。
内容的提问来源于stack exchange,提问作者MYESTER
相关产品推荐
相关产品推荐

