zoukankan      html  css  js  c++  java
  • Python操作AD域服务器进行组织和用户的查询和添加

    由于工作中有时候会遇到需要对AD域服务器进行批量添加用户和组织的操作,平时都是通过bat批处理对csv文件中的用户和组织进行操作添加,但是操作起来还是略麻烦,就想自己动手用Python代码写个更好操作的方式,随便百度了下,还真的有相关的库——ldap3,先写点demo,后面再完善下吧。
    基本操作方法:

    from ldap3 import Server, Connection, ALL, NTLM
    
    # 连接
    server = Server('192.168.214.93', get_info=ALL)
    conn = Connection(server, user='TEST\administrator', password='Winhong1234@#test', auto_bind=True, authentication=NTLM)
    print(server.info)
    
    # 查询
    res = conn.search('dc=test,dc=csc,dc=com', '(objectclass=user)', attributes=['objectclass'])
    print(conn.result)  # 查询失败的原因
    print(conn.entries)  # 查询到的数据
    
    # 增加组织
    res = conn.add('OU=python,OU=cibuser,DC=test,DC=csc,DC=com', object_class='OrganizationalUnit')
    if res:
    	print('增加组织成功!')
    else:
    	print('增加组织发生错误')
    	if conn.result['description'] == 'entryAlreadyExists':
    		print('--该组织已存在')
    
    # 增加用户
    user01 = {
    	'displayName' : 'python测试用户01',  # 显示名称
    	'userPrincipalName' : 'python_user_01@test.csc.com',  # 登录名
    	'userAccountControl': '544',  # 启用账号
    	'sAMAccountName': 'python_user_01',  # 登录名
    	'pwdLastSet': -1  # 取消下次登录修改密码
    }
    res = conn.add('CN=python_user_01,OU=python,OU=cibuser,DC=test,DC=csc,DC=com', object_class='user',
          attributes=user01)
    # attributes支持的字段可以通过server.schema.object_classes['user']获取
    print(res)
    print(conn.result)
    if res:
    	print('增加用户成功!')
    else:
    	print('增加用户发生错误')
    	if conn.result['description'] == 'entryAlreadyExists':
    		print('--该用户已存在')
    

    下面是准备改写成类:

     1 #!/usr/bin/env python
     2 # coding=UTF-8
     3 '''
     4 @Author: wjx
     5 @Description: AD域
     6 @Date: 2018-12-23 21:23:57
     7 @LastEditTime: 2019-03-28 23:46:56
     8 '''
     9 from ldap3 import Server, Connection, ALL, NTLM
    10 
    11 class Adoper():
    12     '''
    13     操作AD域的类
    14     '''
    15     def __init__(self, domain, ip, admin='administrator', pwd=None):
    16         '''
    17         domain: 域名,格式为:xxx.xxx.xxx
    18         ip: ip地址,格式为:192.168.214.1
    19         admin: 管理员账号
    20         pwd: 管理员密码
    21         '''
    22         self.domain = domain
    23         self.DC = ','.join(['DC=' + dc for dc in domain.split('.')]) # csc.com -> DC=csc,DC=com
    24         self.pre = domain.split('.')[0].upper()  # 用户登陆的前缀
    25         self.ip = ip
    26         self.admin = admin
    27         self.pwd = pwd
    28         self.server = Server(self.ip, get_info=ALL)
    29         self.conn = Connection(self.server, user=self.pre+'\'+self.admin, password=self.pwd, auto_bind=True, authentication=NTLM)
    30 
    31     def search(self, org):
    32         '''
    33         查询组织下的用户
    34         org: 组织,格式为:aaa.bbb 即bbb组织下的aaa组织,不包含域地址
    35         '''
    36         att_list = ['displayName', 'userPrincipalName','userAccountControl','sAMAccountName','pwdLastSet']
    37         org_base = ','.join(['OU=' + ou for ou in org.split('.')]) + ',' + self.DC
    38         res = self.conn.search(search_base=org_base,
    39                                 search_filter='(objectclass=user)', # 查询数据的类型
    40                                 attributes=att_list,                 # 查询数据的哪些属性
    41                                 paged_size=1000)                     # 一次查询多少数据
    42         if res:
    43             for user in self.conn.entries:
    44                 yield user['displayName']
    45         else:
    46             print('查询失败: ', self.conn.result['description'])
    47             return None
    48 
    49     def add_org(self, org):
    50         '''
    51         增加组织
    52         oorg: 组织,格式为:aaa.bbb 即bbb组织下的aaa组织,不包含域地址
    53         '''
    54         org_base = ','.join(['OU=' + ou for ou in org.split('.')]) + ',' + self.DC
    55         res = self.conn.add(org_base, object_class='OrganizationalUnit') # 成功返回True,失败返回False
    56         if res:
    57             print(f'增加组织[ {org} ]成功!')
    58         else:
    59             print(f'增加组织[ {org} ]发生错误: ', self.conn.result['description'])
    60 
    61     def add_user(self, org, name, uid):
    62         '''
    63         增加用户
    64         org:增加到该组织下
    65         name:显示名称
    66         uid:账号
    67         '''
    68         org_base = ','.join(['OU=' + ou for ou in org.split('.')]) + ',' + self.DC
    69         user_att = {
    70             'displayName' : name,
    71             'userPrincipalName' : uid + '@' + self.domain,  # uid@admin组成登录名
    72             'userAccountControl': '544',                      # 启用账号
    73             'sAMAccountName': uid,
    74             'pwdLastSet': -1                                  # 取消下次登录需要修改密码
    75         }
    76         res = self.conn.add(f'CN={uid},{org_base}', object_class='user',
    77               attributes=user_att)
    78         if res:
    79             print(f'增加用户[ {name} ]成功!')
    80         else:
    81             print(f'增加用户[ {name} ]发生错误:', self.conn.result['description'])
    82 
    83 
    84 if __name__ == '__main__':
    85     ad93 = Adoper(domain='test.csc.com', ip='192.168.214.93', pwd='Winhong1234@#test')
    86     for user in ad93.search('信息科技部.总行.cibuser'):
    87         print(user)
    88     ad93.add_org('python02.cibuser')
    89     ad93.add_user('python02.cibuser', 'python03类用户', 'python03')
  • 相关阅读:
    NanoProfiler
    NanoProfiler
    Open Source Cassandra Gitbook for Developer
    Android Fragment使用(四) Toolbar使用及Fragment中的Toolbar处理
    Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复
    Android Fragment使用(二) 嵌套Fragments (Nested Fragments) 的使用及常见错误
    Android Fragment使用(一) 基础篇 温故知新
    Set up Github Pages with Hexo, migrating from Jekyll
    EventBus源码解析 源码阅读记录
    Android M Permission 运行时权限 学习笔记
  • 原文地址:https://www.cnblogs.com/haiya2019/p/10627730.html
Copyright © 2011-2022 走看看