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

使用PowerShell比对AD用户proxyAddresses与mail属性的问题求助

解决方法:筛选proxyAddresses不包含mail值的AD用户

你的核心问题出在匹配逻辑的错误使用以及忽略了AD属性的格式特性,以下是错误分析和修正后的代码:

错误点解析

  1. -contains 用法错误:
    -contains 是用来检查集合是否包含精确匹配的元素,不支持通配符;同时单引号包裹的字符串中变量不会被解析,所以 if ($proxystring -contains '*$Mailstring*') 完全无法实现你想要的模糊匹配。
  2. 忽略proxyAddresses的格式:
    AD中proxyAddresses属性的每个条目都是前缀:邮箱地址的格式(比如主地址是SMTP:user@domain.com,别名是smtp:alias@domain.com),而mail属性是纯邮箱地址,直接匹配字符串会因为前缀存在导致匹配失败。
  3. .Contains() 的局限:
    该方法是区分大小写的精确匹配,既不支持通配符,也没处理前缀问题,同样无法满足需求。

修正后的代码

# 获取同时填充了mail和proxyAddresses的AD用户
$ADUser = Get-ADUser -Properties Name, Mail, proxyAddresses -Filter { proxyAddresses -ne $null -and Mail -ne $null }

# 循环筛选目标用户
$result = foreach ($User in $ADUser) {
    $targetMail = $User.Mail
    # 检查proxyAddresses中是否存在包含mail值的条目(自动适配前缀)
    $mailExists = $User.proxyAddresses | Where-Object { $_ -like "*$targetMail" }
    
    # 如果不存在,输出该用户信息
    if (-not $mailExists) {
        # 可根据需要选择输出的属性,这里保留Name、Mail和proxyAddresses方便验证
        $User | Select-Object Name, Mail, proxyAddresses
    }
}

# 查看结果
$result

可选优化:精确匹配主SMTP地址

如果你只需要检查mail对应的主SMTP地址(即SMTP:前缀+mail值)是否存在,可以把匹配逻辑改成:

$mailExists = $User.proxyAddresses -contains "SMTP:$targetMail"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 13:01:42