如何使用MS Active Directory Python插件查询用户所属AD组
使用ms-active-directory插件查询指定用户的AD组成员身份
你的核心问题是把AD对象转成字符串用正则解析——这完全没必要,而且容易出错。ms-active-directory插件返回的ADUser和ADGroup都是封装好的对象,直接访问属性就能拿到所需数据,根本不用正则硬拆字符串。
修正后的代码
from ms_active_directory import ADDomain # 初始化域连接和用户会话 domain = ADDomain('fake_name') session = domain.create_session_as_user('my_email', 'mypassword') # 待查询的用户邮箱列表 target_user_emails = ['albert.einstein@email.com', 'jon.doe@email.com'] # 存储用户CN与对应筛选后组的映射 user_group_result = {} for email in target_user_emails: # 通过邮箱查找用户,返回ADUser对象 ad_user = session.find_user_by_name(email) if not ad_user: print(f"未找到邮箱对应的用户: {email}") continue # 直接从ADUser对象获取CN属性 user_cn = ad_user.cn # 查询该用户所属的所有组,返回结构为 {用户CN: [ADGroup对象列表]} user_all_groups = session.find_groups_for_users(users=[user_cn])[user_cn] # 筛选出以'awsg'开头的组,提取组的CN名称 filtered_awsg_groups = [group.cn for group in user_all_groups if group.cn.lower().startswith('awsg')] user_group_result[user_cn] = filtered_awsg_groups # 输出结果 for user_cn, groups in user_group_result.items(): print(f"用户 {user_cn} 所属的awsg前缀组: {groups}")
关键修正点说明
- 放弃正则解析字符串:
之前用正则从str(add_user_found)里抠CN的做法完全多余,find_user_by_name返回的ADUser对象直接提供了.cn属性,一步就能拿到通用名。 - 正确处理组查询结果:
find_groups_for_users返回的是字典,键是用户的标识符(这里用CN),值是该用户所属的ADGroup对象列表。直接遍历列表,通过group.cn获取组名,再做前缀筛选即可。 - 容错处理:
增加了用户未找到的判断,避免空对象导致的报错。
可选扩展
如果需要获取组的完整LDAP路径(比如CN=awsg-dev,OU=Groups,DC=domain,DC=com),可以把group.cn改成group.distinguishedName。
内容的提问来源于stack exchange,提问作者Mr. Jett
相关产品推荐
相关产品推荐

