通过python-ldap操作管理AD/LDAP用户及组织结构

LDAP/AD是两种应用最广泛的认证服务器,AD是微软基于LDAP开发而成的,应用于Windows平台,而LDAP主要应用于Linux平台(LDAP用在Windows平台比较少)。既然AD是基于LDAP的扩展,则LDAP大部分协议,AD均可原生支持,这位我们操作和管理AD认证服务器提供了大大的便利。

在软件开发过程中,很多公司都采用AD/LDAP用于自己的用户认证体系,本文重点研究通过Python语言提供的Python-Ldap框架,来操作和管理AD/LDAP中的用户,组织结构等,希望对大家有所帮助。

基本概念:

o– organization(组织-公司)
ou – organization unit(组织单元/部门)
c - countryName(国家)
dc - domainComponent(域名组件)
sn – suer name(真实名称)
cn - common name(常用名称)
dn - distinguished name(唯一标识)

AD和LDAP中的字段及含义:

  • 用户表字段对应关系:

    字段描述    表示值
    唯一标识    dn
    用户名 userPrincipalName(AD)/cn(LDAP)
    密码  userPassword
    真实姓名    displayName
    工作地点    physicalDeliveryOfficeName
    职务  title
    邮箱  mail
    个人电话    telephoneNumber
    公司电话    homePhone
  • 组织结构表对应关系:
    字段描述    表示值
    唯一标识    dn
    组织名称    ou
    组织描述    description
  • 在AD中创建用户

