2016-09-30 69 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一種可靠的方法:\ *()

相關問題