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

在Linux上用Python实现类似Get-ADUser的Active Directory查询

用python-ldap3实现Active Directory用户查询(类似Get-ADUser)

你可以通过ldap3库的搜索功能实现和PowerShell Get-ADUser类似的效果,核心是构造正确的LDAP查询过滤器,并指定要返回的属性。以下是具体实现步骤和代码示例:

核心实现思路

  1. 确定AD用户标识字段:AD中用于登录的用户名对应的LDAP属性是sAMAccountName,这是你需要用来匹配查询的字段(不管CN是否和用户名一致)。
  2. 设置搜索范围:因为用户分布在不同OU,需要设置搜索范围为SUBTREE,这样会遍历整个目录树查找匹配对象。
  3. 指定返回属性:明确要求返回distinguishedName,也可以按需添加其他属性(如cn、mail等)。

完整代码示例

from ldap3 import Server, Connection, SUBTREE
from flask import Flask

app = Flask(__name__)

def get_ad_user_distinguished_name(ldap_server, bind_dn, bind_password, username):
    # 初始化LDAP服务器连接
    server = Server(ldap_server)
    # 绑定到AD服务器(使用有权限读取用户信息的账号)
    with Connection(server, user=bind_dn, password=bind_password, auto_bind=True) as conn:
        # 构造LDAP查询过滤器:匹配sAMAccountName等于目标用户名
        search_filter = f'(sAMAccountName={username})'
        # 执行搜索:替换search_base为你的AD域根DN(比如"DC=company,DC=com")
        conn.search(
            search_base='DC=yourdomain,DC=com',
            search_filter=search_filter,
            search_scope=SUBTREE,
            attributes=['distinguishedName']
        )
        # 处理查询结果
        if len(conn.entries) == 0:
            return None  # 未找到用户
        # sAMAccountName理论上唯一,若出现多结果可按需处理
        return conn.entries[0].distinguishedName.value

# Flask接口示例
@app.route('/get-user-dn/<username>')
def get_user_dn(username):
    # 替换为你的AD服务器信息和绑定账号
    ldap_server = 'ldap://your-ad-server.yourdomain.com'
    bind_dn = 'CN=ServiceAccount,OU=Admin,DC=yourdomain,DC=com'
    bind_password = 'your-service-account-password'
    
    dn = get_ad_user_distinguished_name(ldap_server, bind_dn, bind_password, username)
    if dn:
        return f"用户{username}的distinguishedName: {dn}"
    else:
        return f"未找到用户{username}", 404

if __name__ == '__main__':
    app.run()

关键注意事项

  • 替换实际参数:务必把代码中的ldap_server、search_base、bind_dn、bind_password替换成你环境中的真实值。
  • 绑定账号权限:用来绑定AD的账号需要有读取域内用户信息的权限(普通域用户权限通常即可)。
  • 特殊字符处理:如果用户名包含LDAP特殊字符(如*、(、)等),需要用ldap3.utils.conv.escape_filter_chars()方法转义,避免查询出错。

内容的提问来源于stack exchange,提问作者Tobi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 17:17:43