《并行分布式》这门课程,需要小组进行该实验,由于网上大多都是安装配置以及简单的修改文件操作,所以在此基础上,自己使用python的ldap3库对LDAP进行增删改查操作,并设计出操作界面,代码比较冗余,请谅解!
Windows下安装
https://blog.csdn.net/heyitian/article/details/53508663#commentBox
我的安装教程,参考本博客!

还有这篇博客:https://blog.csdn.net/Jarrrrr/article/details/99681405#commentBox

需要注意的点是:如果自己新建了mydemo.ldif,需要一条导入该文件的dos命令行的命令:ldapadd -f ./mydemo.ldif
我的mydemo.ldif是长这样的,
#o=Classmates,dc=cn
#配置一个公司
dn: dc=wto,dc=com
objectclass: domain
objectclass: top
dc: wto
#定义俩部门
dn: ou=InformationofEngineering,dc=wto,dc=com
objectclass: organizationalUnit
ou: InformationofEngineering
description: Container for InformationofEngineering entries
dn: ou=SchoolofComputerScience,dc=wto,dc=com
objectclass: organizationalUnit
ou: SchoolofComputerScience
description: Container for SchoolofComputerScience entries
#添加成员
dn: uid=2019224003,ou=InformationofEngineering,dc=wto,dc=com
uid: 2019224003
objectClass: inetOrgPerson
mail: pityk3369@gmail.com
userPassword: 123456
sn: Yang
cn: Yang Kang
dn: uid=2019224002,ou=SchoolofComputerScience,dc=wto,dc=com
uid: 2019224002
objectClass: inetOrgPerson
userPassword: 123456
sn: Guo
cn: Jing Guo
# 学院一:信息工程学院
#dn: ou=SchoolofInformationEngineering,dc=university,dc=com
#objectclass: organizationalUnit
#ou: SchoolofInformationEngineering
#description: School of Information Engineering Students
# 学院二:公路学院
#dn: ou=SchoolofComputerScience,dc=university,dc=com
#objectclass: organizationalUnit
#ou: SchoolofComputerScience
#description: Container for School of ComputerScience Students
为大家重新推荐一个LDAP的管理器,可为后面自己的程序操作时,提供实时的检验。

网上该程序的安装教程应该有很多,自己动动手~我来讲讲成功导入自己修改的数据后,如何登陆LdapAdmin
LdapAdmin的使用
登陆界面是这样的:

在你的slapd.conf文件中,你的suffix "dc=wto,dc=com"就是你的Base,Host就是你的IP地址,端口号389不变。
如果你仅仅需要在LdapAdmin中进行查看的操作,那么勾选下放的匿名登陆就可以。
但是你如果还需要在LdapAdmin中进行增删改查的功能,那就需要登录。Username就是slapd.conf文件中的rootdn,Password就是"secret",你在安装配置OpenLDAP时的默认密码。


注意:测试连接时,请保证在dos界面下,"slapd -d 1"进行了LDAP服务器启动命令。
以上信息填写完成后,进行“测试连接“,如果连接成功,那么恭喜;没有成功,请再看一遍上述的过程。

这就是我的电脑的LdapAdmin登录后的界面,里面的内容,是我之前做实验已经增加进去的。
如果你是用管理员账号登录的,那么就恭喜了,你可以在LdapAdmin里进行增删改查条目、部门。

解释一下:
dc=wto,dc=com:这代表你的登录用户名,之后程序的任何操作都是基于此
三个ou="......":这代表LDAP里存在三个部门,分别是...,...,...
uid=一串数字:这代表部门里面人员,uid是区别他们的唯一标识符,相当于数据库里的主键
点进去看看人员信息:

mail:就不多说了
userPassword:这个暂时没有用到,就先放在这里吧
sn:人员的姓
cn:人员的全称
objectClass:LDAP内置的一些类
uid:学号,相当于唯一标识符
好了,LdapAdmin的使用,也就这么简单,接下就直接把程序copy上来吧!
使用ldap3进行简单操作
首先需要在python环境下,安装ldap3库,官方文档:https://ldap3.readthedocs.io/tutorial_intro.html
389端口绑定
from ldap3 import Server, Connection, ALL
import time
server = Server('192.168.43.122')
conn = Connection(server)
time.sleep(1)
if(conn.bind()):
flag = True
port_info.set("389端口首次绑定成功!")
tkinter.messagebox.showinfo('Welcome!', '389端口绑定成功!')
查看服务器信息
server = Server('192.168.43.122')
conn = Connection(server)
#print(server.info)
管理员登录
server = Server('192.168.43.122',get_info=ALL)
#print(new_name.get())
#print(new_pwd_confirm.get())
conn = Connection(server, user="cn=Manager,dc=wto,dc=co",
password="secret", auto_bind=True)
增删改查
官方文档里有详细的例子~ 后面的程序也有根据我自己的例子。

