如何用python-ldap获取指定objectClass的可用操作属性列表?
获取LDAP对象类对应的操作属性
你已经能用这段Python代码获取LDAP服务器的所有对象类,以及每个对象类的必填(must)和可选(may)属性:
import ldap conn = ldap.initialize("ldap://127.0.0.1:389") conn.simple_bind_s("cn=admin,dc=mydomain,dc=tld", "mypassword") res = conn.search_s("cn=subschema", ldap.SCOPE_BASE, "(objectclass=*)", ["*", "+"]) subschema_entry = res[0] subschema_subentry = ldap.cidict.cidict(subschema_entry[1]) subschema = ldap.schema.SubSchema(subschema_subentry) object_class_oids = subschema.listall(ldap.schema.models.ObjectClass) object_classes = [subschema.get_obj(ldap.schema.models.ObjectClass, oid) for oid in object_class_oids]
但像memberof(OpenLDAP memberof overlay提供)、pwdAccountLockedTime(ppolicy overlay提供)这类操作属性,并不会出现在对象类的may或must列表里——它们是LDAP系统用于特定功能的操作属性,需要通过以下方式获取:
方法1:从SubSchema中筛选操作属性并关联对象类
操作属性的定义存于subschema的attributeTypes中,通常带有NO-USER-MODIFICATION标记,或是属于特定overlay的属性集。你可以遍历所有属性定义,筛选出操作属性后,再匹配到对应的对象类:
# 获取所有属性定义 all_attrs = subschema.listall(ldap.schema.models.AttributeType) # 筛选操作属性:包含NO-USER-MODIFICATION标记,或是已知的overlay属性 operational_attrs = [] for attr_oid in all_attrs: attr = subschema.get_obj(ldap.schema.models.AttributeType, attr_oid) is_operational = False # 检查属性是否带有操作属性标记 if 'NO-USER-MODIFICATION' in attr.extensions: is_operational = True # 匹配已知的overlay属性名 overlay_attr_names = ['memberof', 'pwdaccountlockedtime', 'pwdpolicy'] if attr.name.lower() in overlay_attr_names: is_operational = True if is_operational: operational_attrs.append(attr) # 查看指定对象类(比如groupOfNames)可使用的操作属性 target_object_class = subschema.get_obj(ldap.schema.models.ObjectClass, 'groupOfNames') applicable_operational_attrs = [] for attr in operational_attrs: # 检查属性是否适用于目标对象类(或继承自top类) if target_object_class.oid in attr.object_classes or 'top' in attr.object_classes: applicable_operational_attrs.append(attr.name) print(f"groupOfNames适用的操作属性:{applicable_operational_attrs}")
方法2:查询具体条目时获取操作属性
如果你需要确认某个实际条目上的操作属性,可以在搜索时指定返回操作属性(用+作为属性参数):
# 查询目标条目,返回所有普通属性+操作属性 entry_result = conn.search_s( "cn=testgroup,ou=groups,dc=mydomain,dc=tld", ldap.SCOPE_BASE, "(objectclass=groupOfNames)", ["*", "+"] ) if entry_result: entry = entry_result[0][1] # 提取目标操作属性 operational_attrs_in_entry = [k for k in entry.keys() if k.lower() in ['memberof', 'pwdaccountlockedtime']] print(f"条目上的操作属性:{operational_attrs_in_entry}")
注意事项
- 操作属性的存在依赖于LDAP服务器的配置(比如是否启用了对应的overlay),未开启相关功能时,对应属性不会出现在schema中。
- 部分操作属性(如
memberof)会自动关联到特定对象类(如groupOfNames),可通过属性的OBJECT-CLASS约束确认适用范围。
内容的提问来源于stack exchange,提问作者azmeuk
相关产品推荐
相关产品推荐

