如何使用Python获取Windows组(Active Directory)成员?
刚好我之前折腾过用Python获取AD组(包括Windows本地组)成员的需求,给你整理几个实用的方法,都是实测有效的:
方法一:用pyad库(AD场景首选,封装到位)
pyad是专门针对Active Directory的Python库,把LDAP的复杂操作都封装好了,上手特别快。
首先得安装:
pip install pyad
然后写代码,比如获取某个AD组的所有成员(包括嵌套组里的成员):
from pyad import pyad # 初始化AD连接,机器在域内的话可以自动发现域控制器,也可以手动指定 pyad.set_defaults(ldap_server="你的域控制器地址", username="域账号", password="密码") # 通过组名获取目标组对象 group = pyad.adgroup.ADGroup.from_cn("目标组名称") # 递归获取所有成员(包括嵌套组里的用户) members = group.get_members(recursive=True) # 遍历打印成员信息 for member in members: print(f"用户名: {member.get_attribute('sAMAccountName')[0]}, 全名: {member.get_attribute('displayName')[0]}")
小提示:如果你的机器已经加入域,且用域账号登录,不用手动填username和password,pyad会自动用当前凭证连接。
方法二:用ldap3库(通用LDAP方案,跨平台)
如果需要跨平台运行,或者不想依赖AD专用库,ldap3是个不错的选择——它支持所有LDAP协议的目录服务,自然也包括AD。
先安装:
pip install ldap3
代码示例,递归获取AD组的成员:
from ldap3 import Server, Connection, ALL, SUBTREE # 配置AD服务器信息 server = Server('你的域控制器地址', get_info=ALL) # 绑定域账号(格式可以是 域\账号 或者 user@domain.com) conn = Connection(server, user='DOMAIN\\username', password='your_password', auto_bind=True) # 先搜索目标组的DN(需要替换成你的域根DN和组名) conn.search( search_base='DC=yourdomain,DC=com', search_filter=f'(cn=目标组名称)', search_scope=SUBTREE, attributes=['distinguishedName'] ) group_dn = conn.entries[0].distinguishedName.value # 递归获取组成员的函数 def get_group_members(conn, group_dn, recursive=True): members = [] conn.search( search_base=group_dn, search_filter='(objectClass=*)', search_scope=SUBTREE, attributes=['member', 'sAMAccountName', 'objectClass'] ) for entry in conn.entries: # 如果是用户对象,加入列表 if 'user' in entry.objectClass: members.append(entry.sAMAccountName.value) # 如果是组对象且开启递归,继续获取子组成员 elif 'group' in entry.objectClass and recursive: members.extend(get_group_members(conn, entry.distinguishedName.value)) return members # 获取并打印所有成员 all_members = get_group_members(conn, group_dn) print("组成员列表:", all_members) # 最后记得关闭连接 conn.unbind()
这里要替换DC=yourdomain,DC=com为实际的域根DN,比如你的域是company.local,就写成DC=company,DC=local。
方法三:用pywin32库(调用Windows原生API)
如果只在Windows环境下运行,pywin32可以直接调用系统的原生API,适合获取本地组或者域组的直接成员(默认不递归,嵌套组需要自己写逻辑处理)。
安装:
pip install pywin32
代码示例:
import win32net import win32netcon # 获取域组的直接成员 def get_domain_group_members(domain_name, group_name): members = [] resume_handle = 0 # 循环获取所有成员(避免成员过多一页拿不完) while True: data, total, resume_handle = win32net.NetGroupGetUsers( domain_name, group_name, win32netcon.FILTER_NORMAL_ACCOUNT, resume_handle ) members.extend([user['name'] for user in data]) if resume_handle == 0: break return members # 调用示例 domain = '你的域名' group = '目标组名称' members = get_domain_group_members(domain, group) print(f"组 {group} 的直接成员:", members)
这个方法的缺点是默认只能拿直接成员,如果要处理嵌套组,得自己加逻辑判断每个成员是不是组,再递归获取。
内容的提问来源于stack exchange,提问作者vy32
相关产品推荐
相关产品推荐

