Python 脚本:将 AD 域用户和组同步到 OpenLDAP
以下是一个使用 Python 编写的脚本示例,可以将 AD 域的用户和组信息同步到 OpenLDAP。
import ldap
import ldap.modlist as modlist
import win32com.client
# 连接 AD 域
ad = win32com.client.Dispatch('ADsNameSpaces').GetObject('WinNT://domain_name')
# 连接 OpenLDAP
ldap_server = 'ldap://ldap_server'
ldap_bind_dn = 'cn=admin,dc=example,dc=com'
ldap_bind_pw = 'password'
ldap_base_dn = 'dc=example,dc=com'
l = ldap.initialize(ldap_server)
l.simple_bind_s(ldap_bind_dn, ldap_bind_pw)
# 读取 AD 域用户和组信息
users = []
groups = []
for u in ad.Children:
if u.Class == 'User':
users.append(u.Name)
elif u.Class == 'Group':
groups.append(u.Name)
# 同步用户信息
for user in users:
# 查询用户是否已存在
search_filter = '(uid={})'.format(user)
result = l.search_s(ldap_base_dn, ldap.SCOPE_SUBTREE, search_filter)
if not result:
# 用户不存在,创建新用户
dn = 'uid={},{}'.format(user, ldap_base_dn)
attrs = {
'objectClass': ['top', 'person', 'organizationalPerson', 'inetOrgPerson'],
'cn': user,
'uid': user
}
ldif = modlist.addModlist(attrs)
l.add_s(dn, ldif)
print('Created user: {}'.format(user))
else:
# 用户已存在,更新用户信息
dn = result[0][0]
attrs = {
'cn': [(ldap.MOD_REPLACE, [user])]
}
ldif = modlist.modifyModlist(result[0][1], attrs)
l.modify_s(dn, ldif)
print('Updated user: {}'.format(user))
# 同步组信息
for group in groups:
# 查询组是否已存在
search_filter = '(cn={})'.format(group)
result = l.search_s(ldap_base_dn, ldap.SCOPE_SUBTREE, search_filter)
if not result:
# 组不存在,创建新组
dn = 'cn={},{}'.format(group, ldap_base_dn)
attrs = {
'objectClass': ['top', 'posixGroup'],
'cn': group,
'gidNumber': '1000' # 这里可以设置一个递增的 gidNumber
}
ldif = modlist.addModlist(attrs)
l.add_s(dn, ldif)
print('Created group: {}'.format(group))
else:
# 组已存在,更新组信息
dn = result[0][0]
attrs = {
'cn': [(ldap.MOD_REPLACE, [group])]
}
ldif = modlist.modifyModlist(result[0][1], attrs)
l.modify_s(dn, ldif)
print('Updated group: {}'.format(group))
# 关闭连接
l.unbind_s()
需要注意的是,这个脚本假设 AD 域和 OpenLDAP 使用的属性名和对象类都是一致的,如果不一致的话需要进行相应的修改。此外,这个脚本没有考虑密码同步的问题,需要根据实际情况进行处理。
原文地址: https://www.cveoy.top/t/topic/oh4g 著作权归作者所有。请勿转载和采集!