使用PowerShell比对AD用户proxyAddresses与mail属性的问题求助
解决方法:筛选proxyAddresses不包含mail值的AD用户
你的核心问题出在匹配逻辑的错误使用以及忽略了AD属性的格式特性,以下是错误分析和修正后的代码:
错误点解析
-contains用法错误:-contains是用来检查集合是否包含精确匹配的元素,不支持通配符;同时单引号包裹的字符串中变量不会被解析,所以if ($proxystring -contains '*$Mailstring*')完全无法实现你想要的模糊匹配。- 忽略proxyAddresses的格式:
AD中proxyAddresses属性的每个条目都是前缀:邮箱地址的格式(比如主地址是SMTP:user@domain.com,别名是smtp:alias@domain.com),而mail属性是纯邮箱地址,直接匹配字符串会因为前缀存在导致匹配失败。 .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
相关产品推荐
相关产品推荐

