咨询支持使用当前执行账号AD凭据直通认证的Python LDAP模块
解决方案
完全支持这种直通身份验证的需求,以下是两种常用的成熟实现方案:
方案1:Windows环境优先选择pywin32的ADSI接口
该方案基于Windows原生的AD服务接口,完全复用当前执行脚本用户的AD身份上下文,和PowerShell的默认认证逻辑一致,不需要在代码中显式传递任何凭据:
import win32com.client # 自动绑定当前域,使用当前登录用户身份完成认证 root_dse = win32com.client.GetObject("LDAP://rootDSE") domain_nc = root_dse.Get("defaultNamingContext") domain_conn = win32com.client.GetObject(f"LDAP://{domain_nc}") # 示例:查询所有未禁用的域用户账号和显示名 rs = domain_conn.OpenRecordset(f""" SELECT sAMAccountName, displayName FROM 'LDAP://{domain_nc}' WHERE objectClass='user' AND userAccountControl <> 514 """) while not rs.EOF: print(f"账号:{rs.Fields('sAMAccountName').Value} | 显示名:{rs.Fields('displayName').Value}") rs.MoveNext()
只要当前执行脚本的域账号拥有对应AD资源的访问权限,即可直接运行,无需任何凭据配置。
方案2:使用标准LDAP协议的python-ldap包
如果需要使用通用LDAP协议操作,python-ldap在Windows环境下支持SSPI的GSSAPI认证,同样可以直通当前用户身份,不需要硬编码账号密码:
import ldap from ldap.sasl import gssapi # 替换为你的域控制器地址 ldap_conn = ldap.initialize("ldap://your-domain-controller.com") # 直接使用当前用户安全上下文完成绑定,无需传入凭据 ldap_conn.sasl_interactive_bind_s("", gssapi()) # 示例:查询指定组织单元下的用户 base_dn = "ou=users,dc=example,dc=com" result = ldap_conn.search_s(base_dn, ldap.SCOPE_SUBTREE, "(objectClass=user)", ["sAMAccountName", "name"]) for entry in result: print(entry)
适用前提
- 两种方案均要求脚本运行在已加入AD域的Windows设备上,执行脚本的账号本身是已完成身份验证的有效域账号
- 非Windows环境下需要提前配置Kerberos票证,才能实现类似的直通认证效果
内容的提问来源于stack exchange,提问作者user3246693
相关产品推荐
相关产品推荐

