【问题标题】:LDAP attribute is missing in ldap python result3 function result but comes in ldapsearch command resultldap python result3 函数结果中缺少 LDAP 属性,但出现在 ldapsearch 命令结果中
【发布时间】:2020-02-10 15:20:51
【问题描述】:

我们有 python 应用程序,它从 ldap 读取条目并更新其他数据库中的用户。现在我遇到的问题是,当我跑步时

ldapsearch 'sAMAccountName=myID` 

我能够成功获取属性employeeID

但是从 python 代码我无法打印employeeID 属性。

我的python代码如下:

import ldap
import datetime
conn = ldap.initialize('ldap://url:port')
conn.simple_bind_s('CN=ABC,OU=XYZ,OU=AAA,DC=users,DC=net', 'password')
from ldap.controls import SimplePagedResultsControl

LDAP_ATTRS = ['*']
LDAP_FILTER = (
        '(&(sAMAccountName=myId))'
)

pager = SimplePagedResultsControl(
            criticality=True,
            size=1500000,
            cookie=''
        )

msgid = conn.search_ext(
                'DC=users,DC=net', ldap.SCOPE_SUBTREE,
                LDAP_FILTER.format(''),
                LDAP_ATTRS, serverctrls=[pager]
            )

rtype, rdata, rmsgid, serverctrls = conn.result3(msgid)

for dn, entry in rdata:
        for ent in entry:
            print(ent)

我不知道为什么我不能打印属性之一 (employeeID)。由 ldapsearch 命令提供。

编辑

首先我怀疑一些假设,比如用户应该有权读取属性。但我不确定我的假设是否正确。

由于我是 python 和 ldap 的新手,因此我阅读了有关 ldap 架构的信息并根据架构阅读了有关结果的结果。如果有人解释他们的理解,这将有助于分析和理解。

【问题讨论】:

    标签: python ldap


    【解决方案1】:

    我更喜欢使用ldap3 而不是ldaphttps://ldap3.readthedocs.io/

    这是因为 sAMAccountName 是您条目的一个属性。

    你能试试这个代码吗?

    from ldap3 import Server, Connection, SUBTREE, ALL_ATTRIBUTES
    import json
    
    server = Server("ldap://url:port")
    connection = Connection(server, "CN=ABC,OU=XYZ,OU=AAA,DC=users,DC=net", "password")
    connection.search(
        "DC=users,DC=net",
        "(objectCategory=user)",
        search_scope=SUBTREE,
        attributes=ALL_ATTRIBUTES,
    )
    data = json.loads(connection.response_to_json())
    
    entries = data["entries"]
    for entry in entries:
        print(entry["attributes"])
        print(entry["attributes"]["sAMAccountName"])
    

    【讨论】:

    • 感谢您的回复。我尝试了您的代码,但我仍然无法找到来自终端的 ldapsearch 命令中的属性employeeID
    • 如果sAMAccountName 不是条目的属性,他就不会问这个问题。
    【解决方案2】:

    您是否尝试过在属性列表 (LDAP_ATTRS) 中专门指定“employeeID”,而不是在 search_ext 调用中指定“*”以查看是否返回employeeID?

    或者尝试不将属性列表指定为https://www.python-ldap.org/en/latest/reference/ldap.html#ldap.LDAPObject.search 中的文档 说“可以使用 attrlist 参数限制检索到的属性。如果 attrlist 为 None,则返回每个条目的所有属性。”

    【讨论】:

    • 第一个建议不会有任何区别,除非employeeID 是一个操作条目。第二个建议与指定"*" 没有什么不同,除非它是一个操作条目。事实并非如此,您可以从 ldapsearch 成功中看出。
    【解决方案3】:

    问题是employeeID 在不同的端口,所有其他属性在不同的端口。我不确切知道 ldapsearch 命令是如何工作的,但 ldapsearch 能够获取所有属性,但不能从 python 库获取,因为我获取的连接对象来自不同的端口,其中不存在employeeID 属性。

    使用strace 来查找 ldapsearch 尝试获取所有属性的端口。

    【讨论】:

    • 这可能意味着您正在与不同的 LDAP 服务器通信。
    • @user207421 没有 ldap 服务将在多个端口上运行,例如 3268 3269 389 等,我的 python 代码使用了不同的端口,其中没有提供employeeID 属性。但是 strace 的 ldapsearch 命令帮助我识别employeeID 是从哪个端口获取的。所以我更改了实现以使用该端口
    • 我不知道 ldapsearch 命令在内部引用了哪个端口。由于 ldapsearch 能够获取employeeID,但不能获取我的python 代码。所以我使用 strace 深入研究了 ldapsearch 命令,它帮助了我。
    猜你喜欢
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多