ldap调用代码分享,可以参考

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
@Time    : 2019/11/14 5:37 PM
@Author  : NoSong
@File    : LdapBaseApi.py
@Software: PyCharm
# 接口文档: https://ldap3.readthedocs.io/
# https://ldap3.readthedocs.io/tutorial_operations.html#
"""ldap_config = {'host': "192.168.13.133",'port': 389,'base_dn': 'dc=domain,dc=com','user': 'admin','password': 'admin',
}from ldap3 import Server, Connection, SUBTREE, ALL_ATTRIBUTES
from ldap3.core.exceptions import LDAPBindError
from ldap3 import MODIFY_REPLACE
from ldap3.utils.dn import safe_rdn
import sys
reload(sys)
sys.setdefaultencoding('utf8')class LDAP(object):def __init__(self, host, port, user, password, base_dn):dn = "cn=%s,%s" % (user, base_dn)self.server = Server(host=host, port=port)self.base_dn = base_dnself.__conn = Connection(self.server, dn, password, auto_bind=True)def add_ou(self, ou, oid):"""参考: https://ldap3.readthedocs.io/tutorial_operations.html#create-an-entry添加oy:param ou: 'ou=测试部,dc=domain,dc=com' 或者 'ou=测试子部门,ou=测试部,dc=domain,dc=com':param oid: 部门id保存至st中:return:"""return self.__conn.add(ou, 'organizationalUnit', {"st": oid})def add_user(self, userid, username, mobile, mail, title, ou_dn, gidnumber=501, alias=None):"""参考: https://ldap3.readthedocs.io/tutorial_operations.html#create-an-entry:param userid:     "linan":param username:   "姓名" cn=姓名:param mobile::param mail:       "xxx@domain.com":param title::param ou_dn:     "ou=运维中心,dc=domain,dc=com":param gidnumber: 501 默认用户组:return:"""l = self.__connobjectclass = ['top', 'person', 'inetOrgPerson', 'posixAccount']add_dn = "cn=%s,%s" % (username, ou_dn)# 也可以随机生成,我先随便写一个值,这个需要自己定义规则password = '%s@qwe' % useriduidNumber = '%s' % userid.strip("xxx")# 添加用户s = l.add(add_dn, objectclass, {'mobile': mobile,'sn': userid,'mail': mail,'userPassword': password,'title': title,'uid': username,'gidNumber': gidnumber,'uidNumber': uidNumber,'homeDirectory': '/home/users/%s' % userid,'loginShell': '/bin/bash'})return sdef get_oudn_by_st(self, st, base_dn=None):"""根据 st值 获取组织dn参考: https://ldap3.readthedocs.io/tutorial_searches.html:param base_dn::param st:  部门id:return: entry"""if not base_dn:base_dn = self.base_dn# 查询ou 中 返回的信息 attribute 包含 ststatus = self.__conn.search(base_dn, '(objectclass=organizationalUnit)', attributes=["st"])if status:flag = Falsefor i in self.__conn.entries:if st:if st in i.entry_attributes_as_dict["st"]:return ielse:return Falseelse:return Falsedef get_object_classes_info(self, objec_classes):"""获取 Ldap中 object_classes的必要参数以及其他信息参考: https://ldap3.readthedocs.io/tutorial_searches.html:param objec_classes: objec_classes:return:"""print self.server.schema.object_classes[objec_classes]def get_userdn_by_mail(self, mail, base_dn=None):"""通过邮箱地址,获取用户dn。部分没有邮箱地址的用户被忽略,不能使用ldap认证参考: https://ldap3.readthedocs.io/tutorial_searches.html:param mail::param base_dn::return:"""if not base_dn:base_dn = self.base_dnstatus = self.__conn.search(base_dn,search_filter='(mail={})'.format(mail),search_scope=SUBTREE,attributes=ALL_ATTRIBUTES,)if status:flag = Falsefor i in self.__conn.entries:# print(i.entry_dn)return ielse:return Falseelse:return Falsedef get_userdn_by_args(self, base_dn=None, **kwargs):"""参考: https://ldap3.readthedocs.io/tutorial_searches.html获取用户dn, 通过 args可以支持多个参数: get_userdn_by_args(mail="xxx@domain.com", uid="姓名")会根据 kwargs 生成 search的内容,进行查询: 多个条件是 & and查询返回第一个查询到的结果,建议使用唯一标识符进行查询这个函数基本可以获取所有类型的数据:param base_dn::param kwargs::return:"""search = ""for k, v in kwargs.items():search += "(%s=%s)" % (k, v)if not base_dn:base_dn = self.base_dnif search:search_filter = '(&{})'.format(search)else:search_filter = ''status = self.__conn.search(base_dn,search_filter=search_filter,search_scope=SUBTREE,attributes=ALL_ATTRIBUTES)if status:return self.__conn.entrieselse:return Falsedef authenticate_userdn_by_mail(self, mail, password):"""验证用户名密码通过邮箱进行验证密码:param mail::param password::return:"""entry = self.get_userdn_by_mail(mail=mail)if entry:bind_dn = entry.entry_dntry:Connection(self.server, bind_dn, password, auto_bind=True)return Trueexcept LDAPBindError:return Falseelse:print("user: %s not exist! " % mail)return Falsedef update_user_info(self, user_dn, action=MODIFY_REPLACE, **kwargs):""":param dn: 用户dn 可以通过get_userdn_by_args,get_userdn_by_mail 获取:param action: MODIFY_REPLACE 对字段原值进行替换  MODIFY_ADD 在指定字段上增加值   MODIFY_DELETE 对指定字段的值进行删除:param kwargs: 要进行变更的信息内容 uid userPassword mail sn gidNumber uidNumber mobile title:return:"""allow_key  = "uid userPassword mail sn gidNumber uidNumber mobile title".split(" ")update_args = {}for k, v in kwargs.items():if k not in allow_key:msg = "字段: %s, 不允许进行修改, 不生效" % kprint(msg)return Falseupdate_args.update({k: [(action, [v])]})print(update_args)status = self.__conn.modify(user_dn, update_args)return statusdef update_user_cn(self, user_dn, new_cn):"""修改cndn: cn=用户,ou=运维部,ou=研发中心,dc=domain,dc=comrdn就是 cn=用户Example:from ldap3.utils.dn import safe_rdnsafe_rdn('cn=b.smith,ou=moved,ou=ldap3-tutorial,dc=demo1,dc=freeipa,dc=org')[cn=b.smith]:param dn::param new_cn::return:"""s = self.__conn.modify_dn(user_dn, 'cn=%s' % new_cn)return sdef update_ou(self, dn, new_ou_dn):"""更换所在的OU:param dn: 要进行变动的DN:param new_ou_dn:  新的OU DN:return:"""rdn = safe_rdn(dn)print(rdn)s = self.__conn.modify_dn(dn, rdn[0], new_superior=new_ou_dn)return sdef delete_dn(self, dn):"""要进行删除的DN:param dn::return:"""# 如果不是以cn开头的需要清理(删除) sub-linkif not dn.startswith("cn"):# 获取dn 下所有 sub Person DN 进行删除allUserEntry = self.get_userdn_by_args(base_dn=dn, objectClass="Person")if allUserEntry:for userentry in allUserEntry:self.__conn.delete(userentry.entry_dn)print("deleting ou %s and delete sub Person DN: %s" % (dn, userentry.entry_dn))# 获取dn 下所有 sub    OU进行删除allOuEntry = self.get_userdn_by_args(base_dn=dn, objectClass="organizationalUnit")if allOuEntry:for ouEntry in reversed(allOuEntry):s = self.__conn.delete(ouEntry.entry_dn)print("deleting ou %s and delete sub organizationalUnit DN: %s" % (dn, ouEntry.entry_dn))else:s = self.__conn.delete(dn)# print(self.__conn.result)return sif __name__ == '__main__':ldapObj = LDAP(**ldap_config)# 同步企业微信 组织架构 to Ldap# 同步企业微信 User  To ldap# -------------------------------# 删除DN, 对DN下的 sub 进行递归删除# s = ldapObj.get_oudn_by_st("1")# status = ldapObj.delete_dn(s.entry_dn)# print(status)# -------------------------------# 验证用户密码# s = ldapObj.authenticate_userdn_by_mail("linan@domain.com", "xxx9999@qwe")# - -----------------------------# 添加用户# s = ldapObj.add_user("xxx9999", "李南", "190283812", "linan@domain.com", "运维",#                  ou_dn="ou=运维中心,dc=domain,dc=com")# --------------------------------# 查询 ou st  组id# s = obj.get_oudn_by_st(st="1")# --------------------------------# 添加OU# obj.add_ou("ou=总部,dc=domain,dc=com", 1)# obj.add_ou("ou=研发中心,ou=总部,dc=domain,dc=com", 2)# --------------------------------# 查询用户是否存在 - 通过 mail  获取用户 dn_entry# ldapObj.get_userdn_by_mail(mail="linan@domain.com")# --------------------------------# 根据 参数 查询用户DN   data = [dn_entry, ...] ,多个参数为 &# data = ldapObj.get_userdn_by_args(cn="李南",mail="xxxx")# --------------------------------# 对指定dn 进行参数修改  多个参数可以一起修改# s = ldapObj.update_user_info(data[0].entry_dn, userPassword="123456")# --------------------------------# 对指定DN 变更 OU-DN# s = ldapObj.update_user_ou(data[0].entry_dn, s.entry_dn)# --------------------------------# 对指定DN 修改CN名称# ldapObj.update_cn(data[0].entry_dn,new_cn="李南男")# --------------------------------# 获取objectClass 详细信息# ldapObj.get_object_classes_info("organizationalUnit")# ldapObj.get_object_classes_info("posixAccount")# ldapObj.get_object_classes_info("inetOrgPerson")# ldapObj.get_object_classes_info("person")# 没有邮箱地址的用户:s = ldapObj.get_userdn_by_args(ou="研发中心")data= ldapObj.get_userdn_by_args(base_dn=s[0].entry_dn, objectclass = "organizationalUnit")for i in data:print(i.entry_dn)# print(s)

