如何格式化包含特殊字符的LDAP过滤器? ('经典'ASP)

时间:2013-11-20 11:37:16

标签: asp-classic ldap ldap-query

我无法通过LDAP检索某些组的信息,我有DistinguishedName。 这个问题似乎与他们有特殊的角色有关。

以下是两个例子,一个是工作,一个不是:
全部在测试组中 全部在463 \“567y \\ 22 \”¤& / 2#%&!测试组

和他们的dn:
CN =全部在测试组中,OU =组,DC = some,DC = test,DC = com
CN =全部在463 \“567y \\ 22 \”¤& / 2#%&!测试组,OU =组,DC = some,DC = test,DC = com

我知道dn是正确的,因为我从用户的managedObjects属性中检索它们,并在AD中验证它们并使用ADSI Edit。

现在,在我用于检索信息的代码上,请注意此代码在没有特殊字符的组上正常工作:

Dim strGroupdisplayName, strGroupsAMAccountname, strGroupmail


Function GetGroupInfofromDN(group_str)
on error resume next
DIM objGroup, objDNNamespace, strLDAPGroup
strLDAPGroup = "LDAP://" + group_str
Set objDNNamespace = GetObject("LDAP:")
Set objGroup = objDNNamespace.OpenDSObject(strLDAPGroup, strADUsername, strADPassword,0)
objGroup.GetInfo
strGroupdisplayName = ""
strGroupsAMAccountname = ""
strGroupmail = ""
strGroupdisplayName = ObjGroup.Get("displayName")
strGroupsAMAccountname = ObjGroup.Get("sAMAccountname")
strGroupmail = ObjGroup.Get("mail")
set objGroup = Nothing
End Function

至于我尝试过的...我尝试将组编码为URI格式,我尝试用其转义的等价物替换特殊字符:

strTemp = replace(strTemp, "\", "\5c")
strTemp = replace(strTemp, "(", "\28")
strTemp = replace(strTemp, "|", "\7c")
strTemp = replace(strTemp, "<", "\3c")
strTemp = replace(strTemp, "/", "\2f")
strTemp = replace(strTemp, ")", "\29")
strTemp = replace(strTemp, "=", "\3d")
strTemp = replace(strTemp, "~", "\7e")
strTemp = replace(strTemp, "&", "\26")
strTemp = replace(strTemp, ">", "\3e")
strTemp = replace(strTemp, "*", "\2a")

我也试过通过正则表达式来拉出CN =部分并且只改变它。

坦率地说,我不知道该怎么做。

我还尝试了另一种方法:

set connAD = Server.CreateObject("ADODB.Connection")
connAD.Provider = "ADsDSOObject"
connAD.Properties("User ID") = strADUsername 
connAD.Properties("Password") = strADPassword
connAD.Properties("Encrypt Password") = true
connAD.Open

Function getADUserInfo(strUID)

    strGeneralLookupError = false
    strBase = "<LDAP://DC=SOME,DC=TEST,DC=COM>"
    strFilter = "(distinguishedName=" & strUID & ")" 
    strAttributes = "cn, mail, company, givenName, sn, ADsPath, name, sAMAccountName, telephoneNumber, distinguishedName, managedObjects"
    strScope = "subtree"    
    strFullCommand = strBase & ";" & strFilter & ";" & strAttributes & ";" & strScope
    set rsADUserInfo = Server.CreateObject("ADODB.Recordset")
    set rsADUserInfo = connAD.Execute(strFullCommand)
    set getADUserInfo = rsADUserInfo
    set rsADUserInfo = Nothing
End Function

Sub getUserData(p_strUserID)

    strADLookupSuccess = true
    set rsUserData = Server.CreateObject("ADODB.Recordset")
    set rsUserData = getADUserInfo(p_strUserID)
    if not rsUserData.EOF then
        strUserADsPath = rsUserData("ADsPath")
        strUserdistinguishedName = rsUserData("distinguishedName")
    else
        strADLookupSuccess = false
    end if
    rsUserData.Close
    set rsUserData = Nothing
End Sub

dim strUserADsPath, strUserdistinguishedName, rsUserData, rsADUserInfo, strADLookupSuccess
getUserData("CN=All in 463\"567y\\\\22\"¤&/2\#%&! Test Group,OU=Groups,DC=some,DC=test,DC=com")

connAD.Close
set connAD = Nothing

有什么建议吗?到目前为止我读到的所有内容都提到了特殊字符,但是逃避它们似乎并不起作用......

此外,这是针对基于Windows Server 2008 r2的域运行的Classic ASP。

编辑:

  

Active Directory错误'80040e37'

     

传递了无效的目录路径名

当我设法传递带有特殊字符的错误消息时,会给出错误消息。

1 个答案:

答案 0 :(得分:2)

您需要根据RFC 4515 String Representation of Search Filters

转义字符串

通常,您需要转义RFC 4515 String Representation of Search Filters中列出的项目,我建议使用任何非UTF8字符。

我还找到了一些methods that may be helpful来启动。

我相信您要查找的正确转义值是: 全部在463“567y \ 5c22”\ c2 \ a4&amp; / 2#%&amp;!测试组

最后,退出它。 开始填充搜索描述或其他一些非命名属性。 (任何不属于DN的属性)使您的DN永不改变。没有用户应该看到DN应该只是一个条目的路径。如果你继续这种做法,你会遇到很多“现成”工具的问题。

我尝试过,甚至无法在两个不同的供应商工具中创建条目。