python 3.7和ldap3阅读组成员身份

时间:2018-11-20 16:48:30

标签: python-3.7 ldap3

我正在使用Python 3.7和ldap3。我可以建立连接并检索我感兴趣的组的列表。我在找小组成员时遇到了麻烦。

import React, { Component } from "react";

class BandSearch extends Component {
  constructor(props) {
    super(props);

    this.state = {
      band: "",
      events: []
    };
  }

  componentDidMount() {
    this.handleChange();
  }

  async getBand(e) {
    e.preventDefault();
    try {
      const res = await fetch(
        `https://rest.bandsintown.com/artists/${
          this.state.band
        }/events?app_id=acdb6da27e696632f85c3733dd43db52`
      );
      const events = await res.json();
      this.setState({
        events: events
      });
    } catch (e) {
      console.log(e);
    }
  }

  handleChange = () => {
    this.setState({
      band: this.result.value
    });
    console.log("state", this.state);
  };

  render() {
    console.log(this.state.band);
    return (
      <div>
        <h3>Enter Band to check on tour dates</h3>
        <form>
          <input
            type="text"
            placeholder="Enter band name"
            ref={input => (this.result = input)}
            onChange={this.handleChange}
          />
          <button onClick={this.getBand}>Search</button>
        </form>
      </div>
    );
  }
}

export default BandSearch;

此时server = Server('ldaps.ad.company.com', use_ssl=True, get_info=ALL) with Connection(server, 'mydomain\\ldapUser', '******', auto_bind=True) as conn: base = "OU=AccountGroups,OU=UsersAndGroups,OU=WidgetDepartment," \ + "OU=LocalLocation,DC=ad,DC=company,DC=com" criteria = """( &(objectClass=group) ( |(sAMAccountName=grp-*widgets*) (sAMAccountName=grp-oldWidgets) ) )""" attributes = ['sAMAccountName', 'distinguishedName'] conn.search(base, criteria, attributes=attributes) groups = conn.entries 包含了我想要的所有组。我想在各个小组之间发短信,以收集成员。

groups

知道小组中有人,但是 for group in groups: # print(cn) criteria = f""" (& (objectClass=person) (memberof:1.2.840.113556.1.4.1941:={group.distinguishedName}) ) """ # criteria = f""" # (& # (objectClass=person) # (memberof={group.distinguishedName}) # ) # """ attributes = ['displayName', 'sAMAccountName', 'mail'] conn.search(base, criteria, attributes=attributes) people = conn.entries 始终是一个空列表。是否进行回溯搜索都没关系。

我想念什么?

修改

这个问题的背景知识太长了,无法解决。我对这个特定问题有一个理论。我没时间了,并切换到另一个python LDAP库-正在运行。我认为这个问题的问题可能是我将查询“格式化”成多行。新的ldap lib(people)抱怨了,我删除了换行符,它才起作用。我没有时间回过头来用python-ldap来测试该理论。

1 个答案:

答案 0 :(得分:1)

people在组循环中的每次迭代中都将被覆盖。 也许group中最后一个groups条目的搜索结果为空。

您应该在循环之外初始化一个空列表,然后将其扩展为结果:

people = []
for group in groups:
    ...
    conn.search(...)
    people.extend(conn.entries)

关于您的代码段的另一条注释。在搜索过滤器中将objectClass定义与属性定义结合使用时,您可以考虑使用Reader类,该类将在内部进行合并。

此外,我想指出的是,我创建了一个对象关系映射器,您可以在其中使用声明性python语法简单地定义查询,例如:

from ldap3_orm import ObjectDef, Reader
from ldap3_orm.config import config
from ldap3_orm.connection import conn

PersonDef = ObjectDef("person", conn)
r = Reader(conn, PersonDef, config.base_dn, PersonDef.memberof == group.distinguishedName)
r.search()
可以在http://code.bsm-felder.de/doc/ldap3-orm上找到

ldap3-orm文档