Pyad配置pyad_setdefaults连接其他服务器查询活动目录报错如何解决
pyad跨Active Directory服务器连接报错排查方案
1 优先修正代码已知的语法&拼写错误
你提供的代码存在两处基础错误,优先修复:
- 第3行
pyad.pyad_setdefaults(...)末尾缺少闭合右括号) - 查询方法拼写错误:
execut_equery应为execute_query
修正后的基础代码框架:
import pyad import pyad.adquery # 新版本pyad推荐使用set_defaults方法,弃用旧的pyad_setdefaults pyad.set_defaults( ldap_server='myserv', username='你的域\\用户名', # 必须带域前缀,格式为DOMAIN\账号,或UPN格式xxx@域.com password='pass' ) q = pyad.adquery.ADQuery() attributes = ['SamAccountName'] # 跨域查询必须指定search_base和过滤条件,否则默认用本地域根会报错 q.execute_query( attributes=attributes, where_clause="objectClass = 'user'", # 过滤只查询用户对象 base_dn="DC=你的目标域,DC=com" # 替换为目标AD的根域名拆分格式,比如域是abc.com就写DC=abc,DC=com ) result = q.get_all_results()
2 核心报错原因排查
在你已确认网络连通、账号有访问权限的前提下,仍报错通常是以下3个原因:
- 用户名格式错误:连接外部AD服务器时,用户名不能只写账号名,必须带上域标识,格式为
域名\登录账号或账号@域名后缀,否则pyad会默认用本地域校验账号,导致认证失败 - 未指定查询根:跨AD服务器查询时,必须在
execute_query中传入base_dn参数指定目标AD的搜索根,否则pyad会沿用本地域的搜索路径,在目标AD上找不到对应路径就抛出异常 - LDAP服务端口问题:如果目标AD服务器禁用了389默认端口,需要在ldap_server参数中指定完整地址,比如
ldap://myserv:自定义端口,开启SSL的话用ldaps://myserv:636
3 基础连接校验方法
可以先单独测试连接是否正常,运行下方代码验证基础连通性:
from pyad import aduser try: user = aduser.ADUser.from_cn("已知存在的测试账号名", base_dn="DC=目标域,DC=com") print("连接成功,测试用户属性:", user.get_attribute("SamAccountName")) except Exception as e: print("连接报错详情:", str(e))
内容的提问来源于stack exchange,提问作者Unicorn
相关产品推荐
相关产品推荐

