我应该如何在Active Directory过滤器中转义逗号?
我使用python-LDAP查询Active Directory我应该如何在Active Directory过滤器中转义逗号?
我有这样的DN
CN=Whalen\, Sean,OU=Users,OU=Users and Groups,DC=example,DC=net
这工作正常在查询中的基础,但如果我尝试像一个搜索过滤器,它此
(&(objectClass=group)(memberof:1.2.840.113556.1.4.1941:=CN=Whalen\, Sean,OU=Users,OU=Users and Groups,DC=example,DC=net))
我收到Bad search filter
错误。从我的测试中,CN中的逗号似乎是罪魁祸首,即使我用反斜杠(\
)逃脱了它。但是,逗号不会在Microsoft documentation中列为需要在过滤器中转义的字符。
我错过了什么?
的LDAP过滤器规范赋予特殊意义的下列字符* () \ NUL
应与反斜杠转义字符后的字符的两个字符的ASCII十六进制表示(rfc2254)进行转义:
* \2A
( \28
) \29
\ \5C
Nul \00
因此,在您
(&(objectClass=group)(memberof:1.2.840.113556.1.4.1941:=CN=Whalen\5c, Sean,OU=Users,OU=Users and Groups,DC=example,DC=net))
感谢您提供非常详细的回复。现在查询似乎正在运行,但是,在花费与PowerShell相同的时间后,它将返回零结果。任何想法为什么? –
我不知道,确保查询被ldap正确解析是值得的。根据执行查询的内容(什么样的程序以及它如何分析字符串)以及heiglandreas的建议,可能需要转义反斜杠本身(被解析为字面反斜杠),从而产生'\\ 5c' 。 – EricLavault
@EricLavault我也有奇怪的问题,零结果正确逃脱搜索词后,但只有当做递归搜索。我已经添加了完整的描述作为答案。 –
我有E:情况下,用于转义DN”的特殊字符中的任何反斜线必须由\5c
在搜索过滤器使用时表示在使用转义字符member:1.2.840.113556.1.4.1941
进行搜索时遇到非常奇怪的行为。
看起来,搜索失败时,搜索词被'正确'转义,但成功时,搜索词没有逃脱!
相比之下,使用member
进行明码搜索时,搜索词是否会被转义。
这是一个PowerShell示例。
function Find-AdObjects([string]$Filter) {
$DirectorySearcher = New-Object System.DirectoryServices.DirectorySearcher
$DirectorySearcher.SearchRoot = New-Object System.DirectoryServices.DirectoryEntry
$DirectorySearcher.SearchScope = [System.DirectoryServices.SearchScope]::Subtree
$DirectorySearcher.PropertiesToLoad.Add('distinguishedname') > $null
$DirectorySearcher.PageSize = 100
$DirectorySearcher.Filter = $Filter
$SearchResultCollection = $DirectorySearcher.FindAll()
foreach ($r in $SearchResultCollection) {
$r.Properties['distinguishedname']
}
$SearchResultCollection.Dispose()
$DirectorySearcher.Dispose()
}
$UserDn = 'CN=Rees\, John,OU=Tier3,DC=big,DC=com'
$EscapedUserDn = 'CN=Rees\5C, John,OU=Tier3,DC=big,DC=com'
# Returns results even though term is not escaped correctly
Find-AdObjects "(&(member=$UserDn))"
# Returns recursive results even though term is not escaped correctly
Find-AdObjects "(&(member:1.2.840.113556.1.4.1941:=$UserDn))"
# Returns same results as unescaped version above
Find-AdObjects "(&(member=$EscapedUserDn))"
# Returns NO results even though it is escaped correctly
Find-AdObjects "(&(member:1.2.840.113556.1.4.1941:=$EscapedUserDn))"
所以,我没有看到一个可接受的解决方法,因为似乎没有要逃跑,可能含有多种特殊字符的DN一种可靠的方法:\ *()
你尝试添加第二个反斜杠?根据执行搜索的方式,第一个反斜杠可能需要转义才能通过LDAP;) – heiglandreas