Exchange组织收件箱外部转发规则查询脚本输出异常求助
解决Exchange收件箱规则导出异常问题
问题说明
原脚本导出CSV时,ForwardTo/RedirectTo/ForwardAsAttachmentTo字段显示为类型名称(如Microsoft.Exchange.Data.Storage.Management.ADRecipientOrAddress[])而非实际SMTP地址,同时未筛选出仅转发至外部地址的规则,输出包含大量无效信息。
修正后的脚本
# 替换为你的Exchange组织内部域名 $internalDomain = "@contoso.com" Get-Mailbox -ResultSize Unlimited | ForEach-Object { Write-Verbose "Checking $($_.Alias)..." -Verbose $inboxRules = Get-InboxRule -Mailbox $_.Alias foreach ($rule in $inboxRules) { # 提取各转发字段的外部SMTP地址 $forwardToExternal = $rule.ForwardTo | ForEach-Object { $_.SmtpAddress } | Where-Object { $_ -notlike "*$internalDomain" } $forwardAsAttachmentExternal = $rule.ForwardAsAttachmentTo | ForEach-Object { $_.SmtpAddress } | Where-Object { $_ -notlike "*$internalDomain" } $redirectToExternal = $rule.RedirectTo | ForEach-Object { $_.SmtpAddress } | Where-Object { $_ -notlike "*$internalDomain" } # 合并所有外部收件人地址 $externalRecipients = @($forwardToExternal + $forwardAsAttachmentExternal + $redirectToExternal) | Where-Object { $_ } # 仅导出存在外部转发/重定向的规则 if ($externalRecipients.Count -gt 0) { [PSCustomObject]@{ Mailbox = $_.Alias RuleName = $rule.Name ExternalRecipients = $externalRecipients -join ";" RuleActionType = @( if ($forwardToExternal) { "ForwardTo" } if ($forwardAsAttachmentExternal) { "ForwardAsAttachmentTo" } if ($redirectToExternal) { "RedirectTo" } ) -join ";" RuleDescription = $rule.Description -replace "`r`n", " " # 替换换行符避免CSV格式混乱 } } } } | Export-Csv "C:\temp\external_inbox_rules.csv" -NoTypeInformation -Encoding UTF8
关键修正点
- 提取真实SMTP地址:Exchange的
ForwardTo等字段返回的是ADRecipientOrAddress对象,需通过$_.SmtpAddress属性提取实际邮件地址,避免导出类型名称。 - 筛选外部地址:通过对比内部域名,过滤掉内部收件人,只保留外部地址。
- 优化CSV格式:将规则描述中的换行符替换为空格,避免CSV单元格内容换行导致格式错乱。
- 精准过滤规则:仅导出包含外部转发/重定向的规则,减少无效数据。
- 合并信息维度:将多种转发类型的外部地址合并到同一字段,并标注规则动作类型,便于快速查看规则详情。
内容的提问来源于stack exchange,提问作者Arbelac
相关产品推荐
相关产品推荐

