以下是一个使用 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 使用的属性名和对象类都是一致的,如果不一致的话需要进行相应的修改。此外,这个脚本没有考虑密码同步的问题,需要根据实际情况进行处理。

Python 脚本:将 AD 域用户和组同步到 OpenLDAP

原文地址: https://www.cveoy.top/t/topic/oh4g 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录