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

Exchange Online无匹配保留策略的邮箱筛选PowerShell脚本问题

问题分析与解决方案

核心问题

你的筛选逻辑失效主要有两个原因:

  1. GUID处理代码错误:循环中错误地调用了$GUID.GUID,而$E3PolicyGuids已经是提取好的GUID集合,无需再次嵌套访问.GUID属性。
  2. 数组属性的筛选逻辑错误:InPlaceHolds是数组类型,直接用-notmatch/-notin/-notcontain无法实现「邮箱的所有保留策略均不在目标列表中」的判断,这些操作符的逻辑不匹配数组的检查需求。

修正后的完整代码

1. 正确提取并格式化保留策略GUID

$AllRetentionPolicies = Get-RetentionCompliancePolicy
$E3Policies = $AllRetentionPolicies | Where-Object {$_.Name -like "Exchange Retention Policy*"} | Sort-Object Name
# 直接提取GUID并去横杠,用ForEach-Object替代低效的数组+=操作
$E3PolicyGuidsClean = $E3Policies.GUID | ForEach-Object { $_.ToString().Replace("-", "") }

2. 获取目标邮箱列表

$AllE3Mbxs = Get-EXOMailbox -PropertySets All -ResultSize Unlimited -Filter {
    (PersistedCapabilities -like "bpos_s_enterprise") -and (PersistedCapabilities -notlike "bpos_s_o365pam")
}

3. 正确筛选未匹配目标策略的邮箱

这里采用「检查邮箱的保留策略与目标列表无交集」的逻辑:

$E3sNeedPolicy = $AllE3Mbxs | Where-Object {
    $currentHolds = $_.InPlaceHolds
    # 两种符合条件的情况:
    # ① 邮箱无任何保留策略;② 所有保留策略均不在目标GUID列表中
    if (-not $currentHolds) {
        $true
    } else {
        # 检查是否存在匹配的策略,无匹配则返回true
        (-not ($currentHolds | Where-Object { $_ -in $E3PolicyGuidsClean }))
    }
}

为什么原逻辑失效?

  • -notmatch:该操作符针对单个字符串做正则匹配,当作用于数组时,PowerShell会将数组转为空格分隔的字符串,只要有一个元素不匹配就返回$true,完全不符合你的筛选需求。
  • -notin/-notcontain:这两个操作符是检查「整个数组是否不在目标列表中」,而非「数组中所有元素都不在目标列表中」,所以只要邮箱的保留策略数组不是完全等于目标列表里的某一项,就会返回$true,导致筛选结果错误。

测试验证建议

可以先拿单个邮箱验证逻辑是否正常:

# 取第一个邮箱测试
$testMailbox = $AllE3Mbxs | Select-Object -First 1
# 查看该邮箱的保留策略
$testMailbox.InPlaceHolds
# 查看目标GUID列表
$E3PolicyGuidsClean
# 检查是否有匹配项
$testMailbox.InPlaceHolds | Where-Object { $_ -in $E3PolicyGuidsClean }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 13:37:25