You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改PowerShell脚本提取AD组用户所有SMTP地址至单列

解决PowerShell提取AD用户所有SMTP地址到单列的问题

嗨,我来帮你搞定这个问题!你的原脚本思路是对的,但有几个小细节没处理好,导致看起来只提取了第一个SMTP地址,咱们一步步修正:

先分析原脚本的问题

  1. 前缀替换不彻底:你用了-replace 'smtp:',但AD里的主邮箱地址是大写SMTP:开头的,别名是小写smtp:,这个替换只会去掉小写前缀,大写的会保留,可能让你误以为只拿到了第一个地址。
  2. 分隔符不合理:"rn';"`这种分隔符会在地址里插入多余的单引号和分号,导致CSV格式混乱,查看的时候容易出错。
  3. 缺少编码设置:导出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 23:27:41