程序代码:
# -*- coding: utf-8 -*-
"""
Created on Wed Nov 6 09:37:20 2019
@author: Administrator
"""
import tkinter as tk # 使用Tkinter前需要先导入
from ldap3 import Server, Connection, ALL
import time
import tkinter.messagebox
# 第1步,实例化object,建立窗口window
window = tk.Tk()
# 第2步,给窗口的可视化起名字
window.title('LDAP管理~')
# 第3步,设定窗口的大小(长 * 宽)
window.geometry('680x680') # 这里的乘是小x
# 第4步,在图形界面上设定标签
l = tk.Label(window, text='LDAP管理系统', font=('Arial', 20), width=30, height=2)
# 说明: bg为背景,font为字体,width为长,height为高,这里的长和高是字符的长和高,比如height=2,就是标签有2个字符这么高
# 第5步,放置标签
l.pack() # Label内容content区域放置位置,自动调节尺寸
# 放置lable的方法有:1)l.pack(); 2)l.place();
global server
global conn
flag = False
global ou_lists
port_info = tk.StringVar() # 将label标签的内容设置为字符类型,用var来接收hit_me函数的传出内容用以显示在标签上
def Bind_port():
global flag
global server
global conn
# window_sign_up = tk.Toplevel(window)
# window_sign_up.geometry('300x200')
# window_sign_up.title('Search users')
if flag == False:
try:
server = Server('192.168.43.122')
conn = Connection(server)
time.sleep(1)
if(conn.bind()):
flag = True
port_info.set("389端口首次绑定成功!")
tkinter.messagebox.showinfo('Welcome!', '389端口绑定成功!')
# 然后销毁窗口。
# window_sign_up.destroy()
except:
tkinter.messagebox.showinfo('Sorry!', '389端口绑定失败!')
# 然后销毁窗口。
# window_sign_up.destroy()
else:
#flag = False
#print(server.info)
port_info.set("389端口绑定成功!")
# 在窗口界面设置放置Button按键
b = tk.Button(window, text='绑定端口', width=20, height=1, command=Bind_port)
b.pack()
l = tk.Label(window, textvariable=port_info, bg='white', fg='black', font=('Arial', 10), width=30, height=2)
l.pack()
server_info = tk.StringVar()
def see_info():
global server
global conn
if flag==False:
server = Server('192.168.43.122')
conn = Connection(server)
#print(server.info)
server_info.set(server.info)
tkinter.messagebox.showinfo('服务器信息~', server_info.get())
b_see_info = tk.Button(window, text='查看服务器信息', width=20, height=2, command=see_info)
b_see_info.pack()
l_see_info = tk.Label(window, textvariable=server_info, bg='white', fg='black', font=('Arial', 10), width=30, height=2)
l_see_info.pack()
log_in_info = tk.StringVar()
# 登录到服务器
#user必须为 'Domain名称\\用户名' , 或者'域名\\用户名'
def log_in():
global server
global conn
global log_in_info
def server_login():
global server
global conn
global log_in_info
server = Server('192.168.43.122',get_info=ALL)
#print(new_name.get())
#print(new_pwd_confirm.get())
conn = Connection(server, user=new_name.get(), password=new_pwd_confirm.get(), auto_bind=True)
#print(conn)
log_in_info.set("登陆者"+conn.extend.standard.who_am_i())
#time.sleep(5)
#print(server.info)
if(server.info!=None):
tkinter.messagebox.showinfo('Welcome', 'You have successfully signed up!')
# 然后销毁窗口。
window_sign_up.destroy()
# 定义长在窗口上的窗口
window_sign_up = tk.Toplevel(window)
window_sign_up.geometry('300x200')
window_sign_up.title('Log In')
new_name = tk.StringVar() # 将输入的注册名赋值给变量
new_name.set('cn=Manager,dc=wto,dc=com') # 将最初显示定为'example@python.com'
tk.Label(window_sign_up, text='User name: ').place(x=10, y=10) # 将`User name:`放置在坐标(10,10)。
entry_new_name = tk.Entry(window_sign_up, textvariable=new_name
,width=30) # 创建一个注册名的`entry`,变量为`new_name`
entry_new_name.place(x=60, y=10) # `entry`放置在坐标(150,10).
new_pwd_confirm = tk.StringVar()
new_pwd_confirm.set('secret')
tk.Label(window_sign_up, text='password: ').place(x=10, y=60)
entry_usr_pwd_confirm = tk.Entry(window_sign_up, textvariable=new_pwd_confirm, show='*'
,width=30)
entry_usr_pwd_confirm.place(x=60, y=60)
# 下面的 sign_to_Hongwei_Website
btn_comfirm_sign_up = tk.Button(window_sign_up, text='Log in', command=server_login)
btn_comfirm_sign_up.place(x=60, y=110)
b_log_in = tk.Button(window, text='登录服务器', width=20, height=1, command=log_in)
b_log_in.pack()
l_log_in = tk.Label(window,font=('Arial', 10),textvariable=log_in_info, bg='white', fg='black', width=30, height=2)
l_log_in.pack()
#conn = Connection(server, user="cn=Manager,dc=wto,dc=com", password="secret", auto_bind=True)
Context_manager_info = tk.StringVar()
# 连接上下文管理器
import re
def Context_manager():
global conn
def search_users():
global conn
global ou_lists
ou_lists=[]
ous=""
flag=False
if(conn.search(search_base.get(),search_filter.get())):
flag=True
for ou in conn.entries:
pat='ou=[a-z_A-Z]+,'
res=str(re.findall(pat,str(ou)))
#print(res[5:-3])
ou_lists.append(res[5:-3])
ous+=res[5:-3]+"\n"
print(ou_lists)
if(flag==True):
tkinter.messagebox.showinfo('Congratulation!', "存在以下部门:\n"+ous)
# 然后销毁窗口。
window_sign_up.destroy()
window_sign_up = tk.Toplevel(window)
window_sign_up.geometry('300x200')
window_sign_up.title('管理器')
search_base = tk.StringVar() # 将输入的注册名赋值给变量
search_base.set('dc=wto,dc=com') # 将最初显示定为'example@python.com'
tk.Label(window_sign_up, text='公司名称:').place(x=10, y=10) # 将`User name:`放置在坐标(10,10)。
entry_new_name = tk.Entry(window_sign_up, textvariable=search_base,width=50) # 创建一个注册名的`entry`,变量为`new_name`
entry_new_name.place(x=60, y=30) # `entry`放置在坐标(150,10).
search_filter = tk.StringVar()
# 使用自己输入时,请注释掉下面这行即可
search_filter.set("(objectclass=organizationalUnit)")
tk.Label(window_sign_up, text='部门属性: ').place(x=10, y=90)
entry_usr_pwd_confirm = tk.Entry(window_sign_up, textvariable=search_filter,width=50)
entry_usr_pwd_confirm.place(x=60, y=110)
# 下面的 sign_to_Hongwei_Website
btn_comfirm_search = tk.Button(window_sign_up, text='Log in', command=search_users)
btn_comfirm_search.place(x=90, y=160)
b_Context_manager = tk.Button(window, text='Entry管理器', width=20, height=2, command=Context_manager)
b_Context_manager.pack()
l_Context_manager = tk.Label(window,
font=('Arial', 10), width=30, height=1)
l_Context_manager.pack()
# 增加部门
add_ou_info = tk.StringVar()
def add_ou():
global conn
def ou_add():
global conn
dn=entry_new_dn.get()
objectclass=entry_new_objectclass.get()
dic={}
print(dn)
dic['description']=entry_new_description.get()
if(conn.add(dn,objectclass,dic)):
tkinter.messagebox.showinfo('Welcome',"添加成功!")
# 然后销毁窗口。
window_sign_up.destroy()
else:
tkinter.messagebox.showinfo('Sorry',"添加失败!")
# 然后销毁窗口。
window_sign_up.destroy()
window_sign_up = tk.Toplevel(window)
window_sign_up.geometry('600x400')
window_sign_up.title('增加部门')
dn = tk.StringVar() # 将输入的注册名赋值给变量
dn.set('ou=XXX,dc=wto,dc=com') # 将最初显示定为'example@python.com'
tk.Label(window_sign_up, text='dn:').place(x=10, y=10) # 将`User name:`放置在坐标(10,10)。
entry_new_dn = tk.Entry(window_sign_up, textvariable=dn,
width=50) # 创建一个注册名的`entry`,变量为`new_name`
entry_new_dn.place(x=60, y=30) # `entry`放置在坐标(150,10).
# 第二个属性:objectclass
objectclass = tk.StringVar()
objectclass.set("organizationalUnit")
tk.Label(window_sign_up, text='objectclass: ').place(x=10, y=90)
entry_new_objectclass = tk.Entry(window_sign_up, textvariable=objectclass,
width=50)
entry_new_objectclass.place(x=60, y=120)
# 第三个属性
description = tk.StringVar()
description.set("Container for OU's name entries")
tk.Label(window_sign_up, text='description: ').place(x=10, y=170)
entry_new_description = tk.Entry(window_sign_up, textvariable=description,
width=50)
entry_new_description.place(x=60, y=200)
# 下面的 sign_to_Hongwei_Website
btn_comfirm_add = tk.Button(window_sign_up, text='ADD', command=ou_add)
btn_comfirm_add.place(x=60, y=290)
b_add_ou = tk.Button(window, text='增加部门', width=20, height=1, command=add_ou)
b_add_ou.pack()
l_add_ou = tk.Label(window, textvariable=add_ou_info, font=('Arial', 10), width=30, height=1)
l_add_ou.pack()
def del_ou():
global conn
def ou_del():
global conn
ou=entry_new_ou.get()
print(ou)
base='ou='+ou+',dc=wto,dc=com'
if(conn.delete(base)):
tkinter.messagebox.showinfo('Welcome',"解散成功!")
# 然后销毁窗口。
window_sign_up.destroy()
else:
tkinter.messagebox.showinfo('Sorry',"解散失败!")
# 然后销毁窗口。
window_sign_up.destroy()
window_sign_up = tk.Toplevel(window)
window_sign_up.geometry('300x200')
window_sign_up.title('解散部门')
ou = tk.StringVar() # 将输入的注册名赋值给变量
ou.set('ou name') # 将最初显示定为'example@python.com'
tk.Label(window_sign_up, text='ou:').place(x=20, y=30) # 将`User name:`放置在坐标(10,10)。
entry_new_ou = tk.Entry(window_sign_up, textvariable=ou,
width=20) # 创建一个注册名的`entry`,变量为`new_name`
entry_new_ou.place(x=60, y=30) # `entry`放置在坐标(150,10).
btn_comfirm_add = tk.Button(window_sign_up, text='解散', command=ou_del)
btn_comfirm_add.place(x=60, y=60)
b_del_ou = tk.Button(window, text='解散部门', width=20, height=1, command=del_ou)
b_del_ou.pack()
l_del_ou = tk.Label(window, textvariable=add_ou_info, font=('Arial', 10),
width=30, height=1)
l_del_ou.pack()
# 添加人员
add_entry_info = tk.StringVar()
def add_entry():
global conn
def entry_add():
global conn
dic={}
if(var1.get()==1):
ou=',ou=backoffice,dc=wto,dc=com'
if(var2.get()==1):
ou=',ou=InformationofEngineering,dc=wto,dc=com'
if(var3.get()==1):
ou=',ou=SchoolofcomputerScience,dc=wto,dc=com'
if(var4.get()==1):
ou=',ou=schoolofforeignlanguage,dc=wto,dc=com'
dic['mail']=entry_new_mal.get()
dic['userPassword']=entry_new_userPassword.get()
dic['sn']=entry_new_sn.get()
dic['cn']=entry_new_cn.get()
print(dic)
#print(dn.get())
#print(objectclass.get())
dns=dn.get()+ou
print(dns)
if(conn.add(dns,objectclass.get(),dic)):
tkinter.messagebox.showinfo('Welcome',"添加成功!")
# 然后销毁窗口。
window_sign_up.destroy()
else:
tkinter.messagebox.showinfo('Sorry',"添加失败!")
# 然后销毁窗口。
window_sign_up.destroy()
window_sign_up = tk.Toplevel(window)
window_sign_up.geometry('600x400')
window_sign_up.title('Add ENTRY')
var1 = tk.IntVar() # 定义var1和var2整型变量用来存放选择行为返回值
var2 = tk.IntVar()
var3 = tk.IntVar() # 定义var1和var2整型变量用来存放选择行为返回值
var4 = tk.IntVar()
c1 = tk.Checkbutton(window_sign_up, text='backoffice',variable=var1, onvalue=1,
offvalue=0) # 传值原理类似于radiobutton部件
c1.pack()
c2 = tk.Checkbutton(window_sign_up, text='InformationofEngineering',variable=var2, onvalue=1,
offvalue=0)
c2.pack()
c3 = tk.Checkbutton(window_sign_up, text='SchoolofcomputerScience',variable=var3, onvalue=1,
offvalue=0) # 传值原理类似于radiobutton部件
c3.pack()
c4 = tk.Checkbutton(window_sign_up, text='schoolofforeignlanguage',variable=var4, onvalue=1,
offvalue=0)
c4.pack()
dn = tk.StringVar() # 将输入的注册名赋值给变量
dn.set('uid=2019224XXX') # 将最初显示定为'example@python.com'
tk.Label(window_sign_up, text='dn:').place(x=10, y=110) # 将`User name:`放置在坐标(10,10)。
entry_new_dn = tk.Entry(window_sign_up, textvariable=dn,
width=50) # 创建一个注册名的`entry`,变量为`new_name`
entry_new_dn.place(x=80, y=110) # `entry`放置在坐标(150,10).
dn.set(entry_new_dn.get())
# 第二个属性:objectclass
objectclass = tk.StringVar()
objectclass.set("inetOrgPerson")
obl=tk.Label(window_sign_up, text='objectclass: ')
obl.place(x=10, y=140)
entry_new_objectclass = tk.Entry(window_sign_up, textvariable=objectclass,
width=50)
entry_new_objectclass.place(x=80, y=140)
objectclass.set(entry_new_objectclass.get())
# 第三个属性们
mail = tk.StringVar()
mail.set("XXX@gamil.com")
mal=tk.Label(window_sign_up, text='mail: ')
mal.place(x=10, y=170)
entry_new_mal = tk.Entry(window_sign_up, textvariable=mail,
width=50)
entry_new_mal.place(x=80, y=170)
userPassword = tk.StringVar()
userPassword.set("6位数字")
tk.Label(window_sign_up, text='Password: ').place(x=10, y=200)
entry_new_userPassword = tk.Entry(window_sign_up, textvariable=userPassword,
width=50,show='*')
entry_new_userPassword.place(x=80, y=200)
sn = tk.StringVar()
sn.set("姓")
tk.Label(window_sign_up, text='sn: ').place(x=10, y=230)
entry_new_sn = tk.Entry(window_sign_up, textvariable=sn,
width=50)
entry_new_sn.place(x=80, y=230)
cn = tk.StringVar()
cn.set("全名")
tk.Label(window_sign_up, text='cn: ').place(x=10, y=270)
entry_new_cn = tk.Entry(window_sign_up, textvariable=cn,
width=50)
entry_new_cn.place(x=80, y=270)
# 下面的 sign_to_Hongwei_Website
btn_comfirm_add = tk.Button(window_sign_up, text='ADD', command=entry_add)
btn_comfirm_add.place(x=250, y=290)
b_add_entry = tk.Button(window, text='增加条目', width=20, height=1,
command=add_entry)
b_add_entry.pack()
l_add_entry = tk.Label(window, textvariable=add_entry_info,
font=('Arial', 10), width=30, height=1)
l_add_entry.pack()
# 查询人员
search_entry_info = tk.StringVar()
def search_entry():
global conn
#ou_lists=["backoffice","InformationofEngineering","SchoolofComputerScience","school_of_foreign_languages"]
def entry_search():
global ou_lists
count=0
context=""
flag=False
uid=entry_uid.get()
cn=entry_cn.get()
if(len(cn)<=1):
searchfilter='(&(objectClass=inetOrgPerson)(uid='+uid+'))' # 将最初显示定为'example@python.com'
else:
searchfilter='(&(objectClass=inetOrgPerson)(cn='+cn+'))'
#print(search_filter)
for ou in ou_lists:
searchbase = 'ou='+ou+',dc=wto,dc=com'
#print(searchbase)
if(conn.search(search_base=searchbase, search_filter=searchfilter,
attributes=['objectclass','uid','mail', 'userPassword', 'sn','cn'])):
flag=True
count += len(conn.response)
for entry in conn.entries:
print(entry)
context+=str(entry)
context+="\n"
#print((entry['userPassword']))
if(flag==True):
tkinter.messagebox.showinfo('查询结果如下:',context)
window_sign_up.destroy()
else:
tkinter.messagebox.showinfo('Sorry',"无此人员信息!请重试!")
window_sign_up.destroy()
window_sign_up = tk.Toplevel(window)
window_sign_up.geometry('300x200')
window_sign_up.title('查询条目~')
# 根据账号/学生姓名继续查询
# 第一个属性:uid
uid = tk.StringVar() # 将输入的注册名赋值给变量
tk.Label(window_sign_up, text='账号:').place(x=10, y=10) # 将`User name:`放置在坐标(10,10)。
entry_uid = tk.Entry(window_sign_up, textvariable=uid,
width=20) # 创建一个注册名的`entry`,变量为`new_name`
entry_uid.place(x=60, y=10) # `entry`放置在坐标(150,10).
# 第一个属性:cn
cn = tk.StringVar() # 将输入的注册名赋值给变量
tk.Label(window_sign_up, text='姓名:').place(x=10, y=60) # 将`User name:`放置在坐标(10,10)。
entry_cn = tk.Entry(window_sign_up, textvariable=cn,
width=20) # 创建一个注册名的`entry`,变量为`new_name`
entry_cn.place(x=60, y=60) # `entry`放置在坐标(150,10).
# 下面的 sign_to_Hongwei_Website
btn_search = tk.Button(window_sign_up, text='查找该人员信息', command=entry_search)
btn_search.place(x=60, y=110)
b_search_entry = tk.Button(window, text='查询条目', width=20, height=1,
command=search_entry)
b_search_entry.pack()
l_search_entry = tk.Label(window, textvariable=add_entry_info,
font=('Arial', 10), width=30, height=1)
l_search_entry.pack()
# 修改条目
def modify_entry():
global conn
global uid1,sn1,cn1,mail1,userPassword1
uid1=""
sn1=""
cn1=""
mail1=""
userPassword1 =""
#ou_lists=["backoffice","InformationofEngineering","SchoolofComputerScience","school_of_foreign_languages"]
def entry_look():
global ou_lists
global uid1,sn1,cn1,mail1,userPassword1,ou1
count=0
context=""
def entry_modify():
from ldap3 import MODIFY_ADD, MODIFY_REPLACE, MODIFY_DELETE
ncn=entry_new_cn.get()
nsn=entry_new_sn.get()
nmail=entry_new_mail.get()
npw=entry_new_pw.get()
dic={}
dic['mail']=nmail
dic['userPassword']=npw
dic['sn']=nsn
dic['cn']=ncn
print(ou1[2:-2])
base="uid="+uid+","+str(ou1[2:-2])+",dc=wto,dc=com"
print(base)
print("ncn="+ncn)
if(cn1!=ncn and conn.modify(base, {'cn': [(MODIFY_REPLACE, [ncn])]})):
print("cn修改成功!")
flagcn=True
if(sn1!=nsn and conn.modify(base, {'sn': [(MODIFY_REPLACE, [nsn])]})):
print("sn修改成功!")
flagsn=True
if(mail1!=nmail and conn.modify(base, {'mail': [(MODIFY_REPLACE, [nmail])]})):
print("mail修改成功!")
flagmail=True
if(userPassword1!=npw and conn.modify(base, {'userPassword': [(MODIFY_REPLACE, [npw])]})):
print("密码修改成功!")
flagpw=True
if(flagpw or flagsn or flagcn or flagmail):
tkinter.messagebox.showinfo('Congratulation!',"此人员信息修改成功!")
window_sign_up.destroy()
else:
tkinter.messagebox.showinfo('Sorry',"此人员信息修改失败!")
window_sign_up.destroy()
flag_modify=False
uid=entry_uid.get()
searchfilter='(&(objectClass=inetOrgPerson)(uid='+uid+'))' # 将最初显示定为'example@python.com'
#print(search_filter)
for ou in ou_lists:
searchbase = 'ou='+ou+',dc=wto,dc=com'
#print(searchbase)
if(conn.search(search_base=searchbase, search_filter=searchfilter,
attributes=['objectclass','uid','mail', 'userPassword', 'sn','cn'])):
flag_modify=True
count += len(conn.response)
for entry in conn.entries:
print(entry)
context+=str(entry)
context+="\n"
pat='ou=[a-z_A-Z]+'
ou1=str(re.findall(pat,context))
print(ou)
#print((entry['DN']))
print(entry['sn'])
print(entry['cn'])
print(entry['uid'])
print(entry['mail'])
print(entry['userPassword'])
sn1=(entry['sn'])
cn1=(entry['cn'])
uid1=(entry['uid'])
mail1=(entry['mail'])
userPassword1=(entry['userPassword'])
# 第一个属性:uid
# 第一个属性:cn
new_cn = tk.StringVar() # 将输入的注册名赋值给变量
new_cn.set(cn1)
tk.Label(window_sign_up, text='新姓名:').place(x=10, y=150) # 将`User name:`放置在坐标(10,10)。
entry_new_cn = tk.Entry(window_sign_up, textvariable=new_cn,
width=50) # 创建一个注册名的`entry`,变量为`new_name`
entry_new_cn.place(x=60, y=150) # `entry`放置在坐标(150,10).
new_sn = tk.StringVar() # 将输入的注册名赋值给变量
new_sn.set(sn1)
tk.Label(window_sign_up, text='新名字:').place(x=10, y=180) # 将`User name:`放置在坐标(10,10)。
entry_new_sn = tk.Entry(window_sign_up, textvariable=new_sn,
width=50) # 创建一个注册名的`entry`,变量为`new_name`
entry_new_sn.place(x=60, y=180) # `entry`放置在坐标(150,10).
new_mail = tk.StringVar() # 将输入的注册名赋值给变量
new_mail.set(mail1)
tk.Label(window_sign_up, text='新邮箱:').place(x=10, y=210) # 将`User name:`放置在坐标(10,10)。
entry_new_mail = tk.Entry(window_sign_up, textvariable=new_mail,
width=50) # 创建一个注册名的`entry`,变量为`new_name`
entry_new_mail.place(x=60, y=210) # `entry`放置在坐标(150,10).
new_pw = tk.StringVar() # 将输入的注册名赋值给变量
new_pw.set(userPassword1)
tk.Label(window_sign_up, text='新密码:').place(x=10, y=240) # 将`User name:`放置在坐标(10,10)。
entry_new_pw = tk.Entry(window_sign_up, textvariable=new_pw,
width=50) # 创建一个注册名的`entry`,变量为`new_name`
entry_new_pw.place(x=60, y=240) # `entry`放置在坐标(150,10).
btn_search = tk.Button(window_sign_up, text='确认修改~', command=entry_modify)
btn_search.place(x=60, y=270)
if(flag_modify==False):
tkinter.messagebox.showinfo('Sorry',"无此人员信息!请重试!")
window_sign_up.destroy()
window_sign_up = tk.Toplevel(window)
window_sign_up.geometry('600x400')
window_sign_up.title('条目信息修改~')
# 根据账号/学生姓名继续查询
# 第一个属性:uid
uid = tk.StringVar() # 将输入的注册名赋值给变量
tk.Label(window_sign_up, text='账号:').place(x=10, y=30) # 将`User name:`放置在坐标(10,10)。
entry_uid = tk.Entry(window_sign_up, textvariable=uid,
width=50) # 创建一个注册名的`entry`,变量为`new_name`
entry_uid.place(x=60, y=30) # `entry`放置在坐标(150,10).
# # 第一个属性:cn
# cn = tk.StringVar() # 将输入的注册名赋值给变量
# tk.Label(window_sign_up, text='姓名:').place(x=10, y=60) # 将`User name:`放置在坐标(10,10)。
# entry_cn = tk.Entry(window_sign_up, textvariable=cn,
# width=50) # 创建一个注册名的`entry`,变量为`new_name`
# entry_cn.place(x=60, y=60) # `entry`放置在坐标(150,10).
# 修改按钮
btn_search = tk.Button(window_sign_up, text='查询该人员信息~', command=entry_look)
btn_search.place(x=60, y=90)
print()
b_modify_entry = tk.Button(window, text='修改条目', width=20, height=1,
command=modify_entry)
b_modify_entry.pack()
l_modify_entry = tk.Label(window, textvariable=add_entry_info,
font=('Arial', 10), width=30, height=1)
l_modify_entry.pack()
def delete_entry():
global conn
def entry_del_look():
global ou_lists
global uid1,sn1,cn1,mail1,userPassword1,ou1
count=0
context=""
flag=False
def entry_delete():
base="uid="+str(uid1)+","+str(ou1[2:-2])+",dc=wto,dc=com"
print(base)
if(conn.delete(base)):
tkinter.messagebox.showinfo('Yes',"删除成功~~")
window_sign_up.destroy()
uid=entry_uid.get()
cn=entry_cn.get()
if(len(cn)<=1):
searchfilter='(&(objectClass=inetOrgPerson)(uid='+uid+'))' # 将最初显示定为'example@python.com'
else:
searchfilter='(&(objectClass=inetOrgPerson)(cn='+cn+'))'
#print(search_filter)
for ou in ou_lists:
searchbase = 'ou='+ou+',dc=wto,dc=com'
#print(searchbase)
if(conn.search(search_base=searchbase, search_filter=searchfilter,
attributes=['objectclass','uid','mail', 'userPassword', 'sn','cn'])):
flag=True
count += len(conn.response)
for entry in conn.entries:
print(entry)
context+=str(entry)
context+="\n"
pat='ou=[a-z_A-Z]+'
ou1=str(re.findall(pat,context))
print(ou1)
#print((entry['DN']))
#print(entry['sn'])
#print(entry['cn'])
print(entry['uid'])
#print(entry['mail'])
#print(entry['userPassword'])
sn1=(entry['sn'])
cn1=(entry['cn'])
uid1=(entry['uid'])
mail1=(entry['mail'])
userPassword1=(entry['userPassword'])
# 第一个属性:cn
new_cn = tk.StringVar() # 将输入的注册名赋值给变量
new_cn.set(cn1)
tk.Label(window_sign_up, text='姓名:').place(x=10, y=150) # 将`User name:`放置在坐标(10,10)。
entry_new_cn = tk.Entry(window_sign_up, textvariable=new_cn,
width=50) # 创建一个注册名的`entry`,变量为`new_name`
entry_new_cn.place(x=60, y=150) # `entry`放置在坐标(150,10).
new_mail = tk.StringVar() # 将输入的注册名赋值给变量
new_mail.set(mail1)
tk.Label(window_sign_up, text='邮箱:').place(x=10, y=180) # 将`User name:`放置在坐标(10,10)。
entry_new_mail = tk.Entry(window_sign_up, textvariable=new_mail,
width=50) # 创建一个注册名的`entry`,变量为`new_name`
entry_new_mail.place(x=60, y=180) # `entry`放置在坐标(150,10).
new_ou = tk.StringVar() # 将输入的注册名赋值给变量
new_ou.set(ou1[5:-2])
tk.Label(window_sign_up, text='部门:').place(x=10, y=210) # 将`User name:`放置在坐标(10,10)。
entry_new_ou = tk.Entry(window_sign_up, textvariable=new_ou,
width=50) # 创建一个注册名的`entry`,变量为`new_name`
entry_new_ou.place(x=60, y=210) # `entry`放置在坐标(150,10).
# 修改按钮
btn_search = tk.Button(window_sign_up, text='确认删除~', command=entry_delete)
btn_search.place(x=60, y=240)
if(flag==False):
tkinter.messagebox.showinfo('Sorry',"无此人员信息!请重试!")
window_sign_up.destroy()
window_sign_up = tk.Toplevel(window)
window_sign_up.geometry('600x400')
window_sign_up.title('删除条目~')
# 根据账号/学生姓名继续查询
# 第一个属性:uid
uid = tk.StringVar() # 将输入的注册名赋值给变量
tk.Label(window_sign_up, text='学号:').place(x=10, y=30) # 将`User name:`放置在坐标(10,10)。
entry_uid = tk.Entry(window_sign_up, textvariable=uid,
width=50) # 创建一个注册名的`entry`,变量为`new_name`
entry_uid.place(x=60, y=30) # `entry`放置在坐标(150,10).
# 第一个属性:cn
cn = tk.StringVar() # 将输入的注册名赋值给变量
tk.Label(window_sign_up, text='姓名:').place(x=10, y=60) # 将`User name:`放置在坐标(10,10)。
entry_cn = tk.Entry(window_sign_up, textvariable=cn,
width=50) # 创建一个注册名的`entry`,变量为`new_name`
entry_cn.place(x=60, y=60) # `entry`放置在坐标(150,10).
# 查询按钮
btn_search = tk.Button(window_sign_up, text='查询待删除人员信息', command=entry_del_look)
btn_search.place(x=60, y=90)
b_delete_entry = tk.Button(window, text='删除条目', width=20, height=1,
command=delete_entry)
b_delete_entry.pack()
# 第6步,主窗口循环显示
window.mainloop()
# 注意,loop因为是循环的意思,window.mainloop就会让window不断的刷新,如果没有mainloop,就是一个静态的window,传入进去的值就不会有循环,mainloop就相当于一个很大的while循环,有个while,每点击一次就会更新一次,所以我们必须要有循环
# 所有的窗口文件都必须有类似的mainloop函数,mainloop是窗口文件的关键的关键。
这篇博客详细介绍了在Windows环境下安装配置LDAP,并使用LdapAdmin管理工具进行操作。同时,通过Python的ldap3库演示了如何进行增删改查,包括389端口绑定、查看服务器信息和管理员登录等步骤。

1152

被折叠的 条评论
为什么被折叠?



