中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Ldap3 庫的使用方法

發布時間:2021-07-10 15:43:03 來源:億速云 閱讀:135 作者:chen 欄目:大數據

本篇內容介紹了“Ldap3 庫的使用方法”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

以下是代碼匯總版:

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

import json
from ldap3 import ALL_ATTRIBUTES
# 注意:ldap3庫如果要使用tls(安全連接),需要ad服務先安裝并配置好證書服務,才能通過tls連接,否則連接測試時會報LDAPSocketOpenError('unable to open socket'
# 如果是進行賬號密碼修改及賬戶激活時,會報錯:“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用戶操作    '''
    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 res


def 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 庫的使用方法”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

冕宁县| 甘肃省| 阿鲁科尔沁旗| 潞城市| 阳原县| 扎兰屯市| 隆尧县| 教育| 济南市| 大兴区| 荃湾区| 乐昌市| 城市| 科尔| 章丘市| 泾阳县| 无极县| 泗阳县| 郓城县| 台南县| 蒙山县| 新兴县| 江口县| 印江| 临颍县| 泾川县| 比如县| 和静县| 张家川| 温泉县| 竹溪县| 韶关市| 达拉特旗| 门源| 涿鹿县| 谢通门县| 蓬溪县| 奉贤区| 蒲城县| 大同市| 利川市|