如何用PowerShell移除Azure AD/Exchange Online中匹配特定域名的邮箱地址?
批量移除Exchange Online通讯组中旧域名的所有邮箱地址
原脚本无法用通配符批量移除smtp:*@olddomain.com格式的地址,核心原因是Set-DistributionGroup的-EmailAddresses参数不支持通配符移除操作,必须先获取具体的地址列表再批量处理。以下是解决方案:
步骤1:连接到Exchange Online PowerShell
先确保已建立Exchange Online会话:
Connect-ExchangeOnline
步骤2:修改后的批量处理脚本
该脚本会先获取每个通讯组的所有邮箱地址,筛选出旧域名相关地址后批量移除:
$DefaultDomain = 'NewCompany.onmicrosoft.com' $OldDomain = 'olddomain.com' # 导入通讯组列表 $DistributionGroups = Import-Csv -LiteralPath C:\Source-DL.csv foreach ($dl in $DistributionGroups) { Write-Host "Processing DL: $($dl.DisplayName)" -ForegroundColor Yellow try { # 获取当前通讯组的所有邮箱地址(含主地址和次要地址) $currentAddresses = (Get-DistributionGroup -Identity $dl.Alias -ErrorAction Stop).EmailAddresses # 筛选出所有旧域名的地址(自动匹配SMTP/smtp前缀格式) $addressesToRemove = $currentAddresses | Where-Object { $_ -like "*@$OldDomain" } if ($addressesToRemove) { Write-Host "Removing $($addressesToRemove.Count) old addresses from $($dl.DisplayName)" -ForegroundColor Cyan # 构造移除参数哈希表 $removeParams = @{ Remove = $addressesToRemove } # 更新通讯组:设置新主地址 + 批量移除旧域名地址 Set-DistributionGroup -Identity $dl.Alias ` -WindowsEmailAddress "$($dl.Alias)@$DefaultDomain" ` -EmailAddresses $removeParams ` -ErrorAction Stop Write-Host "Successfully updated $($dl.DisplayName)" -ForegroundColor Green } else { Write-Host "No old addresses found for $($dl.DisplayName)" -ForegroundColor Green } } catch { Write-Host "Failed to process $($dl.DisplayName): $_" -ForegroundColor Red } }
关键细节说明
- 通配符限制:
Set-DistributionGroup的Remove操作仅接受具体地址值,无法识别通配符,因此必须先通过Get-DistributionGroup拉取完整地址列表再筛选。 - 筛选逻辑:
$_ -like "*@$OldDomain"会匹配所有旧域名结尾的地址,不管是主地址(大写SMTP:前缀)还是次要地址(小写smtp:前缀),-like运算符不区分大小写。 - 错误处理:
try/catch块可捕捉处理失败的通讯组,避免脚本中途中断,方便排查问题。 - CSV要求:确保CSV文件包含
Alias和DisplayName列,Alias必须是通讯组的有效别名,否则无法定位目标对象。
内容的提问来源于stack exchange,提问作者Senior Systems Engineer
相关产品推荐
相关产品推荐

