Ldap3 库的使用方法
发表于:2024-11-23 作者:千家信息网编辑
千家信息网最后更新 2024年11月23日,本篇内容介绍了"Ldap3 库的使用方法"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!以下是代码汇总
千家信息网最后更新 2024年11月23日Ldap3 库的使用方法
本篇内容介绍了"Ldap3 库的使用方法"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
以下是代码汇总版:
#!/usr/bin/env python# -*- coding: utf-8 -*-import jsonfrom ldap3 import ALL_ATTRIBUTES# 注意:ldap3库如果要使用tls(安全连接),需要ad服务先安装并配置好证书服务,才能通过tls连接,否则连接测试时会报LDAPSocketOpenError('unable to open socket'# 如果是进行账号密码修改及账户激活时,会报错:"WILL_NOT_PERFORM"from ldap3 import Connection, NTLM, Serverfrom ldap3 import MODIFY_REPLACEserver1 = Server("adtest.com", port=636, use_ssl=True, get_info=ALL, connect_timeout=5)LDAP_SERVER_POOL = [server1]SERVER_USER = 'adtest\\administrator'SERVER_PASSWORD = "XXXXXXX"class AD(object): ''' AD用户操作 ''' def __init__(self): '''初始化''' self.conn = Connection( #配置服务器连接参数 server=LDAP_SERVER_POOL, auto_bind=True, authentication=NTLM, #连接Windows AD需要配置此项 read_only=False, #禁止修改数据:True user=SERVER_USER,#管理员账户 password=SERVER_PASSWORD, ) self.leaved_base_dn = 'ou=Leaved,dc=adtest,dc=intra'#离职账户所在OU self.active_base_dn = 'ou=测试部门,dc=adtest,dc=intra'#正式员工账户所在OU self.search_filter = '(objectclass=user)'#只获取【用户】对象 self.ou_search_filter = '(objectclass=organizationalUnit)'#只获取【OU】对象 def users_get(self): '''获取所有的用户''' self.conn.search(search_base=self.active_base_dn,search_filter=self.search_filter,attributes=ALL_ATTRIBUTES) res = self.conn.response_to_json() res = json.loads(res)['entries'] return res def OU_get(self): '''获取所有的OU''' self.conn.search(search_base=self.active_base_dn,search_filter=self.ou_search_filter,attributes=ALL_ATTRIBUTES) res = self.conn.response_to_json() res = json.loads(res)['entries'] return res def create_obj(self,dn,type,attr=None): ''' 新建用户or 部门,User需要设置密码,激活账户 :param dn: dn = "ou=人事部3,ou=罗辑实验室,dc=adtest,dc=intra" # 创建的OU的完整路径 dn = "cn=张三,ou=人事部3,ou=罗辑实验室,dc=adtest,dc=intra" # 创建的User的完整路径 :param type:选项:ou or user :param attr = {#User 属性表,需要设置什么属性,增加对应的键值对 "SamAccountName": "zhangsan", # 账号 "EmployeeID":"1", # 员工编号 "Sn": "张", # 姓 "name": "张三", "telephoneNumber": "12345678933", "mobile": "12345678933", "UserPrincipalName":"zhangsan@adtest.com", "Mail":"zhangsan@adtest.com", "Displayname": "张三", "Manager":"CN=李四,OU=人事部,DC=adtest,DC=com",#需要使用用户的DN路径 } attr = {#OU属性表 'name':'人事部', 'managedBy':"CN=张三,OU=IT组,OU=罗辑实验室,DC=adtest,DC=intra", #部分负责人 } :return:True and success 是创建成功了 (True, {'result': 0, 'description': 'success', 'dn': '', 'message': '', 'referrals': None, 'type': 'addResponse'}) ''' object_class = {'user':['user', 'posixGroup', 'top'], 'ou':['organizationalUnit', 'posixGroup', 'top'], } res = self.conn.add(dn=dn,object_class=object_class[type],attributes=attr) if type == "user": # 如果是用户时,我们需要给账户设置密码,并把账户激活 self.conn.extend.microsoft.modify_password(dn, "XXXXXXXXX") #设置用户密码 self.conn.modify(dn, {'userAccountControl': [('MODIFY_REPLACE',512)]}) #激活用户 return res, self.conn.result def del_obj(self,DN): ''' 删除用户 or 部门 :param DN: :return:True ''' res = self.conn.delete(dn=DN) return res def update_obj(self, dn, attr): '''更新员工 or 部门属性 先比较每个属性值,是否和AD中的属性一致,不一样的记录,统一update 注意: 1. attr中dn属性写在最后 2. 如果name属性不一样的话,需要先变更名字(实际是变更原始dn为新name的DN),后续继续操作update and move_object User 的 attr 照如下格式写: dn = "cn=test4,ou=IT组,dc=adtest,dc=com" #需要移动的User的原始路径 {#updateUser需要更新的属性表 "Sn": "李", # 姓 "telephoneNumber": "12345678944", "mobile": "12345678944", "Displayname": "张三3", "Manager":"CN=李四,OU=人事部,DC=adtest,DC=com",#需要使用用户的DN路径 'DistinguishedName':"cn=张三,ou=IT组,dc=adtest,dc=com" #用户需要移动部门时,提供此属性,否则不提供 } OU 的 attr 格式如下: dn = "ou=人事部,dc=adtest,dc=com" #更新前OU的原始路径 attr = { 'name':'人事部', 'managedBy':"CN=张三,OU=IT组,DC=adtest,DC=com", 'DistinguishedName': "ou=人事部,dc=adtest,dc=com" # 更新后的部门完整路径 } ''' changes_dic = {} for k,v in attr.items(): if not self.conn.compare(dn=dn,attribute=k,value=v): if k == "name": res = self.__rename_obj(dn=dn,newname=attr['name']) # 改过名字后,DN就变了,这里调用重命名的方法 if res['description'] == "success": if "CN" == dn[:2]: dn = "cn=%s,%s" % (attr["name"], dn.split(",", 1)[1]) if "OU" == dn[:2]: dn = "DN=%s,%s" % (attr["name"], dn.split(",", 1)[1]) if k == "DistinguishedName": # 如果属性里有"DistinguishedName",表示需要移动User or OU self.__move_object(dn=dn,new_dn=v) # 调用移动User or OU 的方法 changes_dic.update({k:[(MODIFY_REPLACE,[v])]}) self.conn.modify(dn=dn,changes=changes_dic) return self.conn.result def __rename_obj(self,dn,newname): ''' OU or User 重命名方法 :param dn:需要修改的object的完整dn路径 :param newname: 新的名字,User格式:"cn=新名字";OU格式:"OU=新名字" :return:返回中有:'description': 'success', 表示操作成功 {'result': 0, 'description': 'success', 'dn': '', 'message': '', 'referrals': None, 'type': 'modDNResponse'} ''' self.conn.modify_dn(dn,newname) return self.conn.result def compare_attr(self,dn,attr,value): '''比较员工指定的某个属性 ''' res = self.conn.compare(dn=dn,attribute=attr,value=value) return res def __move_object(self,dn,new_dn): '''移动员工 or 部门到新部门''' relative_dn,superou = new_dn.split(",",1) res = self.conn.modify_dn(dn=dn,relative_dn=relative_dn,new_superior=superou) return resdef check_credentials(username, password): """ 用户认证接口 # """ ldap_user = '\\{}@adtest.intra'.format(username) server = Server('adtest.intra', use_ssl=True) connection = Connection(server, user=ldap_user, password=password, authentication=NTLM) try: logger.info("username:%s ;res: %s" %(username,connection.bind())) return connection.bind() except: logger.warning("username:%s ;res: %s" % (username, connection.bind())) return False finally: connection.closed
"Ldap3 库的使用方法"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
属性
用户
人事
路径
部门
人事部
账户
张三
方法
名字
员工
移动
密码
格式
激活
更新
原始
实验室
实验
服务
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
将服务器拆分可以说成
故城县委网络安全办公室
怎么应对 网络安全事件
网络安全管理机构材料
客房管理系统数据库设计
软件开发开具的普通发票
中花人民共和国网络安全法
网络技术和通信技术结合
金融专业数据库有哪些
删除数据库用户以及数据库
要学计算机软件开发具备什么条件
jdbc与数据库连接的方法
linux服务器运维手册
网络安全防护方案与建议
长沙做嵌入式软件开发怎么样
百度云服务器怎么添加安全组
网络安全动态监测和在线防御
生日快乐无法连接服务器
崂山区游戏软件开发公司
软件开发英文解释一下
sim900a 服务器
肇庆应用软件开发市场价
计算机网络技术智能家居方向
qt界面软件开发工程师
网络安全考核实施细则
数据库技术标杆
服务器有多少个英文单词
山东网络技术服务
太原学习网络安全
郑州驰瀚网络技术有限公司