我无法通过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'
传递了无效的目录路径名
当我设法传递带有特殊字符的错误消息时,会给出错误消息。
答案 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应该只是一个条目的路径。如果你继续这种做法,你会遇到很多“现成”工具的问题。
我尝试过,甚至无法在两个不同的供应商工具中创建条目。