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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 19:12:17