python - para - Cómo recuperar todos los atributos de la base de datos LDAP
python ldap para windows (3)
Estoy usando el módulo ldap de python para conectarme al servidor ldap . Puedo consultar la base de datos, pero no sé cómo recuperar los campos presentes en la base de datos , de modo que puedo notificar al usuario con antelación para consultar la base de datos, diciéndole que el campo al que está intentando acceder no está en la base de datos .
Por ejemplo, si los campos presentes son solo
cn
memberOf
y si el usuario intenta consultar la base de datos con filtro
cn and memberOf and notcontained
Debería ser capaz de saber que el atributo no contento no está en el esquema de dabase.
Cómo puedo lograr esto.
Gracias.
Estoy usando el módulo ldap de python para conectarme al servidor ldap. Puedo consultar la base de datos, pero no sé cómo recuperar los campos presentes en la base de datos, de modo que puedo notificar al usuario con antelación para consultar la base de datos, diciéndole que el campo al que está intentando acceder no está en la base de datos .
Una solución simple sería buscar e imprimir una lista de las claves del resultado.
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()
Por ejemplo, contra mi servidor AD, devuelve lo siguiente:
[''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'']
La raíz DSE y posible base DN del esquema
Suponiendo que al cliente LDAP solo le importa qué atributos están definidos en el esquema (ver extensibleObject
continuación), para determinar si un attribute
está definido en el esquema del servidor, recupere el esquema. En muchos servidores de directorio, el DN base (u objeto base) para el esquema se define en el atributo subSchemaSubEntry
que podría estar presente en la raíz DSE. Para obtener más información acerca de la raíz DSE, vea LDAP: The Root DSE . Para recuperar los contenidos del DSE raíz, transmita una solicitud de búsqueda al servidor que consista en un objeto base de ''''
y un alcance de búsqueda de base
, y una lista de atributos solicitada que comprenda *
y +
.
extensibleObject
Tenga en cuenta que la presencia de objectClass extensibleObject
permite a los clientes LDAP agregar cualquier nombre y valor de atributo que requieran, al igual que un bloque común de basura FORTRAN, es decir, los atributos podrían estar presentes en una entrada pero no definidos en el esquema.
SubSchemaSubEntry no presente
Si el atributo subSchemaSubEntry
no está presente, póngase en contacto con los administradores del servidor y solicite información sobre cómo recuperar el esquema y sobre los derechos de acceso suficientes para hacerlo.
SubSchemaSubEntry presente
Si el atributo subSchemaSubEntry
está presente, lea el esquema transmitiendo una solicitud de búsqueda al servidor utilizando el valor del atributo subSchemaSubEntry
como el objeto base, un alcance de búsqueda de one
y una lista de atributos solicitada consistente de *
y +
. Las definiciones de tipo de atributo y las definiciones de objectClass están contenidas en el esquema.
Necesita leer el esquema de su servidor ldap.
Este código puede funcionar para usted, como tempalte
#!/usr/bin/env python
#coding:utf-8
# Author: peter --<[email protected]>
# 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]
Entonces puedes envolver esta clase de esta manera
#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