0%

ldap添加用户脚本

ldap添加用户脚本

因每次添加用户步骤繁琐且ldap字段较多比较容易输错,故写一个了用户添加的脚本,这里地址以及ldap认证信息已经写死了,无需修改。

介绍

脚本主要需要命令行传参就行了,示例如下

1
python ldapAddUser.py 张三 李四

传入单个或多个用户名都可以,但传入非中文会返回报错。创建了以后登录账号为:姓拼音+名字拼音 ,密码是随机生成的10为字符串(字母/数字)。创建完成会将账号密码打印至屏幕上面。

依赖模块

1
pypinyin,random,ldap3,string,argparse,re

效果示例

image-20230423163139445

脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import ldap3
from pypinyin import pinyin, lazy_pinyin
import random
import string
import argparse
import re

#readme:在命令行调用传入用户名字参数会自动写入到ldap,生成用户名以及密码。传入格式为 python ldap1.py 张三,如果有多个用户则 python ldap1.py 张三 李四 。传入的格式必须是中文,否则会返回错误。

def generate_random_password(length=8): #生成随机密码函数
"""生成指定长度的随机密码"""
# 定义包含各种字符的备选字符串
characters = string.ascii_letters + string.digits #+ string.punctuation(这个是随机字符,不需要)

# 从备选字符串中随机选择指定数量的字符,拼接成密码字符串
password = ''.join(random.choices(characters, k=length))

return password


# 设置LDAP服务器信息
server = ldap3.Server('ldap://192.168.110.200:1389')
dn = 'cn=admin,dc=finsiot,dc=com' # 这里是管理员的DN
password = '123456'

# 添加新用户
def ldap_adduser(name): #添加用户函数,也是这里主要功能提供的函数
pwd = generate_random_password(10) # 密码,随机生成10位由字母和数字组合的密码
name_pinyin = lazy_pinyin(name) # 将名字转换成拼音
first_name = name_pinyin[0] #姓拼音
last_name = ''.join(name_pinyin[1:]) #名拼音
name_head = first_name[0] # 姓首字母加名字母
uid = name_head + last_name # 姓首字母加名字母,一般用于登录用户名,登录用户名格式为:姓拼音+名字拼音
mail = first_name + '.' + last_name + '@finsiot.com' #邮件格式拼接,由于公司邮箱格式为:姓.名字@finsiot.com
with ldap3.Connection(server, user=dn, password=password) as conn:
new_user = {
'objectClass': ['top', 'person', 'inetOrgPerson'],
#"objectClass"是条目的一个必需属性,用于指定该条目所属的对象类。对象类是定义LDAP目录树中条目类型的一种机制,包含一组属性和规范,用于描述条目应该具有哪些属性和如何使用这些属性。LDAP支持多继承的对象类模型,这意味着条目可以同时属于多个对象类。
#objectclass是属性定义类,也是顶级类,下面的所有字段都来自于objectclass提供。
'userPassword': f'{pwd}',
'mail': f'{mail}',
'uid': f'{uid}',
'description': f'{name}', #姓名
'givenName': f'{first_name}', #姓氏
'sn': f'{last_name}', #名
}
try:
cn = first_name + ' ' + last_name #cn
conn.add(f'cn={cn},ou=test,dc=finsiot,dc=com', attributes=new_user)
#print('New user created successfully!')
except ldap3.LDAPExceptionError as e:
print(f'Error creating new user: {e}')
# 断开与LDAP服务器的连接
conn.unbind()
return uid,pwd



# 创建参数解析器
parser = argparse.ArgumentParser()
# 添加一个参数,类型为 list
parser.add_argument('mylist', nargs='+', type=str)
# 解析参数
args = parser.parse_args()
# 检查 mylist 参数是否都是中文字符
if not all(re.match('^[\u4e00-\u9fa5]+$', item) for item in args.mylist):
parser.error('请输入正确的名字,所有参数都必须是中文字符。')
# 访问 mylist 参数
name = args.mylist
#上面的代码主要是判断命令行传入参数是否为中文,最终的参数保存为列表并存于name变量


#轮询name并执行添加用户操作,最后打印用户名密码
for i in name:
usernameAndPassword=ldap_adduser(i)
print(f'用户{i}已创建成功,账号为:{usernameAndPassword[0]},密码为:{usernameAndPassword[1]}')

脚本中需要改的地方

1
2
3
4
5
6
server = ldap3.Server('ldap://xxx:389') 改成自己服务器地址
password = '123456' 管理员dn的密码
dn = 'cn=admin,dc=xxx,dc=com' 管理员DN地址
conn.add(f'cn={cn},ou=people,dc=xxx,dc=com', attributes=new_user) ou=people,dc=xxx,dc=com改成自己服务器ldap的用户路径
new_user这个集合根据自己公司需求修改,这里userPassword、email字段是固定的,givenName、sn是姓和名,其实是可选字段。uid这里是作为用户名字段(姓首字母拼音+名拼音),description是中文姓名(这个非固定字段,可以选用其他字段)
总结:这里email邮箱、userpassword密码是固定字段,uid一般会作为用户名并且以姓首字母拼音+名拼音的格式来组成,cn则是姓拼音+空格+名拼音。description是我自己选用的字段用于存储中文名字。

脚本注意事项

ldap模块本身没有很好能返回创建成功或者失败的返回日志信息,所以请求时如果失败,这边脚本是无法返回也不知道的,只能在服务器ldap日志上面看到失败的日志然后排查处理失败原因

1