import ldap
def create_ad_user(username, unicode_password, org_dn):
    l = ldap.initialize(‘ldap://172.16.1.163:636‘) #use secure port default:636
    l.protocol_version = 3
    l.set_option(ldap.OPT_REFERRALS, 0)
    l.simple_bind_s(‘Administrator‘, ‘P@ssword‘)
    user = {}
    user[‘objectclass‘] = [‘top‘, ‘person‘, ‘organizationalPerson‘, ‘user‘]
    user_dn = ‘cn=%s,%s‘ % (username,org_dn)
    user[‘userPrincipalName‘] = ‘%s@%s‘ % (username, domain)
    user[‘userAccountControl‘] = ‘66048‘ # active user account
    user[‘unicodePwd‘] = unicode_password
    ldif = modlist.addModlist(user)
    ret, _ = l.add_s(user_dn, ldif)
    print ret
  • 在LDAP中创建用户

    import ldap
    def create_ldap_user(username, password, org_dn):
    l = ldap.initialize(‘ldap://172.16.1.163:389‘)
    l.protocol_version = 3
    l.set_option(ldap.OPT_REFERRALS, 0)
    l.simple_bind_s(‘Administrator‘, ‘P@ssword‘)
    user = {}
    user[‘objectclass‘] = [‘top‘, ‘person‘, ‘inetOrgPerson‘]
    user[‘cn‘] = username
    user[‘sn‘] = user[‘cn‘]
    user[‘password‘] = password
    user_dn = ‘cn=%s,%s‘ % (username,org_dn)
    ldif = modlist.addModlist(user)
    ret, _ = l.add_s(user_dn, ldif)
    print ret
  • 修改AD/LDAP用户基本信息
    import ldap
    def modify_user(username):
    firstname = ‘Abel‘
    lastname = ‘Lee‘
    l = ldap.initialize(‘ldap://172.16.1.163:389‘)
    l.protocol_version = 3
    l.set_option(ldap.OPT_REFERRALS, 0)
    l.simple_bind_s(‘Administrator‘, ‘P@ssword‘)
    cn = username
    dn = ‘cn=%s,ou=org1,dc=testad,dc=com‘ % cn
    old = {‘description‘: ‘old description‘}
    new = {‘description‘: ‘new description‘}
    ldif = ldap.modifyModlist(old, new)
    ret = l.modify_s(dn, ldif)
    l.unbind_s()
    print ret
  • 删除AD/LDAP用户
    import ldap
    def delete_users(user_dn):
    l = ldap.initialize(‘ldap://172.16.1.163:389‘)
    l.protocol_version = 3
    l.set_option(ldap.OPT_REFERRALS, 0)
    l.simple_bind_s(‘Administrator‘, ‘P@ssword‘)
    ret = l.delete_s(user_dn)
    l.unbind_s()
    print ret
  • 查询AD用户信息
    import ldap
    def describe_ad_users(org_dn=‘‘, usernames = []):
    l = ldap.initialize(‘ldap://172.16.1.163:389‘)
    l.protocol_version = 3
    l.set_option(ldap.OPT_REFERRALS, 0)
    l.simple_bind_s(‘Administrator‘, ‘P@ssword‘)
    USER_ATTRS = [‘userAccountControl‘,‘displayName‘,‘description‘,‘homePhone‘,‘physicalDeliveryOfficeName‘,‘title‘,‘mail‘,‘telephoneNumber‘]
    filterstr = ‘(&(objectclass=user)‘
    if len(usernames) > 0:
        filterstr = filterstr + ‘(|‘
    for username in usernames:
        username = ‘%s@%s‘ % (username, domain)
        userPrincipalName = ‘(userPrincipalName=%s)‘ % username
        filterstr += userPrincipalName
    if len(usernames) > 0:
        filterstr += ‘))‘
    else:
        filterstr += ‘)‘
    if org_dn:
        ret = l.search_s(org_dn, ldap.SCOPE_SUBTREE, filterstr,
                                           attrlist=USER_ATTRS)
    else:
        ret = l.search_s(base_dn, ldap.SCOPE_SUBTREE, filterstr,
                                           attrlist=USER_ATTRS)
    print ret
  • 查询LDAP中的用户
    import ldap
    def describe_ldap_users(org_dn=‘‘, usernames = []):
    l = ldap.initialize(‘ldap://172.16.1.163:389‘)
    l.protocol_version = 3
    l.set_option(ldap.OPT_REFERRALS, 0)
    l.simple_bind_s(‘Administrator‘, ‘P@ssword‘)
    USER_ATTRS = [‘userAccountControl‘,‘displayName‘,‘description‘,‘homePhone‘,‘physicalDeliveryOfficeName‘,‘title‘,‘mail‘,‘telephoneNumber‘]
    filterstr = ‘(&(objectclass=person)‘
    if len(usernames) > 0:
        filterstr = filterstr + ‘(|‘
    for cn in usernames:
        cn = ‘(cn=%s)‘ % cn
        filterstr += cn
    if len(usernames) > 0:
        filterstr += ‘))‘
    else:
        filterstr += ‘)‘
    if org_dn:
        ret = l.search_s(org_dn, ldap.SCOPE_SUBTREE, filterstr,
                                           attrlist=USER_ATTRS)
    else:
        ret = l.search_s(base_dn, ldap.SCOPE_SUBTREE, filterstr,
                                           attrlist=USER_ATTRS)
    print ret
  • AD用户认证
    import ldap
    def login_ad(user_dn, password):
    l = ldap.initialize(‘ldap://172.16.1.163:389‘)
    l.protocol_version = 3
    l.set_option(ldap.OPT_REFERRALS, 0)
    l.simple_bind_s(user_dn, password)
    cn = user_dn.split(‘,‘)[0].split(‘=‘)
    base_dn = ‘dc=testad,dc=com‘
    domain = ‘testad.com‘
    username = ‘%s@%s‘ % (cn[1], domain)
    ret = l.search_s(base_dn, ldap.SCOPE_SUBTREE,"(userPrincipalName=%s)" % username, ["userPrincipalName"])
    if ret is None or len(ret) == 0:
        return False
    return True
  • LDAP用户认证
    import ldap
    def login_ldap(user_dn, password):
    l = ldap.initialize(‘ldap://172.16.1.163:389‘)
    l.protocol_version = 3
    l.set_option(ldap.OPT_REFERRALS, 0)
    l.simple_bind_s(user_dn, password)
    cn = user_dn.split(‘,‘)[0].split(‘=‘)
    base_dn = ‘dc=testad,dc=com‘
    ret = l.search_s(base_dn, ldap.SCOPE_SUBTREE,"%s=%s" % (cn[0], cn[1]))
    if ret is None or len(ret) == 0:
        return False
    return True
  • 设置AD用户密码,修改AD用户密码可以先认证再设置
    import ldap
    def set_ad_password(user_dn, unicode_password):
    l = ldap.initialize(‘ldap://172.16.1.163:636‘) #use secure port
    l.simple_bind_s(‘Administrator‘, ‘P@ssword‘)
    param_pwd = [(ldap.MOD_REPLACE, ‘unicodePwd‘, [password_utf16]), (ldap.MOD_REPLACE, ‘unicodePwd‘, [password_utf16])]
    ret,_ = l.modify_s(user_dn, param_pwd)
    print ret
  • 设置LDAP用户密码
    import ldap
    def set_ldap_password(user_dn, password):
    l = ldap.initialize(‘ldap://172.16.1.163:389‘)
    l.protocol_version = 3
    l.set_option(ldap.OPT_REFERRALS, 0)
    l.simple_bind_s(‘Administrator‘, ‘P@ssword‘)
    l.passwd_s(user_dn, None, password)
  • 修改LDAP用户密码
    import ldap
    def modify_ldap_password(user_dn, old_password, new_password):
    l = ldap.initialize(‘ldap://172.16.1.163:389‘)
    l.protocol_version = 3
    l.set_option(ldap.OPT_REFERRALS, 0)
    l.simple_bind_s(‘Administrator‘, ‘P@ssword‘)
    l.passwd_s(user_dn, old_password, new_password)
  • 创建AD/LDAP组织结构
    import ldap
    def create_ou(parent_dn, ou):
    l = ldap.initialize(‘ldap://172.16.1.163:389‘)
    l.protocol_version = 3
    l.set_option(ldap.OPT_REFERRALS, 0)
    l.simple_bind_s(‘Administrator‘, ‘P@ssword‘)
    attrs= {‘ou‘: ou}
    attrs[‘description‘] = ‘this is description‘
    attrs[‘objectClass‘] = [‘organizationalUnit‘,‘top‘]
    dn = ‘ou=%s,%s‘ % (attrs[‘ou‘], parent_dn)
    ldif = modlist.addModlist(attrs)
    ret, _ = l.add_s(dn,ldif)
    print ret
  • 修改AD/LDAP组织结构
    import ldap
    def modify_ou(attrs={‘description‘: ‘new_description‘}):
    l = ldap.initialize(‘ldap://172.16.1.163:389‘)
    l.protocol_version = 3
    l.set_option(ldap.OPT_REFERRALS, 0)
    l.simple_bind_s(‘Administrator‘, ‘P@ssword‘)
    old_attrs = {‘description‘: ‘old_description‘}
    ldif = modlist.modifyModlist(old_attrs, attrs)
    l.modify_s(dn,ldif)
  • 删除AD/LDAP组织结构
    import ldap
    def delete_ou(dn):
    l = ldap.initialize(‘ldap://172.16.1.163:389‘)
    l.protocol_version = 3
    l.set_option(ldap.OPT_REFERRALS, 0)
    l.simple_bind_s(‘Administrator‘, ‘P@ssword‘)
    l.delete_s(dn)
  • 查询AD/LDAP组织结构
    import ldap
    def describe_ou(parent_dn=‘‘, org_dns=[]):
    ORGANIZATION_ATTRS = [‘ou‘, ‘description‘]
    l = ldap.initialize(‘ldap://172.16.1.163:389‘)
    l.protocol_version = 3
    l.set_option(ldap.OPT_REFERRALS, 0)
    l.simple_bind_s(‘Administrator‘, ‘P@ssword‘)
    filterstr = ‘(&(objectclass=organizationalUnit)‘
    for dn in org_dns:
        objectGUID = ‘(ou=%s)‘ % dn
        filterstr += objectGUID
    filterstr += ‘)‘
    if parent_dn:
        ret = l.search_s(parent_dn, ldap.SCOPE_SUBTREE, filterstr,
                                       attrlist=ORGANIZATION_ATTRS)
    else:
        ret = l.search_s(base_dn, ldap.SCOPE_SUBTREE, filterstr,
                                       attrlist=ORGANIZATION_ATTRS)
    print ret
  • 修改用户所属组织结构
    import ldap
    def change_user_in_ou(user_dn, new_org_dn):
    l = ldap.initialize(‘ldap://172.16.1.163:389‘)
    l.protocol_version = 3
    l.set_option(ldap.OPT_REFERRALS, 0)
    l.simple_bind_s(‘Administrator‘, ‘P@ssword‘)
    cn = user_dn.split(‘,‘)[0]
    ret = l.rename_s(user_dn, cn, new_org_dn)
    print ret

注意:AD和LDAP中如:创建用户,查询用户等操作,其使用端口和查询字段均有差异,还请格外注意,另外,代码如有不明确指出,欢迎留言讨论。

原文地址:http://blog.51cto.com/14207158/2352634

时间: 2024-10-22 04:33:16

通过python-ldap操作管理AD/LDAP用户及组织结构的相关文章

LDAP方式连接AD获取用户信息

LDAP资料介绍可以参考:http://wenku.baidu.com/view/262742f9f705cc17552709f9.html ldap访问AD域的的错误一般会如下格式: Ldap load error: [LDAP: error code 49 - 80090308: LdapErr: DSID-0C090334, comment: AcceptSecurityContext error, data 525, vece] 其中红字部分的意思如下(这些错误码跟语言无关): 525

Java使用LdAP获取AD域用户

随着我们的习大大上台后,国家在网络信息安全方面就有了很明显的改变!所以现在好多做网络信息安全产品的公司和需要网络信息安全的公司都会提到用AD域服务器来验证,这里就简单的研究了一下! 先简单的讲讲AD域和LdAP目录访问协议:AD(active directory)活动目录,动态的建立整个域模式网络中的对象的数据库或索引,协议为LDAP,安装了AD的服务器称为DC域控制器,存储整个域的对象的信息并周期性更新!其中的对象分为三大类--资源(如印表机).服务(如电子邮件).和人物(即帐户或用户,以及组

JAVA 通过LDAP获取AD域用户及组织信息

因为工作需求近期做过一个从客户AD域获取数据实现单点登录的功能,在此整理分享. 前提:用户可能有很多系统的情况下,为了方便账号的统一管理使用AD域验证登录,所以不需要我们的系统登录,就需要获取用户的AD域组织和用户信息,实现域认证和单点登录. LDAP: LDAP是轻量目录访问协议 AD域:微软基于域模式的集中化管理 1.常规的AD域登陆验证 LdapContext dc = null;             Hashtable<String, String> env = new Hasht

JAVA使用Ldap操作AD域

项目上遇到的需要在集成 操作域用户的信息的功能,第一次接触ad域,因为不了解而且网上其他介绍不明确,比较费时,这里记录下. 说明: (1). 特别注意:Java操作查询域用户信息获取到的数据和域管理员在电脑上操作查询的数据可能会存在差异(同一个意思的表示字段,两者可能不同). (2). 连接ad域有两个地址: ldap://XXXXX.com:389 和 ldap://XXXXX.com:636(SSL). (3). 端口389用于一般的连接,例如登录,查询等非密码操作,端口636安全性较高,用

利用LDAP操作AD域

LDAP操作代码样例  初始化LDAP 目录服务上下文 该例子中,我们使用uid=linly,ou=People,dc=jsoso,dc=net这个账号,链接位于本机8389端口的LDAP服务器(ldap://localhost:8389),认证方式采用simple类型,即用户名/密码方式. private static void initialContext() throws NamingException{    if(singleton == null){     singleton =

JAVA_基本LDAP操作

一.LDAP概念 LDAP的全称为Lightweight Directory Access Protocol(轻量级目录访问协议), 基于X.500标准, 支持 TCP/IP. LDAP目录为数据库,通过LDAP服务器(相当于DBMS)处理查询和更新, 以树状的层次结构来存储数据,相对关系型数据库, LDAP主要是优化数据读取的性能,适用于比较少改变.跨平台的信息. 二.Softerra LDAP Administrator 下载安装软件,并配置LDAP DN:Distinguished Nam

AD 域服务简介(三)- Java 对 AD 域用户的增删改查操作

博客地址:http://www.moonxy.com 关于AD 域服务器搭建及其使用,请参阅:AD 域服务简介(一) - 基于 LDAP 的 AD 域服务器搭建及其使用 Java 获取 AD 域用户,请参阅:AD 域服务简介(二)- Java 获取 AD 域用户 一.前言 在日常的开发中,为了实现单点登录,需要对域用户进行增删改查操作,以维持最新的用户信息,确保系统的安全. 二.Java 对 AD 域用户的增删改查操作 package com.moonxy.ad; import java.uti

CentOS7.4+FreeRadius+ldap(Windows AD)认证 搭建radius服务

(一)简介freeradius一般用来进行账户认证管理,记账管理,常见的电信运营商的宽带账户,上网账户管理,记账,都是使用的radius服务器进行鉴权记账的.Freeradius包含一个radius服务器和radius-client,可以对支持radius协议的网络设备进行鉴权记账. ------百度百科 (二)安装配置服务 [[email protected] ~]# yum install freeradius freeradius-ldap freeradius-utils -y [[em

Linux下查看/管理当前登录用户及用户操作历史记录

一.查看及管理当前登录用户 1.使用w命令查看登录用户正在使用的进程信息,w命令用于显示已经登录系统的用户的名称,以及他们正在做的事.该命令所使用的信息来源于/var/run/utmp文件.w命令输出的信息包括: 用户名称 用户的机器名称或tty号 远程主机地址 用户登录系统的时间 空闲时间(作用不大) 附加到tty(终端)的进程所用的时间(JCPU时间) 当前进程所用时间(PCPU时间) 用户当前正在使用的命令 $ w 23:04:27 up 29 days, 7:51, 3 users, l