LDAP python result3函数结果中缺少LDAP属性,但在ldapsearch命令结果中出现

2024-06-24 12:38:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我们有一个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模式的内容,并根据模式阅读了关于result的结果。如果有人解释他们的理解,这将有助于分析和理解


Tags: 代码用户importnet属性oudcldap
3条回答

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

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

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

使用strace查找ldapsearch,尝试从哪个端口获取所有属性

我更喜欢使用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"])

相关问题 更多 >