我正在使用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
来测试该理论。
答案 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文档