如何检索LDAP数据库的所有属性

时间:2012-07-10 10:58:32

标签: python ldap python-ldap

我正在使用 python ldap模块连接到 ldap服务器。我能够查询数据库,但我不知道如何 检索数据库中存在的字段 ,以便我可以提前通知用户查询数据库,他试图访问的字段不在数据库中。

例如,如果存在的字段只是

cn
memberOf

如果用户尝试使用过滤器

查询数据库
cn and memberOf and notcontained

我应该能够知道 notcontained 属性不在dabase架构中。

我怎样才能做到这一点。

感谢。

3 个答案:

答案 0 :(得分:5)

您需要阅读ldap服务器的架构。

此代码可能对您有用,如tempalte

#!/usr/bin/env python
#coding:utf-8
# Author:  peter --<pjl@hpc.com.py>
# Purpose: Tareas comunes a utilizar con respecto a schemas ldap
# Created: 01/05/12
import ldap
import ldap.schema



########################################################################
class SchemasIPA(object):

    __ldaps = ldap.schema

    #----------------------------------------------------------------------
    def __init__(self, url):
        """Constructor"""
        ldap._trace_level = 0
        ldap.set_option(ldap.OPT_DEBUG_LEVEL,0)
        subschemasubentry_dn, self.schema = ldap.schema.urlfetch(url,ldap._trace_level)
        self.oc_tree = self.schema.tree(ldap.schema.ObjectClass)        
        self.at_tree = self.schema.tree(ldap.schema.AttributeType)        

    def getobjectclasses(self):
        """
        trae la listas de objectclasses de un servidor dado
        """
        allobjc = {}
        for a in self.oc_tree.keys():
            objc = self.schema.get_obj(ldap.schema.ObjectClass, a)

            if objc != None:
                allobjc[objc.oid] = (objc.names, objc.must, objc.may, objc.sup, objc.obsolete)

        return allobjc

    def getatributes(self):
        """
        trae la lista de atributos de un servidor dado
        """
        allatt= {}
        o = []
        for a in self.at_tree.keys():
            att = self.schema.get_obj(ldap.schema.AttributeType, a)

            if att != None:
                allatt[att.oid] = (att.names, att.syntax, att.syntax_len, att.desc, att.collective, att.equality, att.single_value)

        return allatt

    def getvalidoid(self, objects):
        """
        retorno un valor oid libre valida para la creacion de esquemas y atributos
        el proceso valido es pedirle a la iana un oid valido, pero se tarda mas de un mes
        los oid a utilizar son valores predefinidos al momento de la instalacion del servidor ldap
        """
        pass

if __name__ == '__main__':
    sch = SchemasIPA('ldap://localhost')
    #at = sch.getatributes()
    ob = sch.getobjectclasses()

    for a, b in ob.iteritems():
        print a
        print b[0]

然后你可以像这样包装这个类

#a file contained the above class
import schemas

olschemas = schemas.SchemasIPA(url='ldap://192.168.1.81')

#here are, some magic :)
pa = olschemas.schema.get_obj(olschemas._SchemasIPA__ldaps.ObjectClass, 'posixaccount')
pa.must #going to print all the attributes that can't be null's
pa.may #going to print all the attributes that are optional's

答案 1 :(得分:3)

根DSE和架构的可能基本DN

假设LDAP客户端只关心模式中定义的属性(请参阅下面的extensibleObject),以确定服务器模式中是否定义了attribute,检索模式。在许多目录服务器中,模式的基本DN(或基础对象)在属性subSchemaSubEntry中定义,该属性可能存在于根DSE中。有关根DSE的更多信息,请参阅LDAP: The Root DSE。要检索根DSE的内容,请将搜索请求发送到服务器,该服务器包含''的基础对象和base的搜索范围,以及由*组成的请求的属性列表和+

extensibleObject的

请注意,objectClass extensibleObject的存在允许LDAP客户端添加他们需要的任何属性名称和值,就像FORTRAN垃圾公共块一样,也就是说,属性可能存在于条目中但未在架构。

subSchemaSubEntry不存在

如果subSchemaSubEntry属性不存在,请与服务器管理员联系,询问有关检索架构的信息以及获取足够访问权限的信息。

subSchemaSubEntry存在

如果存在subSchemaSubEntry属性,请使用subSchemaSubEntry属性的值作为基础对象,将搜索请求发送到服务器来读取架构,搜索范围为one以及*+一致的请求属性列表。属性类型定义和objectClass定义包含在模式中。

答案 2 :(得分:1)

  

我正在使用python的ldap模块连接到ldap服务器。我能   查询数据库,但我不知道如何检索字段   存在于数据库中,以便我可以提前通知用户   查询数据库,告诉他他正在尝试的领域   访问权限不在数据库中。

一个简单的解决方案是搜索然后从结果中打印一个键列表。

import ldap

# connect to your ldap server

some_dn = '...' # Your base dn
some_lookup = '...' # your lookup attr

result = conn.search_s(some_dn,ldap.SCOPE_SUBTREE,some_lookup)
result[0][1].keys()

例如,针对我的AD服务器,它返回以下内容:

['mailNickname',
 'publicDelegatesBL',
 'logonCount',
 'cn',
 'countryCode',
 'dSCorePropagationData',
 'objectClass',
 # ... many many more
'telephoneNumber',
'physicalDeliveryOfficeName',
'name',
'memberOf',
'codePage',
'userAccountControl',
'msExchMDBRulesQuota',
'lastLogon',
'protocolSettings',
'uSNChanged',
'sn',
'msExchVersion',
'mDBUseDefaults',
'givenName',
'msExchMailboxGuid',
'lastLogoff']