Server = "ldap://127.0.0.1:389" # 明文访问
MServer = "ldaps://127.0.0.1:636" # 密文访问
baseDN = "OU=xx,DC=xx,DC=xx" # 访问起始目录
username = "xxx"  # ldap中用户名
password = "xxx"  # ldap中密码

import ldap

class LdapModel():
  def login_ldap(self,userId):
    try:
        print("开始执行")

searchScope = ldap.SCOPE_SUBTREE

# 设置过滤属性,这里只显示cn=test的信息
        searchFilter = "sAMAccountName=" + userId

# 为用户名加上域名
        #username = 'domainname\\' + userId

# None表示搜索所有属性,['cn']表示只搜索cn属性
        retrieveAttributes = None

conn = ldap.initialize(Server)
        # 非常重要
        conn.set_option(ldap.OPT_REFERRALS, 0)
        conn.protocol_version = ldap.VERSION3
        # 这里用户名是域账号的全名例如domain/name
        conn.simple_bind_s(username, password)
        print('ldap connect successfully')

# 调用search方法返回结果id
        ldap_result_id = conn.search(baseDN, searchScope, searchFilter, retrieveAttributes)
        result_set = []
        print(ldap_result_id)

print("****************")
        while 1:
            result_type, result_data = conn.result(ldap_result_id, 0)
            if (result_data == []):
                break
            else:
                if result_type == ldap.RES_SEARCH_ENTRY:
                    result_set.append(result_data)

# print result_set
        Name, Attrs = result_set[0][0]
        #print(Name)
        #print(Attrs)

#if hasattr(Attrs, 'has_key') and 'name' in Attrs:
        if 'name' in Attrs:
            needKeyList=['sn','sAMAccountName','mobile','description']
            resultMap={}
            for key in Attrs.keys():
               values=Attrs[key]
               if isinstance(values,list):
                   #print("======",key)
                   valueList=[]
                   for item in values:
                       try:
                           #print(str(item,'utf-8'))
                           valueList.append(str(item,'utf-8'))
                       except Exception as e:
                           print(values)
                           print(e)
                   if key in needKeyList:
                       resultMap[key]=valueList
               else:
                   pass
                   #print(key,Attrs[key])

return resultMap

else:
            print("in error")
            return None

except Exception as ex:
        print(ex)
    return None

def checkValue(self,name,userid,mobile):
    rbool=False
    rMsg=""
    resultMap=None
    try:
        resultMap=self.login_ldap(userid)
        if resultMap and len(resultMap) > 0:
            # check data {'sn': ['刘政'], 'description': ['liuzheng2'], 'sAMAccountName': ['06308'], 'mobile': ['18128879095']}
            if name in resultMap["sn"]:
                if mobile in resultMap["mobile"]:
                    rbool=True
                else:
                    rMsg="用户名不一致"
            else:
                rMsg="手机号码不一致"
        else:
           rMsg="query ldap no data!"
    except Exception as ex:
        print("ldap login_ldap")
        print(ex)

return rbool,rMsg,resultMap

# 修改LDAP密码
    # userId: LDAP uid
    # newpwd: 新密码
  def change_password(self,userId,newpwd):
    try:

# 如果是self-signed cert, 加上这行
        ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)
         
        # 初始化LDAP连接
        print("url",MServer)
        conn = ldap.initialize(MServer)
        #conn.protocol_version = ldap.VERSION3
    #  ---------
        conn.set_option( ldap.OPT_X_TLS_DEMAND, True )
        conn.set_option( ldap.OPT_DEBUG_LEVEL, 255 )

# 使用管理员
        conn.simple_bind_s(username,password)
        print("connecting successfully............")
    
        searchScope = ldap.SCOPE_SUBTREE
    # 设置过滤属性,这里只显示cn=test的信息
        searchFilter = "sAMAccountName=" + userId
    # None表示搜索所有属性,['cn']表示只搜索cn属性
        retrieveAttributes = None
        # 调用search方法返回结果id
        ldap_result = conn.search_s(baseDN, searchScope, searchFilter, retrieveAttributes)  # 返回该用户的所有信息,类型列表
        print("query  successfully ..............")
        # 修改密码
        if ldap_result:
                user_dn = ldap_result[0][0]   # 获取用户的cn,ou,dc
                try:

unicode_pass = str('\"' + newpwd + '\"')     
                    print (unicode_pass)                         
                    new_password = unicode_pass.encode('utf-16-le')
                    mod_attrs = [( ldap.MOD_REPLACE, 'unicodePwd', new_password)]
                    print(user_dn,mod_attrs)

conn.modify_s(user_dn, mod_attrs)
                    conn.unbind_s()
                    print("update password successfully............")
                except Exception as e:
                    print(e)
        else:
            print("查询失败..........")
        #conn.extend.microsoft.modify_password(dn, newpwd)
        return True,"Password changed!"
    except Exception as ex:
        return False,"Oops! Something wrong: %s" % ex

