ldap3是一个python进行LDAP操作相关的一个库,这里主要是用ldap3来对微软的AD进行一些用户相关的操作。
安装
在命令行中使用以下命令安装 ldap3
库
pip install ldap
使用
初始化连接
# 创建服务器对象
server = Server("LDAP://127.0.0.1", use_ssl=True, get_info=ALL)
# 创建连接对象
conn = Connection(server, "admin@test.com", password, auto_bind=True)
在上述代码中,将 'LDAP://127.0.0.1'
替换为实际的 LDAP 服务器地址,'admin@test.com'
和'password'
替换为有效的用户 DN 和密码。
注意,需要启用use_ssl,否则后续的更新会出现异常。
查询组组架构
def get_ou():
conn.search(
search_base="DC=test,DC=com",
search_filter="(objectclass=organizationalUnit)",
attributes=ALL_ATTRIBUTES,
)
res = self._conn.response_to_json() # 将查询结果转换为json格式
res = json.loads(res)["entries"]
print(res)
查询用户
1、根据用户名查询
def search_user_by_account_name(AccountName):
conn.search(
search_base="DC=test,DC=com", # 坐标
search_filter=f"(&(objectclass=user)(sAMAccountName={AccountName}))", # 查询条件
attributes=ALL_ATTRIBUTES, # 返回的属性
) # attributes 限制查询出来的属性包括
res = self._conn.response_to_json() # 将查询结果转换为json格式
res = json.loads(res)["entries"]
2、查询某个部门下面所有用户
def search_user_by_dept():
conn.search(
search_base="OU=总公司,DC=test,DC=com", # 坐标
search_filter=f"(objectclass=user)", # 查询条件
attributes=ALL_ATTRIBUTES, # 返回的属性
) # attributes 限制查询出来的属性包括
res = self._conn.response_to_json() # 将查询结果转换为json格式
res = json.loads(res)["entries"]
注意:
关于search_filter的查询条件之间的与查询使用&
, 或使用|
,示例如下:
# 与查询
(&(objectclass=user)(sAMAccountName={AccountName}))
# 或查询
(|(objectclass=user)(sAMAccountName={AccountName}))
用户操作
新增用户
当新员工加入组织时,可以编写脚本使用 ldap3
自动在 LDAP 目录中创建用户条目,分配初始密码,并将用户添加到相应的组织单元和组中。
def add_user():
user_attributes = {
'objectClass': ['top', 'person', 'organizationalPerson', 'user'],
'givenName': "小三", # 名字
'sn': '张', # 姓
'cn': '张小三', # 完整的姓名
'sAMAccountName': "zhangxs", # 唯一账号
'userPrincipalName': "zhangxs@test.com", # 域帐号
'mail': "zhangxs@test.com", # 邮箱
'pwdLastSet': [-1], # 是否在登录后重置密码,0->表示每次登录后都需重置密码,-1 -> 表示密码永不过期
"userAccountControl": "544",
'displayName': "张小三", # 显示的名称
'userPassword': "ad@101131" # 用户密码
}
user_dn = "cn=张小三,dc=test,dc=com"
conn.add(user_dn, attributes=user_attributes)
这将在指定的 DN(例如 张小三,dc=test,dc=com
)处添加一个新的用户条目。
修改密码
将员员忘记密码或是密码过期时,可以使用LDAP接口进行密码重置。注意需要在conn时,使用LDAPS://xxxx,然后设置use_ssl=True
# 创建服务器对象
server = Server("LDAPS://127.0.0.1", use_ssl=True, get_info=ALL)
# 创建连接对象
conn = Connection(server, "admin@test.com", password, auto_bind=True)
user_bn = "CN=张小三,OU=总公司,DC=test,DC=com"
conn.extend.microsoft.modify_password(user_dn, new_password="123456")
修改用户信息
可以修改已存在用户的各种属性。比如更新用户的姓名、密码、所属组等信息。
user_bn = "CN=张小三,OU=总公司,DC=test,DC=com"
conn.modify(user_bn, {
"userAccountControl": [(ldap3.MODIFY_REPLACE, [512])] # 用户的属性信息
})
启用用户
当员工入职时,将其在LDAP 中的账户置为启用状态。
user_bn = "CN=张小三,OU=总公司,DC=test,DC=com"
conn.modify(user_bn, {
"userAccountControl": [(ldap3.MODIFY_REPLACE, [512])] # 用户的属性信息
})
禁用用户
当员工离职时,删除其在 LDAP 中的条目。例如,离职员工可以从所有相关组中移除,并标记其账户为禁用状态。
user_bn = "CN=张小三,OU=总公司,DC=test,DC=com"
conn.modify(user_bn, {
"userAccountControl": [(ldap3.MODIFY_REPLACE, [514])] # 用户的属性信息
})
授权用户到某权限组
user_bn = "CN=张小三,OU=总公司,DC=test,DC=com"
admin_dn = "CN=Domain Admins,CN=Users,DC=test,DC=com"
conn.extend.microsoft.add_members_to_groups(user_bn, admin_dn)
移除用户权限
user_bn = "CN=张小三,OU=总公司,DC=test,DC=com"
admin_dn = "CN=Domain Admins,CN=Users,DC=test,DC=com"
conn.extend.microsoft.remove_members_from_groups(user_bn, admin_dn)
原创文章,作者:jiafegn,如若转载,请注明出处:https://www.techlearn.cn/archives/2235