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')
  • 相关阅读:
    ccnet 配置真折腾
    幻灯片效果代码(asp版本)
    Microsoft Office 服务器系统要求
    取数据库N到M的记录
    [心得]关于iframe页面滚动条。
    和我一起学Windows Workflow Foundation(2)让WF通过参数接收数据 [转]
    新闻图片效果
    AJAX
    和我一起学Windows Workflow Foundation(1)创建和调试一个WF实例 [转]
    关闭父窗口,打开新窗口
  • 原文地址:https://www.cnblogs.com/haiya2019/p/10627730.html
Copyright © 2011-2022 走看看