私は、python-ldapを使ってgroupOfNamesのメンバーであるグループに属するすべてのLDAPユーザーアカウントのリストを取得する最良の方法を探しています。これは、ADではなくOpenLDAPサーバー上にあります。私は仕事をするが、実行するために永遠にかかる以下の関数を書いた。私は、python-ldapの中に私が気付いていない組み込み関数をいくつか持っていることを望んでいます。あるいは、これをもっと速く動かすために変更できるものがあります。もしそうでなければ、他の人がこのコードを役に立つと思うでしょう。助けをあらかじめありがとう!python-ldapでネストされたLDAPグループメンバーを取得
def get_nested_members(con, dn):
"""
Parameters
----------
con : LDAPObject
An authenticated python-ldap connection object
dn : string
The dn of the groupOfNames to be checked
Returns
-------
members : list
A list of all accounts that are members of the given dn
"""
members = []
searched = []
to_search = [dn]
while len(to_search) > 0:
current_dn = to_search.pop()
cn = current_dn.split(',')[0]
r = con.search_s(base_dn, ldap.SCOPE_SUBTREE, cn, [])[0][1]
if 'groupOfNames' in r['objectClass']:
if 'member' in r:
for i in r['member']:
if((i != current_dn) and (i not in searched)):
to_search.append(i)
searched.append(current_dn)
elif 'posixGroup' in r['objectClass']:
if 'memberUid' in r:
for i in r['memberUid']:
members.append(i)
searched.append(current_dn)
elif 'posixAccount' in r['objectClass']:
if 'uid' in r:
members.append(r['uid'][0])
else:
print('ERROR: encountered record of unknown type:')
pprint(str([current_dn, r]))
return list(set(members))
LDAPツリーの構造に応じて、あなたはこのアルゴリズムは、おそらくエントリ複数回の多くの重複セットを検索してもよいと思われるよう 'ldap.SCOPE_BASE'を使用して試してみたいことがあります。また、 '(|(objectClass = groupOfNames)(objectclass = posixGroup)(objectclass = posixAccount))'のようなLDAPフィルタを使って検索を制限することもできます。また、返す属性を指定することもできます(属性のサブセットが各検索で返されるように)。 'member'、' memberUid'および 'uid'属性のみを要求します。 –