当前位置: 首页 > 后端技术 > Python

ldap3官方文档学习增删改查操作

时间:2023-03-25 23:30:57 Python

前言公司部门使用ldap3进行培训,布置了作业,于是开始阅读官方文档进行学习。我开始直接查看LDAP操作部分。主要是官方文档提供了增删改查的接口。您需要了解功能和参数,然后才能使用它们。添加操作官方添加函数defadd(self,dn,object_class=None,attributes=None,controls=None)参数一一解释:dn:标识要添加的对象的名称object_class:标志类的名称要添加的,它可以包含单个值或字符串属性列表:带有{'attr1':'val1','attr2':'val2',…}或{'attr1':['val1','val2',…],…}等基于值的字典控制:发送附加信息请求#定义一个不安全的LDAP服务器,请求有关DSE和模式的信息#定义连接c=Connection(s,user='user_dn',password='user_password')#执行添加操作c.add('cn=user1,ou=users,o=company',['inetOrgPerson','posixGroup','top'],{'sn':'user_sn','gidNumber':0})#相当于上面的c.add('cn=user1,ou=users,o=company',attributes={'objectClass':['inetOrgPerson','posixGroup','top'],'sn':'user_sn',gidNumber:0})print(c.result)#关闭连接c.unbind()主要是add函数传递三个参数:dn,object_class,属性。dn包含用户cn、ou、o等信息删除官方删除函数defdelete(self,dn,controls=None):参数一一解释:dn:标识要删除的目标名称controls:发送一个从ldap3importServer,Connection,ALL请求附加信息示例user='user_dn',password='user_password')#执行删除操作c.delete('cn=user1,ou=users,o=company')print(c.result)#关闭连接c.unbind()主要是将参数传递给删除函数:dn。dn包含用户cn、ou、o等信息修改官方修改函数defmodify(self,dn,changes,controls=None):参数一一解释:dn:标识要删除的目标名称changes:一个要显示在特定条目处修改的字典控件:发送附加信息请求示例#importclassandconstantsfromldap3importServer,Connection,ALL,MODIFY_REPLACE#definetheservers=Server('servername',get_info=ALL)#define一个不安全的LDAP服务器,请求有关DSE和模式的信息ou=users,o=company',{'givenName':[(MODIFY_REPLACE,['givenname-1-replaced'])],'sn':[(MODIFY_REPLACE,['sn-replaced'])]})print(c.result)#closeconnectionc.unbind()主要是给modify函数传递两个参数:dn和changes。dn包含用户cn,ou,o等信息变化包含修改前的数据类别和修改后的数据查询操作官方搜索函数defsearch(self,search_base,search_filter,search_scope=SUBTREE,dereference_aliases=DEREF_ALWAYS,attributes=None,size_limit=0,time_limit=0,types_only=False,get_operational_attributes=False,controls=None,paged_size=None,paged_criticality=False,paged_cookie=None):参数一一解释:search_base:查询请求的依据search_filter:的过滤器查询请求,必须符合LDAP过滤语法RFC4515标准search_scope:具体指定查询内容的部分BASE:查询search_base中指定条目的属性。LEVEL:查询包含在search_base中的条目的属性。基础对象必须引用容器对象。SUBTREE:向下钻取在search_base和所有从属容器中指定的条目的属性。attributes:查询返回的单个属性或属性列表(默认为None)。如果属性为None,则不返回任何属性。如果属性是ALL_ATTRIBUTES或ALL_OPERATIONAL_ATTRIBUTES,则返回所有用户属性或所有操作属性。举例fromldap3importServer,Connection,SUBTREEtotal_entries=0server=Server('test-server')c=Connection(server,user='username',password='password')c.search(search_base='o=test',search_filter='(objectClass=inetOrgPerson)',search_scope=SUBTREE,attributes=['cn','givenName'],paged_size=5)total_entries+=len(c.response)forentryinc.response:print(entry['dn'],entry['attributes'])cookie=c.result['controls']['1.2.840.113556.1.4.319']['value']['cookie']whilecookie:c.search(search_base='o=test',search_filter='(objectClass=inetOrgPerson)',search_scope=SUBTREE,attributes=['cn','givenName'],paged_size=5,paged_cookie=cookie)total_entries+=len(c.response)cookie=c.result['controls']['1.2.840.113556.1.4.319']['value']['cookie']用于在c.response中输入:print(entry['dn'],entry['属性'])打印('Totalentriesretrieved:',total_entries)主要是表示搜索函数传递四个参数:search_base,search_filter,search_scope,attributessearch_base:一般就是前面三个操作使用的dnsearch_filter:默认是'(objectClass=inetOrgPerson)'search_scope:我用的是SUBTREEattributes:我用的是ALL_ATTRIBUTES增删改查完整版代码的增删改查操作都是从Excel表中读取数据。#编码:utf8importsysimportjsonfromldap3importConnection,Server,ALL,MODIFY_ADD,MODIFY_REPLACE,SUBTREE,ALL_ATTRIBUTES,ALL_OPERATIONAL_ATTRIBUTEImportutilsfromconfigimportBASE_DN,LDAP_TEST_CONFIG,LDAP_PROD_CONFIG,GROUP_DNShost="xxx.xxx.xxx.xxx"port=xxxuser=cnxxx,dc=xx,dc=xxx"password="xxx"#??创建连接server=Server(host=host,port=port,get_info=ALL)conn=Connection(server=server,auto_bind=True,read_only=False,fast_decoder=True,check_names=True,user=user,password=password)#检查连接是否成功deftest_connection():print(server.info)print(conn.user)print(conn.extend.standard.who_am_i())#获取用户defget_users():conn.search(search_base="dc=xxx,dc=xxx",attributes=ALL_ATTRIBUTES,search_filter='(objectclass=person)')print(conn.result)res=conn.response_to_json()res=json.loads(res)['条目']返回重新sprint("====================测试连接====================")test_connection()打印(“\n\n\n===================打印用户====================")print(get_users())ldap_config={}excel_file_path="ldap-users-example.xlsx"ldap_user_excel_file=excel_file_path#批量添加组织人员defadd_users():#读取用户excel信息userattrs=utils.generate_ldap_userattrs(ldap_user_excel_file)#print(userattrs)print("\n\n\n=====================开始添加用户===========================")foruser_dn,userattrinuserattrs.items():#添加用户conn.add(user_dn,['top','inetOrgPerson','posixAccount'],userattr)res=conn.result#用户已经存在ifres['result']!=0:msg=res['description']print("添加用户失败:%sres:%s"%(user_dn,res))continue#添加用户到用户组,直接添加到cn=xx组。如果没有这个操作,则不会添加到cn。对于GROUP_DNS中的GROUP_DN:conn.modify(GROUP_DN,{'uniqueMember':[(MODIFY_ADD,user_dn)]})#print("====修改结果=====")res=conn.resultmsg="success"ifres['result']!=0:msg=res['message']print("添加用户到组:%sres:%s"%(GROUP_DN,msg))continueprint(user_dn,"success")print("=====================添加用户iscomplete=========================")#批量删除组织人员defdelete_users():#读取用户excel信息userattrs=utils.generate_ldap_userattrs(ldap_user_excel_file)#print(userattrs)print("\n\n\n=====================开始删除用户==========================")foruser_dn,userattrinuserattrs.items():#删除用户conn.delete(user_dn)res=conn.resultprint(user_dn,"success")print("=====================删除用户完成=========================")#修改人员信息defmodify_users():#读取用户excel信息userattrs=utils.generate_ldap_userattrs(ldap_user_excel_file)#print(userattrs)print("\n\n\n=====================开始修改用户信息=========================")foruser_dn,userattrinuserattrs.items():#修改用户的部门和工作地点conn.modify(user_dn,{'physicalDeliveryOfficeName':[(MODIFY_REPLACE,['武汉研发组'])],'l':[(MODIFY_REPLACE,['武汉'])]})res=conn.resultprint(user_dn,"success")print("===================用户信息修改完成=========================")#查询人员信息defsearch_users():#读取用户excel信息userattrs=utils.generate_ldap_userattrs(ldap_user_excel_file)#print(userattrs)print("\n\n\n======================开始查询用户信息=========================")foruser_dn,userattrinuserattrs.items():#查询用户print(user_dn)status=conn.search(search_base=user_dn,search_filter='(objectClass=inetOrgPerson)',search_scope=SUBTREE,attributes=ALL_ATTRIBUTES)ifstatus:print(user_dn,"success")else:print(user_dn,"failed")print("====================查询用户信息===========================""test_connection()get_users()search_users()add_users()delete_users()modify_users()search_users()#关闭连接conn.unbind()参考Ldap3库使用方法-完整版修改连接Ldap3库使用方法(1)python使用ldap3进行接口调用增删改查ldap--附demo