7

我正在使用 python-ldap 来查询 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 文档中列为需要在过滤器中转义的字符。

我错过了什么?

4

2 回答 2

8

LDAP 过滤器规范为以下字符分配特殊含义,当在搜索过滤器( rfc2254* ( ) \ NUL ) 中使用时,应使用反斜杠后跟该字符的两个字符 ASCII 十六进制表示进行转义:

*   \2A
(   \28
)   \29
\   \5C
Nul \00

这意味着用于转义专有名称的特殊字符(包括逗号)的任何反斜杠必须\5c在搜索过滤器中表示为:

(&(objectClass=group)(memberof:1.2.840.113556.1.4.1941:=CN=Whalen\5c, Sean,OU=Users,OU=Users and Groups,DC=example,DC=net))

以下是在搜索过滤器中使用时必须使用\或 whith转义的 dn 特殊字符列表:\5C

    +-------------------------------+---+
    | comma                         | , |
    +-------------------------------+---+
    | Backslash character           | \ |
    +-------------------------------+---+
    | Pound sign (hash sign)        | # |
    +-------------------------------+---+
    | Plus sign                     | + |
    +-------------------------------+---+
    | Less than symbol              | < |
    +-------------------------------+---+
    | Greater than symbol           | > |
    +-------------------------------+---+
    | Semicolon                     | ; |
    +-------------------------------+---+
    | Double quote (quotation mark) | " |
    +-------------------------------+---+
    | Equal sign                    | = |
    +-------------------------------+---+
    | Leading or trailing spaces    |   |
    +-------------------------------+---+
于 2016-10-01T10:29:26.533 回答
0

member:1.2.840.113556.1.4.1941使用转义字符进行搜索时,我遇到了非常奇怪的行为。

似乎当搜索词“正确”转义时搜索失败,但当搜索词没有转义时搜索成功!

相反,member无论搜索词是否转义,普通搜索 using 都有效。

这是一个 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 expected results with escaped search term
Find-AdObjects "(&(member=$EscapedUserDn))"

# Returns same results even though search term is NOT escaped correctly
Find-AdObjects "(&(member=$UserDn))"

# Returns NO results even though search term is escaped correctly
Find-AdObjects "(&(member:1.2.840.113556.1.4.1941:=$EscapedUserDn))"

# Returns recursive results even though search term is NOT escaped correctly
Find-AdObjects "(&(member:1.2.840.113556.1.4.1941:=$UserDn))"

所以我看不到一个可接受的解决方法,因为似乎没有一种可靠的方法来逃避可能包含各种特殊字符的 DN:\*()

于 2017-12-14T04:15:14.563 回答