0

我无法通过 pyad 库将自己连接到另一个 Active Directory。我想做一个查询,但我尝试的一切都出现以下错误:

def ad_query_bwae(attribute, value):
    pyad.adbase.set_defaults(ldap_server="AD03.domain.com", username="XXXX", password="XXX", ldap_port=389)
    query = pyad.adquery.ADQuery()

    query.execute_query(
        attributes = ["sAmAccountName", "facsimileTelephoneNumber", "mail", "cn"],
        base_dn = "DC=b-w-automotive, DC=com",
        where_clause = attribute + "='" + value + "'"
    )


    for row in query.get_results():
        print(row)
        return row   

提供以下错误消息:

Traceback (most recent call last):
  File "C:\Users\fiku\Desktop\Lizenz_Projekt\neue_Lizenzabfrage\new_script.py", line 259, in <module>
    ad_query_bwae("sAmAccountName","fiku")
  File "C:\Users\fiku\Desktop\Lizenz_Projekt\neue_Lizenzabfrage\new_script.py", line 232, in ad_query_bwae
    query = pyad.adquery.ADQuery()
  File "c:\users\fiku\appdata\local\programs\python\python37-32\lib\site-packages\pyad\adquery.py", line 39, in __init__
    self.__adodb_conn.Open("Provider=ADSDSOObject")
  File "<COMObject ADODB.Connection>", line 0, in Open
  File "c:\users\fiku\appdata\local\programs\python\python37-32\lib\site-packages\win32com\client\dynamic.py", line 287, in _ApplyTypes_
    result = self._oleobj_.InvokeTypes(*(dispid, LCID, wFlags, retType, argTypes) + args)
pywintypes.com_error: (-2147352567, 'Ausnahmefehler aufgetreten.', (0, 'Microsoft OLE DB Service Components', 'Falscher Parameter.', None, 0, -2147024809), None)

错误消息是德语,但显示“参数错误”

4

1 回答 1

0

首先确保您设置了使用 ADQuery 查询 LDAP 的默认凭据:

pyad.set_defaults(ldap_server="example.com", username="manager", password="password")

然后,我认为基本 dn 语法可能是错误的:该字符串在 rdn 分隔符 ( ) 和 rdn'DC=b-w-automotive, DC=com'之间包含一个空格,因此您可能需要仔细检查域组件“bw-automotive”的实际 dn 字符串以查看如果它真的包含那个空白(这很不寻常 - 但允许 - 所以它可能是故意的):,DC=com

实现必须允许 [...] 空格字符出现在逗号或分号的任一侧。( RFC-2253 - 2.1)

...但是由于换行问题或类似问题,当您阅读它时,dn' 字符串表示也可能会欺骗您,因此当您尝试使用“虚拟”/无效 dn 时会出现错误。

通常需要在演示文稿中换行过长的 DN 字符串。换行应该通过在 RDN 分隔符之后插入空格来完成,或者,如果需要,在 AVA 分隔符之后插入空格。应该向用户注意,插入的空格不是 DN 字符串的一部分,在 LDAP 中使用之前将被删除。( RFC-4514 - 附录 A )


如果您的问题与基本 dn 无关,则必须是attribute和/或value无效,例如。从您帖子中的日志中:"sAmAccountName"如果您的后端架构设置为区分大小写(在 AD 中不确定),那么正确的大小写是"sAMAccountName".

记录这些变量并将它们的值与最终的 ldap 请求(AD 端)进行比较以检查查询是否与原始查询保持一致where_clause或是否存在任何编码/转义问题可能会有所帮助。

请参阅RFC-4515中的 LDAP 搜索过滤器定义和转义。

最后一件事:如果任何请求的属性从数据库中丢失(或拼写错误......),它可能会导致错误。如果您不确定并防止出现任何问题,请使用空数组,或['*']请求所有非内部属性。

于 2019-07-12T15:43:58.203 回答