python3 ldap 查询用户,使用管理重置用户密码相关推荐

  1. 二十、MySQL之用户权限管理(用户管理、权限管理、忘记root密码的解决方案)

    用户权限管理:在不同的项目中给不同的角色(开发者)不同的操作权限,为了保证数据库数据的安全. 通常,一个用户的密码不会长期不变,所以需要经常性的变更数据库用户密码来确保用户本身安全(mysql客户端用 ...

  2. chmod 777命令_Linux用户权限管理及用户权限管理命令操作

    Ubuntu 是一个多用户系统,我们可以给不同的使用者创建不同的用户账号,每个用户使用各自的账号登陆,使用用户账号的目的一是方便系统管理员管理,控制不同用户对系统的访问权限,另一方面是为用户提供安全性 ...

  3. kali修改文件权限不够_Linux用户权限管理及用户权限管理命令操作

    Ubuntu 是一个多用户系统,我们可以给不同的使用者创建不同的用户账号,每个用户使用各自的账号登陆,使用用户账号的目的一是方便系统管理员管理,控制不同用户对系统的访问权限,另一方面是为用户提供安全性 ...

  4. centos 7 单用户模式无法重置root密码 解决方法

    CentOS 7&RHEL 7与之前的5,6不同的是,当忘记root密码,并采用GRUB2为启动器时,将无法通过单用户模式重置root密码.下面将介绍如何重置CentOS7的root密码. 1 ...

  5. linux用户及用户权限管理,Linux用户用户组及权限管理

    Linux安全上下文: 运行中的程序:进程 进程所能够访问资源的权限取决于进程的运行者身份 涉及的配置文件 /etc/passwd:保存用户信息 whatis passwd sslpasswd (1s ...

  6. 【 linux系统入门管理篇-第二章文件和用户的管理】

    linux系统入门管理篇-第二章文件和用户的管理 本章介绍 一.文件管理 (一).Linux目录结构 (二).文件管理 1.文件管理命令 2.文件类型 二.用户管理 (一).用户/组基本概念 (二). ...

  7. 目录即服务如何帮助安全、高效地管理WiFi用户?

    大多数企业已经从传统有线网络转向使用 WiFi 无线网络.与有线网络相比,无线网络更易于管理,且性价比更高.灵活性更强. WiFi 无线网络深受广大用户喜爱.用户随时随地通过无线网络即可办公.沟通,不 ...

  8. mariadb用户群体mysql_MySQL/MariaDB用户账户管理

    'Username'@'Hostname' Username:任意的字符串组合,只能包含基本意义的字符:可以包含"_"."."."-": H ...

  9. 使用LDAP查询快速提升域权限

    DM_ · 2014/05/31 15:54 from:https://www.netspi.com/blog/entryid/214/faster-domain-escalation-using-l ...

最新文章

  1. 人工神经网络控制下的智能车
  2. python pip安装模块失败的原因
  3. java 流 复制文件_【Java】使用字节流复制文件
  4. 数据湖架构,为什么需要“湖加速”?
  5. mysql 压缩版安装
  6. 面试官不讲武德,居然让我讲讲蠕虫和金丝雀!
  7. 小米净水器压力传感器_净水器中RO的完整形式是什么?
  8. PHP 常用代码大全
  9. 你还在纠结要不要学 Go 吗?
  10. 8.0系统机器激活XPOSED框架失败The Xposed framework is not installed
  11. 【iOS】TouchDown、TouchDownRepeat 和 TouchCancel 的区别
  12. imagemagick, imagick和magickwand的安装
  13. a*算法的优缺点_垃圾回收的常见算法
  14. Kettle使用教程(一)—— 在MacOS系统中安装 Kettle
  15. 【美股】美股基本面的一些指标详解
  16. 数据可视化—随机漫步
  17. 上海车展:比亚迪宋L概念车全球首发,这是要硬扛特斯拉?
  18. 使用虚拟机备份软件备份Microsoft Hyper-V 虚拟机
  19. windows定时运行exe文件
  20. OpenCV-4.3.0 Windows版本下载

热门文章

  1. 105K Star的GitHub项目再陷风波,其托管商惨遭三大唱片公司起诉
  2. 用Python打造你的专属情人节贺卡,赶快发给TA浪漫一下吧
  3. docker network create: conflicts with network
  4. 全志JAVA_ubuntu14.04+安卓7.1(全志源码)+openjdk-8编译
  5. 软件测试工程师的岗位职责
  6. 软件开发团队在苹果iPhone上日进千金
  7. Unwriter:BCH和BTC之争可以参考法国大革命
  8. 传参时 const string 相对 const string 有哪些优势?
  9. day09_类,对象,封装(学习自用)
  10. 心态很容易受别人影响_很容易被别人说的话影响心情,应该怎么办?