You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:06:43