LDAP 和 LDAP3 的对比、接口调用(2)相关推荐

  1. LDAP 和 LDAP3 的对比、接口调用(1)

    一.ldap3库和python-ldap两者区别: python-ldap 主要是对OpenLDAP 的封装,同时也支持LDIF, LDAPURLs, LDAPv3.它用C+Python实现,提供的接 ...

  2. 【百度人脸识别】》人脸对比接口的调用

    大概流程: 进入百度云的人脸识别控制台 https://console.bce.baidu.com/?_=1602320265738#/index/overview 创建人脸识别应用 创建完成后,点击 ...

  3. 实现API接口调用--来源阿里云大学-归档

    # API的概念和基本实现 P.S.这篇文章的价值在于做了视频内容的复练,不用再盯着视频过一遍 from:来自阿里云大学的免费学习课程,实现API接口调用 时间戳:2020年8月21日11:00:15 ...

  4. python api调用百度ai平台_Python 百度AI接口调用

    接口调用准备 1.进入网站: https://console.bce.baidu.com/?_=1535519624081&fromai=1#/aip/overview 2.选择产品服务里的文 ...

  5. 企业微信自建引用接口调用报错[ErrorCode:301002]not allow operate another agent with this accesstoken

    1. 首先,在构建构造网页授权链接时,其中的参数agentid需要和你的自建应用id一致. 使用管理员账号登录网页版企业微信,查看AgentId 2. 使用accessToken对比agentid是否 ...

  6. PHP-微信开发之图灵机器人--天气接口调用

    微信开发中,图灵机器人回复.天气.翻译.美食.地图.二维码功能,随处可见.大小网站.APP都在运用这项技术在项目中.今天简单介绍一下图灵机器人回复,天气接口调用.翻译接口,希望对朋友们有用. 效果案例 ...

  7. 菜鸟裹裹快递查询接口调用

    为什么80%的码农都做不了架构师?>>>    声明:本文所有的内容只作学习使用. 菜鸟裹裹是阿里巴巴旗下菜鸟网络的产品,可用于查询淘宝的快递单号,除了快递状态.进程,还包含了淘宝发 ...

  8. 微服务如何限制接口调用次数

    这种限制接口调用次数的方式,我们通常称之为限流,那么为什么要做限流呢,一般有两种原因: 1. 首先是防止服务提供方被大量的请求击垮 我们开发一个项目,最理想的状况是有多少请求,都可以正常地响应,但是在 ...

  9. Go 学习笔记(71)— Go 接口 interface (接口定义、接口实现、接口调用、值接收者、指针接收者)

    1. 接口的定义 接口是和调用方的一种约定,它是一个高度抽象的类型,不用和具体的实现细节绑定在一起.接口要做的是定义好约定,告诉调用方自己可以做什么,但不用知道它的内部实现,这和我们见到的具体的类型如 ...

