溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Ldap3 庫(kù)的使用方法

發(fā)布時(shí)間:2021-07-10 15:43:03 來(lái)源:億速云 閱讀:127 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“Ldap3 庫(kù)的使用方法”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

以下是代碼匯總版:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import json
from ldap3 import ALL_ATTRIBUTES
# 注意:ldap3庫(kù)如果要使用tls(安全連接),需要ad服務(wù)先安裝并配置好證書(shū)服務(wù),才能通過(guò)tls連接,否則連接測(cè)試時(shí)會(huì)報(bào)LDAPSocketOpenError('unable to open socket'
# 如果是進(jìn)行賬號(hào)密碼修改及賬戶(hù)激活時(shí),會(huì)報(bào)錯(cuò):“WILL_NOT_PERFORM”
from ldap3 import Connection, NTLM, Server
from ldap3 import MODIFY_REPLACE


server1 = 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用戶(hù)操作    '''
    def __init__(self):
        '''初始化'''
        self.conn = Connection( #配置服務(wù)器連接參數(shù)
            server=LDAP_SERVER_POOL,
            auto_bind=True,
            authentication=NTLM,  #連接Windows AD需要配置此項(xiàng)
            read_only=False,  #禁止修改數(shù)據(jù):True
            user=SERVER_USER,#管理員賬戶(hù)
            password=SERVER_PASSWORD,
        )

        self.leaved_base_dn = 'ou=Leaved,dc=adtest,dc=intra'#離職賬戶(hù)所在OU
        self.active_base_dn = 'ou=測(cè)試部門(mén),dc=adtest,dc=intra'#正式員工賬戶(hù)所在OU
        self.search_filter = '(objectclass=user)'#只獲取【用戶(hù)】對(duì)象
        self.ou_search_filter = '(objectclass=organizationalUnit)'#只獲取【OU】對(duì)象

    def users_get(self):
        '''獲取所有的用戶(hù)'''
        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):
        '''
        新建用戶(hù)or 部門(mén),User需要設(shè)置密碼,激活賬戶(hù)
        :param dn: dn = "ou=人事部3,ou=羅輯實(shí)驗(yàn)室,dc=adtest,dc=intra"  # 創(chuàng)建的OU的完整路徑
                   dn = "cn=張三,ou=人事部3,ou=羅輯實(shí)驗(yàn)室,dc=adtest,dc=intra"  # 創(chuàng)建的User的完整路徑
        :param type:選項(xiàng):ou or user
        :param attr = {#User 屬性表,需要設(shè)置什么屬性,增加對(duì)應(yīng)的鍵值對(duì)
                        "SamAccountName": "zhangsan",  # 賬號(hào)
                        "EmployeeID":"1",    # 員工編號(hào)
                        "Sn": "張",  # 姓
                        "name": "張三",
                        "telephoneNumber": "12345678933",
                        "mobile": "12345678933",
                        "UserPrincipalName":"zhangsan@adtest.com",
                        "Mail":"zhangsan@adtest.com",
                        "Displayname": "張三",
                        "Manager":"CN=李四,OU=人事部,DC=adtest,DC=com",#需要使用用戶(hù)的DN路徑
                    }
                attr = {#OU屬性表
                        'name':'人事部',
                        'managedBy':"CN=張三,OU=IT組,OU=羅輯實(shí)驗(yàn)室,DC=adtest,DC=intra", #部分負(fù)責(zé)人
                        }
        :return:True and success 是創(chuàng)建成功了
        (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": # 如果是用戶(hù)時(shí),我們需要給賬戶(hù)設(shè)置密碼,并把賬戶(hù)激活
            self.conn.extend.microsoft.modify_password(dn, "XXXXXXXXX")    #設(shè)置用戶(hù)密碼
            self.conn.modify(dn, {'userAccountControl': [('MODIFY_REPLACE',512)]})    #激活用戶(hù)
        return res, self.conn.result

    def del_obj(self,DN):
        '''
        刪除用戶(hù) or 部門(mén)
        :param DN:
        :return:True
        '''
        res = self.conn.delete(dn=DN)
        return res

    def update_obj(self, dn, attr):
        '''更新員工 or 部門(mén)屬性
        先比較每個(gè)屬性值,是否和AD中的屬性一致,不一樣的記錄,統(tǒng)一update
        注意:
            1. attr中dn屬性寫(xiě)在最后
            2. 如果name屬性不一樣的話,需要先變更名字(實(shí)際是變更原始dn為新name的DN),后續(xù)繼續(xù)操作update and move_object
        User 的 attr 照如下格式寫(xiě):
        dn = "cn=test4,ou=IT組,dc=adtest,dc=com" #需要移動(dòng)的User的原始路徑
        {#updateUser需要更新的屬性表
             "Sn": "李",  # 姓
             "telephoneNumber": "12345678944",
             "mobile": "12345678944",
             "Displayname": "張三3",
             "Manager":"CN=李四,OU=人事部,DC=adtest,DC=com",#需要使用用戶(hù)的DN路徑
             'DistinguishedName':"cn=張三,ou=IT組,dc=adtest,dc=com" #用戶(hù)需要移動(dòng)部門(mén)時(shí),提供此屬性,否則不提供
            }

        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" # 更新后的部門(mén)完整路徑
        }
        '''
        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']) # 改過(guò)名字后,DN就變了,這里調(diào)用重命名的方法
                    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”,表示需要移動(dòng)User or OU
                    self.__move_object(dn=dn,new_dn=v) # 調(diào)用移動(dòng)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):
        '''比較員工指定的某個(gè)屬性
        '''
        res = self.conn.compare(dn=dn,attribute=attr,value=value)
        return res

    def __move_object(self,dn,new_dn):
        '''移動(dòng)員工 or 部門(mén)到新部門(mén)'''
        relative_dn,superou = new_dn.split(",",1)
        res = self.conn.modify_dn(dn=dn,relative_dn=relative_dn,new_superior=superou)
        return res


def check_credentials(username, password):
    """
    用戶(hù)認(rèn)證接口 #
    """
    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 庫(kù)的使用方法”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI