Python操做AD域服务器进行组织和用户的查询和添加

 

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

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')
相关文章
相关标签/搜索