为什么LDAP_匹配_CHAIN或1.2.840.113556.1.4.1941中的_RULE_会为AD用户的递归组提供空白结果?

2024-05-15 07:42:36 发布

您现在位置:Python中文网/ 问答频道 /正文

尝试以下ldap查询

ldap_query = "(&(objectCategory=Person)(objectClass=user)(member:1.2.840.113556.1.4.1941:=CN=xx,CN=Users,DC=aa,DC=ss,DC=com))"
ldap_query = "(member:1.2.840.113556.1.4.1941:=CN=xx,CN=Users,DC=aa,DC=ss,DC=com)"

代码如下

for hostname in <<domain.domain_controllers>>:
    tls = ldap3.Tls(validate=ssl.CERT_NONE, version=ssl.PROTOCOL_TLS)
    server = ldap3.Server(hostname, 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=xx, read_only=True, receive_timeout=30,user=yy) as ldap_connection:
        search_parameters = {'search_base': 'DC=aa,DC=ss,DC=com', 'search_filter': ldap_query, 'attributes': ['*']}
        ldap_connection.search(**search_parameters)
        print(ldap_connection.entries)

它只是为所有DCs打印[],但用户有组和子组,这是手动检查的


Tags: comtruesslsearchservertlsconnectiondc
1条回答
网友
1楼 · 发布于 2024-05-15 07:42:36

我假设CN=xx,CN=Users,DC=aa,DC=ss,DC=com是一个用户对象,您正在尝试查找以该用户为成员的组。我说得对吗

第一个查询不起作用,因为它正在搜索设置了member属性的用户。用户没有member属性

第二个查询将返回以CN=xx作为成员的任何对象。唯一具有member属性的对象是组,但您可以进一步将其约束为仅包含组,这可能会提高查询的性能(因为objectClass已编制索引):

ldap_query = "(&(objectClass=group)(member:1.2.840.113556.1.4.1941:=CN=xx,CN=Users,DC=aa,DC=ss,DC=com))"

无需对每个DC进行相同的查询。他们都会给你相同的信息。如果此查询没有得到任何结果,可能有以下几个原因:

  1. 您的连接详细信息有问题。尝试进行一些其他查询,您知道这些查询应该像(objectClass=user)(将返回所有用户对象)一样工作,并查看是否得到结果
  2. 您正在使用的distinguishedName不正确。验证它是否正确。您可以尝试像这样搜索:(distinguishedName=CN=xx,CN=Users,DC=aa,DC=ss,DC=com)并查看是否得到结果
  3. 如果您的广告林有多个域,则您看到的组可能位于另一个域上。除非查询全局编录(GC),否则在其他域上找不到组

相关问题 更多 >