我设置了我的 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 0\n'}
我做错了什么?
如果此处发布的脚本已完成,则您正在使用重复的 DN – 您正在尝试使用其父 OU 的 DN(当然已经存在)创建组对象。
传递给“添加”操作的 DN 必须是 new 对象的 DN,而不是其父对象的 DN,因为某些对象类型(可能不在 AD 模式中,但通常在其他 LDAP 系统中)可以从几种不同的命名属性中进行选择因此 DN 不会自动确定(例如 posixAccount 可以通过其 CN 或 UID 命名)。
new_dn = "CN=%s,%s" % (ldap.dn.escape_dn_chars(cn), parent_dn)