最新文章

  1. .net反射详解(转)
  2. make的使用和Makefile规则和编程及其基本命令(简单)
  3. SpingBoot-Thymeleaf-bootstrapTable-分页之H5
  4. [论文阅读] (11)ACE算法和暗通道先验图像去雾算法(Rizzi | 何恺明老师)
  5. Azure恢复服务-使用Windows Backup恢复文件
  6. 再见Windows C++
  7. Java架构师具备的特点有哪些?
  8. ecshop活动页_ecshop 促销活动,如每人只限购1件
  9. SqlServer还原数据库出现“无法在服务器上访问指定的路径或文件”提示的解决办法
  10. Python绘制散点对比图
  11. Jersey the RESTful Web Services in Java
  12. android 广告字幕,Android编程实现类似天气预报图文字幕垂直滚动效果的方法
  13. MySQL调用存储过程和函数
  14. 百望系统网络配置服务器地址,各省百旺参数设置服务器地址
  15. OI中常见的数学符号
  16. 如何取得/etiantian文件的权限对应的数字内容,如-rw-r--r-- 为644,要求使用命令取...
  17. Java面试知识点(六十三)Java反射
  18. 孙鑫视频VC++深入详解学习笔记
  19. Microsoft OneNote - 图片文字提取
  20. 3种CSS3实现的网页过度效果代码,可独立用于网页设计展示

热门文章

  1. 洛谷P1007——独木桥 解法 (C++)
  2. fiddler配置手机连接电脑抓取手机APP的包
  3. OpenHarmony3.0如何轻松连接华为云IoT设备接入平台?
  4. 为什么用企业微信做私域运营
  5. c语言中编译解释,C语言既可以编译执行又可以解释执行吗? 编译执行怎么解释? 解释执行又怎么解释?...
  6. 股票历史数据-股票历史数据查询怎么查?怎么查股票历史数据?
  7. 怎样对别的计算机进行远程协助,如何控制别人的电脑?教你如何远程协助
  8. C++11新特性总结
  9. 4路电梯调度——pair program总结
  10. 阐述什么是B2BCRM?