gpt4 book ai didi

asp-classic - 如何格式化包含特殊字符的 LDAP 过滤器? ('Classic' ASP)

转载 作者:行者123 更新时间:2023-12-04 04:33:54 26 4
gpt4 key购买 nike

我在通过 LDAP 检索具有 DistinguishedName 的某些组的信息时遇到问题。
这个问题似乎与它们具有特殊字符有关。

这里有两个例子,一个有效,一个无效:
全部在测试组
全部在 463\"567y\\22\"¤&/2#%&!测试组

和他们的 dn:
CN=测试组中的所有,OU=组,DC=一些,DC=测试,DC=com
CN=全部在463\"567y\\22\"¤&/2#%&!测试组,OU=组,DC=一些,DC=测试,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 的域运行的经典 ASP。

编辑:

Active Directory error '80040e37'

An invalid directory pathname was passed



当我设法通过特殊字符传递一个时,是否给出了错误消息。

最佳答案

您需要根据 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&/2#%&!测试组

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

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

关于asp-classic - 如何格式化包含特殊字符的 LDAP 过滤器? ('Classic' ASP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20094875/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com