You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 03:45:55