我设置了ldap变量:
ldap_server = "ldaps://server:636"
ldap_username = "sec-admin@server"
ldap_pw = "<pw>"
dn = 'OU=ou1,OU=ou2,OU=ou3,OU=ou4,DC=dc1,DC=dc2,DC=dc3,DC=com'
并成功连接到服务器:
import sys
import ldap
import ldap.modlist as modlist
try:
ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)
l = ldap.initialize(ldap_server)
l.set_option(ldap.OPT_REFERRALS, 0)
l.set_option(ldap.OPT_PROTOCOL_VERSION, 3)
l.set_option(ldap.OPT_X_TLS, ldap.OPT_X_TLS_DEMAND)
l.set_option(ldap.OPT_X_TLS_DEMAND, True)
l.set_option(ldap.OPT_DEBUG_LEVEL, 255)
l.simple_bind_s(ldap_username, ldap_pw)
except ldap.LDAPError as e:
print(e)
并且能够搜索:
search_scope = ldap.SCOPE_SUBTREE
retrieve_attributes = None
search_filter = "(objectClass=group)"
try:
l_search = l.search(dn, search_scope, search_filter, retrieve_attributes)
result_status, result_data = l.result(l_search, 0)
print("-----------------------------------")
print(result_data)
print("-----------------------------------")
except ldap.LDAPError as e:
print(e)
返回:
-----------------------------------
[]
-----------------------------------
但是如果我尝试添加一个安全组:
# creating a group
attr = {}
attr['objectClass'] = [b'group', b'top']
attr['groupType'] = b'-2147483646'
attr['cn'] = b'blah-blah-1'
attr['name'] = b'blah-blah-1'
attr['sAMAccountName'] = b'blah-blah-1'
ldif = modlist.addModlist(attr)
print(ldif)
l.add_s(dn, ldif)
我得到一个错误:
[('objectClass', [b'group', b'top']), ('groupType', b'-2147483646'),
('cn', b'blah-blah-1'), ('name', b'blah-blah-1'),
('sAMAccountName', b'blah-blah-1')]
dap.ALREADY_EXISTS: {'msgtype': 105, 'msgid': 3, 'result': 68,
'desc': 'Already exists', 'ctrls': [],
'info': '00002071: UpdErr: DSID-030503CF, problem 6005 (ENTRY_EXISTS), data 0n'}
我做错了什么?
如果这里发布的脚本是完整的,那么您使用的是重复的DN——您试图使用其父OU的DN创建组对象(当然已经存在(。
传递给";添加";操作必须是新对象的DN,而不是其父对象的DN。因为某些对象类型(可能不在AD架构中,但通常在其他LDAP系统中(可以从几个不同的命名属性中进行选择,因此DN不会自动确定。