在Linux上用Python实现类似Get-ADUser的Active Directory查询
用python-ldap3实现Active Directory用户查询(类似Get-ADUser)
你可以通过ldap3库的搜索功能实现和PowerShell Get-ADUser类似的效果,核心是构造正确的LDAP查询过滤器,并指定要返回的属性。以下是具体实现步骤和代码示例:
核心实现思路
- 确定AD用户标识字段:AD中用于登录的用户名对应的LDAP属性是
sAMAccountName,这是你需要用来匹配查询的字段(不管CN是否和用户名一致)。 - 设置搜索范围:因为用户分布在不同OU,需要设置搜索范围为
SUBTREE,这样会遍历整个目录树查找匹配对象。 - 指定返回属性:明确要求返回
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
相关产品推荐
相关产品推荐

