编辑
2023-07-28
运维
00
请注意,本文编写于 544 天前,最后修改于 544 天前,其中某些信息可能已经过时。

目录

AD域部分
为什么要做这个?
为什么是LDAP?
链接
搜索
移动
添加
缺陷

AD域部分

为什么要做这个?

因为在一开始进行员工入职和初始化工作的时候常常需要有去多个平台进行不同的操作,一般来说流程是: AD域 → 使用AD域账号进行电脑初始化 → 根据部门分配IP地址保留 → 初始化邮箱 → 根据部门创建Jira和Gitlab 在这个过程中需要将相同的几个数据在其中填入,因为靠人工是很容易犯迷糊,所以我就想到能不能将他们通过一种方式串联起来。这样我就想到了Python,使用他来对整个流程进行整合是再合适不过的工具了。而我第一个入手的就是AD域。

为什么是LDAP?

LDAP是指轻型目录访问协议,在我一开始找寻如何操作AD域的时候发现大多数资料都指向了操作LDAP,于是按照关键词简单搜索了一下发现AD域就是微软自己修改过的LDAP,LDAP的操作方式是可以同样来操作AD域的。于是便开始学习Python中ldap3的使用方法 AD

链接

在AD域中因为需要建立连接,所以我以类的方式封装,在类中初始化时使用ldap3.Connection方法传入账号密码建立连接 self.conn = Connection(self.server, user=self.pre+'\\'+self.admin, password=self.pwd, auto_bind=True, authentication=NTLM, read_only=False) 通过NTLM来进行验证,同时关闭ReadOnly。

搜索

通过self.conn.search方法来进行搜索操作

python
self.conn.search(search_base=org_base,# 查询数据的dn search_filter='(objectclass=user)', # 查询数据的类型 attributes=att_list, # 查询数据的哪些属性 paged_size=1000)

移动

通过self.conn.modify_dn(dn, relative_dn, new_superior=superou)来进行移动部门操作其中注意CN部分需要切下来给relative_dn,后面其他部分丢给new_superior,然后变更前的完整dn丢给第一个参数才能完成部门移动。 如: 原dn CN=张三,OU=RDDI,OU=HWUsers,DC=hwtc,DC=net 移动到 OU=ExitStaff,OU=HWUsers,DC=hwtc,DC=net

python
dn = "CN=张三,OU=RDDI,OU=HWUsers,DC=hwtc,DC=net" relative_dn = "CN=张三" superou = "OU=ExitStaff,OU=HWUsers,DC=hwtc,DC=net" self.conn.modify_dn(dn, relative_dn, new_superior=superou)

添加

python
user_att = { 'name':name, 'cn':name, 'sn':name[1:], 'givenName':name[:1], 'displayName' : name, 'userPrincipalName' : uid + '@' + self.domain, # uid@domain组成登录名 'userAccountControl': '544', # 启用账号 'sAMAccountName': uid, 'pwdLastSet': -1 # 取消下次登录需要修改密码 } res = self.conn.add(f'CN={name},{org_base}', object_class='user', attributes=user_att)

创建账户第一个参数需要拼接完整dn,然后object_class设置未User,最后attributes传入各种AD创建的参数

缺陷

但是这个AD流程中有一个缺陷,就是我们AD域并未使用SSL链接,所以是不支持以操作LDAP的方式来修改密码的,但是修改服务器LDAP链接加密方式会影响已同步服务的链接,所以不敢贸然改动,思前想后只能曲线救国,只能使用PoweShel来进行密码重置操作,所以修改密码使用的Python调用PowerShell。

Set-ADAccountPassword -Identity cn -Reset -NewPassword (ConvertTo-SecureString -AsPlainText passd -Force)

以上