Как исправить LDAPSocketReceiveError: ошибка при получении данных: тайм-аут операции чтения при использовании LDAP_MATCHING_RULE_IN_CHAIN ​​/ 1.2.840.113556.1.4.1941? - PullRequest
0 голосов
/ 02 февраля 2020

Я пытаюсь получить группу пользователей рекурсивно.
Например: пользователь A является частью G1, а G1 является частью G2, я должен получить G1 и G2 в качестве вывода для A.

My код:

query = "(&(objectClass=group)(member:1.2.840.113556.1.4.1941:=CN=nn\, rr,OU=tt,OU=uu,OU=mm,OU=ss,OU=bb,OU=ss,OU=ll,DC=aa,DC=ss,DC=com))"
tls = ldap3.Tls(validate=ssl.CERT_NONE, version=ssl.PROTOCOL_TLS)
server = ldap3.Server(<<domaincontroller>>, get_info=ldap3.ALL, mode=ldap3.IP_V4_PREFERRED, tls=tls, use_ssl=True)
with ldap3.Connection(server=server,authentication=ldap3.NTLM,auto_bind=True,password=domain.password,read_only=True,receive_timeout=self.config.ldap_timeout,user=domain.user) as ldap_connection:
    search_parameters = {'search_base': domain.base_dn,'search_filter': ldap_query_find_all_groups_with_our_user_as_member,'attributes': ['*']}
    ldap_connection.search(**search_parameters)
    print(ldap_connection.entries)

Работает нормально без: 1.2.840.113556.1.4.1941:, но при этом я получаю ошибку, как показано ниже.

Примечание: Также есть вероятность дублирования. Где родитель имеет группу в качестве своего ребенка, а ребенок снова имеет ту же группу, что и его ребенок. Также, хотя я точно не знаю, могут быть возможности, когда 2 группы являются частью друг друга и вызывают тупик. Я не уверен, что LDAP_MATCHING_RULE_IN_CHAIN ​​обрабатывает такие ситуации.

Traceback (most recent call last):
  File "/opt/myapp/venv/lib/python3.6/site-packages/ldap3/strategy/sync.py", line 82, in receiving
    data = self.connection.socket.recv(self.socket_size)
  File "/usr/local/lib/python3.6/ssl.py", line 994, in recv
    return self.read(buflen)
  File "/usr/local/lib/python3.6/ssl.py", line 871, in read
    return self._sslobj.read(len, buffer)
  File "/usr/local/lib/python3.6/ssl.py", line 633, in read
    v = self._sslobj.read(len)
socket.timeout: The read operation timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/opt/myapp/venv/lib/python3.6/site-packages/app/core.py", line 283, in smita
    ldap_connection.search(**search_parameters)
  File "/opt/myapp/venv/lib/python3.6/site-packages/ldap3/core/connection.py", line 789, in search
    response = self.post_send_search(self.send('searchRequest', request, controls))
  File "/opt/myapp/venv/lib/python3.6/site-packages/ldap3/strategy/sync.py", line 139, in post_send_search
    responses, result = self.get_response(message_id)
  File "/opt/myapp/venv/lib/python3.6/site-packages/ldap3/strategy/base.py", line 324, in get_response
    responses = self._get_response(message_id)
  File "/opt/myapp/venv/lib/python3.6/site-packages/ldap3/strategy/sync.py", line 157, in _get_response
    responses = self.receiving()
  File "/opt/myapp/venv/lib/python3.6/site-packages/ldap3/strategy/sync.py", line 92, in receiving
    raise communication_exception_factory(LDAPSocketReceiveError, type(e)(str(e)))(self.connection.last_error)
ldap3.core.exceptions.LDAPSocketReceiveError: error receiving data: The read operation timed out

1 Ответ

2 голосов
/ 02 февраля 2020

Тайм-аут, как правило, означает, что сервер не ответил в течение ожидаемого периода времени, поэтому клиент перестал ждать. Это может быть трудоемким запросом. Попробуйте увеличить receive_timeout, чтобы у него было больше времени для возврата результатов.

...