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

PowerShell导入CSV发通讯组所有者邮件遇参数转换报错求助

报错根因

报错触发点在脚本第一行的Get-DistributionGroup (ipcsv c:\Scripts\TestEmailList.csv).DisplayName调用:

  • Import-Csv(别名ipcsv)读取文件后返回的DisplayName列是ArrayList类型的集合,Get-DistributionGroup的Identity参数单次调用仅支持接收单个通讯组标识,不支持直接传入未遍历的集合对象,因此触发类型转换错误。
  • 原脚本除了传参错误,还存在3个逻辑问题:
    • 重复导入CSV、重复调用Get-DistributionGroup,冗余调用多容易触发Exchange Online限流
    • 组显示名的计算逻辑错误:拿组对象的Name属性调用Get-Mailbox查询无法得到有效结果,会返回空值
    • 没有逐组遍历发件,而是把所有组的所有者、所有组地址拼成单封邮件发送,会导致所有收件人收到全量组的通知,信息完全错乱
修复方案

直接逐行遍历CSV中的通讯组条目,单个查询组信息,逐组生成并发送对应通知邮件即可,修复后脚本如下:

# 配置基础参数
$PSEmailServer = "smtp.consoco.com"
$csvPath = "c:\Scripts\TestEmailList.csv"
$groups = Import-Csv -Path $csvPath

foreach ($groupItem in $groups) {
    # 逐个查询通讯组信息,避免集合传参错误
    $dgInfo = Get-DistributionGroup -Identity $groupItem.DisplayName | Select-Object `
        PrimarySmtpAddress,
        @{
            Name = "Owner"
            Expression = {
                $_.ManagedBy | ForEach-Object { (Get-Mailbox $_).PrimarySMTPAddress }
            }
        },
        DisplayName

    # 跳过查询失败、没有配置所有者的组
    if (-not $dgInfo -or -not $dgInfo.Owner) {
        Write-Warning "组 $($groupItem.DisplayName) 查询失败或未配置所有者,跳过发件"
        continue
    }

    # 针对当前组生成专属邮件正文
    $body = @"
<html><body>Hello $($dgInfo.Owner -join ', '), <br>
The Email Admins are in the process of auditing distribution groups, and you have been identified as the owner of the group <b>$($dgInfo.DisplayName) ($($dgInfo.PrimarySmtpAddress))</b>. This group was flagged as being inactive. <p>
This Distribution list will be restricted for 60 days then deleted.
</body></html>
"@

    $mailParams = @{
        From       = 'emailadmins@consoco.com'
        To         = $dgInfo.Owner
        Subject    = 'Attention Distribution List Owner'
        Body       = $body
        BodyAsHtml = $true
        Bcc        = 'me@consoco.com'
        Priority   = 'High'
        SmtpServer = $PSEmailServer
    }
    # 发送当前组的通知邮件
    Send-MailMessage @mailParams
    Write-Host "已向组 $($dgInfo.PrimarySmtpAddress) 的所有者 $($dgInfo.Owner -join ', ') 发送通知邮件"
}
关键调整点
  • 移除直接给Get-DistributionGroup传整个数组的写法,用foreach遍历CSV每一行,单次查询单个组,从根源解决参数类型报错
  • 合并重复的CSV导入、组查询逻辑,一次查询就拿到组地址、所有者、组显示名所有需要的字段,减少无效调用
  • 修正组显示名取值逻辑,直接读取组对象自带的DisplayName属性,删除无效的Get-Mailbox调用
  • 逐组生成邮件正文、逐组发送,保证每个所有者仅收到自己负责的组的通知;同时兼容一个组有多个所有者的场景,自动拼接多所有者邮箱为合法收件人格式
  • 增加容错逻辑:遇到CSV中名称错误查不到的组、未配置所有者的组,输出警告后跳过,不会导致整个脚本运行中断

内容的提问来源于stack exchange,提问作者Nupe2012

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:39:18