2016-09-30 53 views
1

我使用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中列为需要在过滤器中转义的字符。

我错过了什么?

+0

你尝试添加第二个反斜杠?根据执行搜索的方式,第一个反斜杠可能需要转义才能通过LDAP;) – heiglandreas

回答

2

的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)) 
+0

感谢您提供非常详细的回复。现在查询似乎正在运行,但是,在花费与PowerShell相同的时间后,它将返回零结果。任何想法为什么? –

+0

我不知道,确保查询被ldap正确解析是值得的。根据执行查询的内容(什么样的程序以及它如何分析字符串)以及heiglandreas的建议,可能需要转义反斜杠本身(被解析为字面反斜杠),从而产生'\\ 5c' 。 – EricLavault

+0

@EricLavault我也有奇怪的问题,零结果正确逃脱搜索词后,但只有当做递归搜索。我已经添加了完整的描述作为答案。 –

0

我有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一种可靠的方法:\ *()