LDAP操作实例

这篇博客详细介绍了在Windows环境下安装配置LDAP,并使用LdapAdmin管理工具进行操作。同时,通过Python的ldap3库演示了如何进行增删改查,包括389端口绑定、查看服务器信息和管理员登录等步骤。

《并行分布式》这门课程,需要小组进行该实验,由于网上大多都是安装配置以及简单的修改文件操作,所以在此基础上,自己使用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是窗口文件的关键的关键。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值