python-ldap 创建组返回“已存在”(在空 OU 和不存在的 sAMAccountName 中)

问题描述 投票:0回答:1

我设置了我的 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'}

我做错了什么?

python ldap network-security-groups
1个回答
2
投票

如果此处发布的脚本已完成,则您正在使用重复的 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)
© www.soinside.com 2019 - 2024. All rights reserved.