我正在针对 Novell eDirectory 服务器进行直通身份验证。目前我执行以下请求:
results = server.search_s(
self.basedn,
ldap.SCOPE_SUBTREE,
'(objectClass=user)',
attrlist=['uid', 'networkAddress'])
(这是用 Python 写的,如果您想让我解释一下,请告诉我。)
这种方法的问题是每个查询都会返回服务器上的每个用户,然后我必须循环查找我感兴趣的用户。我将其缓存,但我真正想做的是这样的:
results = server.search_s(
self.basedn,
ldap.SCOPE_SUBTREE,
'(&(objectClass=user)(networkAddress=#9#\x00\x00\xc0\xa8\n\x1e))')
(这个古怪的#9#
东西就是 IP 的存储方式 - 它实际上是 192.168.10.30)
当我对 进行查询时,networkAddress
出现'Invalid Syntax'
错误(即使我执行了类似的操作networkAddress=blah
,但没有包括所有的\
)。
有没有办法对特定 IP 进行 LDAP 查询?
答案1
问题在于,Network Address 使用的语法是 Net Address,这是一种结构化属性。我在这两篇文章中介绍了各种语法类型:
http://www.novell.com/communities/node/6450/interesting-schema-syntaxes-edirectory-identity-manager-perspective-part-1 http://www.novell.com/communities/node/6457/interesting-schema-syntaxes-edirectory-identity-manager-perspective-part-2
# 符号分隔属性的 LDAP 视图中的字段。
我正在查看 LogicSource for NDS 中这些文章的架构参考,这是一份收费文件。
问题是该属性允许进行什么样的比较。
顺便说一下,如果您查询 loginTime=*,则会显示当前已登录的用户,并减少要循环的用户集。
此外,networkAddress 是多值的。
答案2
我假设您实际运行的代码在字符串内没有未转义的撇号?
答案3
看起来您的搜索过滤器中的单引号位置不对。它应该是:
results = server.search_s(
self.basedn,
ldap.SCOPE_SUBTREE,
'(&(objectClass=user)(networkAddress=#9#\x00\x00\xc0\xa8\n\x1e))'
)