PowerShell查询含撇号邮箱的AD用户失败问题
问题:含撇号的邮箱地址无法查询AD用户
问题场景
使用以下PowerShell脚本从CSV读取邮箱地址查询对应AD用户时,不含撇号的邮箱能正常匹配,但带撇号的邮箱(如SAMUEL.O'BOYLE@DOMAIN.UK)会触发语法错误:
$PilotUsers = Get-Content "C:\Scripts\UPNUpdate\Users.csv" | ForEach-Object {get-aduser -Properties emailaddress -Filter "emailaddress -eq '$_'"}
错误信息
get-aduser : 解析查询时出错: 'emailaddress -eq 'SAMUEL.O'BOYLE@DOMAIN.UK'' 错误消息: '语法错误',位置: '27'。
At line:1 char:70
- ... ach-Object {get-aduser -Properties emailaddress -Filter "emailaddress ...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- CategoryInfo : ParserError: (:) [Get-ADUser], ADFilterParsingException
- FullyQualifiedErrorId : ActiveDirectoryCmdlet:Microsoft.ActiveDirectory.Management.ADFilterParsingException,Microsoft.ActiveDirectory.Management.Commands.GetADUser
原因分析
AD Filter语法中,单引号是字符串边界标记。当邮箱里的撇号(单引号)直接代入Filter时,会提前截断字符串,导致后续内容变成无效语法。比如'SAMUEL.O'BOYLE@DOMAIN.UK'会被解析成'SAMUEL.O',剩余的BOYLE@DOMAIN.UK'破坏了语法结构。
解决方法
方法1:转义Filter中的单引号
在AD Filter规则里,单个单引号需要用两个单引号转义,修改脚本替换邮箱中的单引号:
$PilotUsers = Get-Content "C:\Scripts\UPNUpdate\Users.csv" | ForEach-Object { $escapedEmail = $_ -replace "'", "''" Get-ADUser -Properties emailaddress -Filter "emailaddress -eq '$escapedEmail'" }
方法2:使用LDAP Filter
LDAP Filter中需将单引号转义为十六进制ASCII码\27,脚本如下:
$PilotUsers = Get-Content "C:\Scripts\UPNUpdate\Users.csv" | ForEach-Object { Get-ADUser -Properties emailaddress -LDAPFilter "(mail=$($_ -replace "'", "\27"))" }
方法3:变量绑定(推荐)
利用AD cmdlet的变量绑定特性,完全避免手动转义,语法更安全可靠:
$PilotUsers = Get-Content "C:\Scripts\UPNUpdate\Users.csv" | ForEach-Object { $email = $_ Get-ADUser -Properties emailaddress -Filter { emailaddress -eq $email } }
内容的提问来源于stack exchange,提问作者SP789
相关产品推荐
相关产品推荐

