您好,登錄后才能下訂單哦!
本篇內容介紹了“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 庫的使用方法”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。