使用python脚本编写一个读取AD域中已存在的组与用户信息同步到openldap中如果openldap中已经存在账号则更新如果不存在则创建
以下是一个实现该功能的Python脚本:
import ldap
import ldap.modlist as modlist
import csv
# OpenLDAP连接配置
l = ldap.initialize("ldap://localhost:389")
l.simple_bind_s("cn=admin,dc=my-domain,dc=com", "admin_password")
# 读取AD域中的组信息
with open('groups.csv', newline='') as csvfile:
reader = csv.reader(csvfile, delimiter=',', quotechar='"')
for row in reader:
group_dn = "cn=" + row[0] + ",ou=Groups,dc=my-domain,dc=com"
group_entry = {
"objectClass": ["top", "groupOfNames"],
"cn": [row[0]],
"member": [f"cn={user},ou=Users,dc=my-domain,dc=com" for user in row[1:]]
}
try:
# 如果组已经存在则更新,否则创建
l.modify_s(group_dn, modlist.modifyModlist(l.search_s(group_dn, ldap.SCOPE_BASE)[0][1], group_entry))
except ldap.NO_SUCH_OBJECT:
l.add_s(group_dn, modlist.addModlist(group_entry))
# 读取AD域中的用户信息
with open('users.csv', newline='') as csvfile:
reader = csv.reader(csvfile, delimiter=',', quotechar='"')
for row in reader:
user_dn = "cn=" + row[0] + ",ou=Users,dc=my-domain,dc=com"
user_entry = {
"objectClass": ["top", "person", "organizationalPerson", "inetOrgPerson"],
"cn": [row[0]],
"sn": [row[1]],
"givenName": [row[2]],
"mail": [row[3]],
"userPassword": [row[4]],
}
try:
# 如果用户已经存在则更新,否则创建
l.modify_s(user_dn, modlist.modifyModlist(l.search_s(user_dn, ldap.SCOPE_BASE)[0][1], user_entry))
except ldap.NO_SUCH_OBJECT:
l.add_s(user_dn, modlist.addModlist(user_entry))
l.unbind_s()
该脚本假设已经从AD域中导出了两个CSV文件:一个包含组信息,一个包含用户信息。每行都是一个条目,以逗号分隔各个字段,例如:
groups.csv:
Group1,User1,User2
Group2,User3,User4,User5
users.csv:
User1,LastName1,FirstName1,user1@my-domain.com,password1
User2,LastName2,FirstName2,user2@my-domain.com,password2
User3,LastName3,FirstName3,user3@my-domain.com,password3
User4,LastName4,FirstName4,user4@my-domain.com,password4
User5,LastName5,FirstName5,user5@my-domain.com,password5
脚本通过LDAP协议连接到OpenLDAP服务器,并使用管理员凭据进行身份验证。然后,它循环遍历CSV文件中的每个组和用户条目,并使用LDAP modify或add操作将它们添加到或更新到OpenLDAP中。如果组或用户已经存在,则使用modify操作更新其属性,否则使用add操作创建一个新的条目。最后,脚本断开与OpenLDAP的连接
原文地址: https://www.cveoy.top/t/topic/fHvK 著作权归作者所有。请勿转载和采集!