1

我能够使用 LDAP3 成功连接并检索我的 LDAP 组成员,如下所示。

from ldap3 import Server, Connection, ALL, SUBTREE
from ldap3.extend.microsoft.addMembersToGroups import ad_add_members_to_groups as addMembersToGroups

>>> conn = Connection(Server('ldaps://ldap.****.com:***', get_info=ALL),check_names=False, auto_bind=False,user="ANT\*****",password="******", authentication="NTLM")
>>> 
>>> conn.open()
>>> conn.search('ou=Groups,o=****.com', '(&(cn=MY-LDAP-GROUP))', attributes=['cn', 'objectclass', 'memberuid'])
it returns True and I can see members by printing 
conn.entries
>>> 

上面的行说MY-LDAP-GROUP存在并TRUE在搜索时返回,但是当我尝试将用户添加到组时,找不到 LDAP 组,如下所示

>>> addMembersToGroups(conn, ['myuser'], 'MY-LDAP-GROUP')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/****/anaconda3/lib/python3.7/site-packages/ldap3/extend/microsoft/addMembersToGroups.py", line 69, in ad_add_members_to_groups
    raise LDAPInvalidDnError(group + ' not found')
ldap3.core.exceptions.LDAPInvalidDnError: MY-LDAP-GROUP not found
>>>
4

2 回答 2

0

经过这么多的试验和错误,我感到很沮丧,并使用旧python-ldap库来添加现有用户。现在我的代码是 和 的混合ldap3ldap

我知道这不是 OP 想要的。但这可能会对某人有所帮助。

这里用户 Dinesh Kumar 已经是组 group1 的一部分。我正在尝试将他添加到另一个成功的组 group2 并且不会打扰现有组

import ldap
import ldap.modlist as modlist

def add_existing_user_to_group(user_name, user_id, group_id):
    """
    :return:
    """

    # ldap expects a byte string.
    converted_user_name = bytes(user_name, 'utf-8')
    converted_user_id = bytes(user_id, 'utf-8')
    converted_group_id = bytes(group_id, 'utf-8')

    # Add all the attributes for the new dn
    ldap_attr = {}
    ldap_attr['uid'] = converted_user_name
    ldap_attr['cn'] = converted_user_name
    ldap_attr['uidNumber'] = converted_user_id
    ldap_attr['gidNumber'] = converted_group_id
    ldap_attr['objectClass'] =  [b'top', b'posixAccount', b'inetOrgPerson']
    ldap_attr['sn'] = b'Kumar'
    ldap_attr['homeDirectory'] = b'/home/users/dkumar'

    # Establish connection to server using ldap
    conn = ldap.initialize(server_uri, bytes_mode=False)
    bind_resp = conn.simple_bind_s("cn=admin,dc=testldap,dc=com", "password")

    dn_new = "cn={},cn={},ou=MyOU,dc=testldap,dc=com".format('Dinesh Kumar','group2')

    ldif = modlist.addModlist(ldap_attr)
    try:
        response = conn.add_s(dn_new, ldif)
    except ldap.error as e:
        response = e
    print(" The response is ", response)
    conn.unbind()
    return response
于 2020-05-15T01:16:40.347 回答
0

上面的行说MY-LDAP-GROUP存在并返回TRUE

返回True只是意味着搜索成功。这并不意味着找到任何东西。里面有东西conn.entries吗?

但我怀疑你真正的问题是不同的。如果是 的源代码ad_add_members_to_groups,那么它需要distinguishedName组的 (注意参数名称group_dn),但您传递的是cn(通用名称)。例如,您的代码应类似于:

addMembersToGroups(conn, ['myuser'], 'CN=MY-LDAP-GROUP,OU=Groups,DC=example,DC=com')

如果您不知道 DN,请distinguishedName从搜索中询问属性。

一句警告:该代码ad_add_members_to_groups在添加新成员之前检索所有当前成员。如果您正在使用具有大量成员的群组,您可能会遇到性能问题(例如,如果群组有 1000 名成员,它会在添加任何人之前加载所有 1000 名成员)。您实际上不需要这样做(您可以添加新成员而无需查看当前成员资格)。我认为他们试图避免的是当您尝试添加已经在组中的人时遇到的错误。但我认为有更好的方法来处理这个问题。如果您只与小团体合作,这对您来说可能并不重要。

于 2020-03-05T13:17:43.653 回答