如何通过Exchange用户显示名称获取其邮箱地址
解决Exchange通讯组所有者邮箱地址获取问题
你的问题出在对$group.ManagedBy属性的理解上——它返回的并非单纯的显示名称字符串,而是Active Directory对象的引用(包含对象ID、可分辨名称等唯一标识),只是PowerShell默认输出时显示的是Name属性值。直接用显示名称过滤Get-Mailbox容易因为重名、特殊字符或名称匹配偏差导致无结果。
优化后的解决方案
直接利用ManagedBy返回的对象引用,通过Get-Recipient(覆盖Exchange中所有收件人类型:用户、联系人、组等)或Get-Mailbox(仅针对邮箱用户)获取所有者的邮箱地址:
# 获取所有通讯组 $groups = Get-DistributionGroup -ResultSize Unlimited # 遍历每个通讯组 foreach ($group in $groups) { $groupName = $group.Name $groupEmail = $group.PrimarySmtpAddress # 获取所有者邮箱地址:直接通过对象引用查询,避免名称匹配问题 $ownerAddresses = foreach ($owner in $group.ManagedBy) { # 使用Get-Recipient兼容更多收件人类型,若确定都是邮箱用户可改用Get-Mailbox Get-Recipient -Identity $owner | Select-Object -ExpandProperty PrimarySmtpAddress } # 获取成员邮箱地址(原逻辑保留) $participants = Get-DistributionGroupMember $group | Select-Object -ExpandProperty PrimarySmtpAddress # 示例:输出结果,可根据需求调整后续处理 [PSCustomObject]@{ "组名称" = $groupName "组邮箱" = $groupEmail "所有者邮箱" = $ownerAddresses -join ';' "成员邮箱" = $participants -join ';' } | Export-Csv -Path "通讯组信息.csv" -Append -Encoding UTF8 -NoTypeInformation }
关键说明
- 避免名称匹配陷阱:
Get-Recipient -Identity $owner直接利用对象的唯一标识(如可分辨名称、GUID)查询,不会出现重名或显示名称不一致的问题。 - 兼容性更强:
Get-Recipient支持查询邮箱用户、邮件联系人、通讯组等所有Exchange收件人类型,而Get-Mailbox仅针对拥有邮箱的用户,若通讯组所有者包含外部联系人,前者更适用。 - 效率优化:若通讯组数量较多,可考虑批量查询或使用
-Filter参数减少重复调用,但上述逻辑已能解决核心问题。
内容的提问来源于stack exchange,提问作者MirrahOH
相关产品推荐
相关产品推荐

