如何获取所有未加入任何distribution-group的Exchange MailContact?
问题根因
代码结果不符合预期,是三个典型的Exchange PowerShell踩坑点导致的:
Get-DistributionGroupMember默认仅返回前1000个成员,你没加-ResultSize Unlimited参数,成员数超1000的组会出现数据截断,最终$alldgm存储的组内联系人本身就不全。- 组内联系人列表没做去重:一个邮件联系人如果加入了多个通讯组,会在
$alldgm里重复存入多条记录,Compare-Object做差集时会被重复项干扰,匹配逻辑完全错乱。 - 对比时未指定匹配属性:你用
Select Name返回的是PSCustomObject自定义对象,属于引用类型,Compare-Object默认不会读取对象的Name属性做值匹配,而是直接对比对象的内存引用地址——哪怕两个对象的Name值完全一样,只要是不同的实例,就会被判定为不同对象,最终对比结果自然不对。 - 额外提醒:用Name做联系人匹配存在重名风险,生产环境建议用全局唯一的
PrimarySmtpAddress作为匹配依据,避免同名联系人判断错误。
修正代码
直接运行以下代码即可得到准确结果,逻辑上补全了参数限制、做了去重、指定了明确的对比属性:
# 获取全量通讯组 $groups = Get-DistributionGroup -ResultSize Unlimited # 获取所有通讯组内的邮件联系人,按主SMTP地址去重,避免重复条目 $groupedContacts = @( foreach ($group in $groups) { # 加ResultSize Unlimited避免大组成员截断 Get-DistributionGroupMember -Identity $group -ResultSize Unlimited | Where-Object { $_.RecipientType -eq 'MailContact' } } ) | Select-Object Name, PrimarySmtpAddress -Unique # 获取租户内全量邮件联系人 $allContacts = @( Get-MailContact -ResultSize Unlimited | Select-Object Name, PrimarySmtpAddress ) # 对比差集,指定按属性匹配,筛选仅存在于全量联系人列表、不在任何组内的条目 Compare-Object -ReferenceObject $groupedContacts -DifferenceObject $allContacts -Property Name, PrimarySmtpAddress | Where-Object { $_.SideIndicator -eq '=>' } | Select-Object Name, PrimarySmtpAddress
如果需要将结果导出为CSV文件,只需要在最后一行命令后追加管道:
| Export-Csv -Path "C:\未加入任何通讯组的邮件联系人.csv" -NoTypeInformation -Encoding UTF8即可。
内容的提问来源于stack exchange,提问作者JNTBSNS
相关产品推荐
相关产品推荐

