How to fix "LDAPInvalidPortError: Port must be an integer"

How to fix "LDAPInvalidPortError: Port must be an integer"

我正在尝试使用 LDAP 连接到服务器。我已经让脚本在没有使用特定端口号的测试服务器上运行。当尝试连接到我们使用特定端口的开发系统时,我收到以下错误:

File "site-packages\ldap3\core\server.py", line 117, in__init__
ldap3.core.exceptions.LDAPInvalidPortError: port must be an integer
[7836] Failed to execute script ldap_query

过去我们使用 python-ldap,它在 ldap.initialize('LDAP://cd-dir...net/(Port)') 命令中的指定端口没有问题。产生错误的代码如下所示。

def ldap_connect(address, dn, password)
    server = Server(address)
    try:
        conn = Connection(server, dn, password, auto_bind = True)
        print('Authentication Successful')
        print(conn.extend.standard.who_am_i())
    except: LDAPBindError as err:
        print(LDAPBindError)

ldap_connect('LDAP://cd-dir-cd-test....net:port/dc=cd...dc=com', 'user', 'password') 

为了解决这个问题,我尝试从地址中取出端口号,并将其放入以下方式:

server = Server(address, port = XXX)

解决了 "port must be an integer" 错误。然而,这并没有解决问题。我收到的新错误是:

File "site-packages\ldap3\core\connection.py", line 325, in__init__
File "site-packages\ldap3\core\connection.py", line 340, in do_auto_bind
File "site-packages\ldap3\strategy\sync.py", line 56, in open
File "site-packages\ldap3\strategy\base.py", line 151, in open
ldap3.core.exceptions.LDAPSocketOpenError: invalid server address
[5976] Failed to execute script ldap_query

我该如何解决这个问题?还有其他方法可以设置我不知道的端口吗?

祝福,

您正在将 ldap:// URI 传递给 ldap_connect,但看起来 ldap3.Server class 需要主机名或地址。也就是说,您目前正在尝试这样做:

server = Server('ldap://cd-dir-cd-test.example.net:port')

当您需要的是:

server = Server('cd-dir-cd-test.example.net', port=port)

当然 port 必须是整数,而不是字符串。您可以使用 ldap3.utils.uri.parse_uri 方法从 ldap URI 中提取您想要的信息:

from ldap3 import Server, Connection
from ldap3.utils.uri import parse_uri


def ldap_connect(uri, dn, password):
    parsed = parse_uri(uri)
    server = Server(parsed['host'], use_ssl=parsed['ssl'], port=parsed['port'])
    conn = Connection(server, dn, password, auto_bind = True)
    print('Authentication Successful')
    print(conn.extend.standard.who_am_i())

    return conn

conn = ldap_connect('LDAP://cd-dir-cd-test....net:port/dc=cd...dc=com',
                    'user', 'password')