Вопрос по python, ldap, ldap-query – Некоторые компании используют собственные ИТ-команды для внутреннего взаимодействия с инфраструктурой, поэтому может потребоваться использовать такие команды, чтобы избежать посещения подразделения по обеспечению соблюдения ИТ. "Никогда не говори никогда".

17

у выполнить следующий запрос в ldap

ldapsearch -h hostname -b dc=ernet,dc=in -x "(&(uid=w2lame)(objectClass=posixAccount))" gidnumber
ldapsearch -h hostname -b dc=ernet,dc=in -x "(&(gidNumber=1234)(objectClass=posixGroup))" cn

И использовать полученные таким образом переменные. Как я могу это сделать?

Ваш Ответ

4   ответа
36

и к серверу LDAP, я чувствую, что он не ответил на вопрос в целом. Вот что я реализовал, чтобы захватить почту и отдел пользователя. Это несколько смешивает обязательные атрибуты из исходного вопроса.

l = ldap.initialize('ldap://ldap.myserver.com:389')
binddn = "cn=myUserName,ou=GenericID,dc=my,dc=company,dc=com"
pw = "myPassword"
basedn = "ou=UserUnits,dc=my,dc=company,dc=com"
searchFilter = "(&(gidNumber=123456)(objectClass=posixAccount))"
searchAttribute = ["mail","department"]
#this will scope the entire subtree under UserUnits
searchScope = ldap.SCOPE_SUBTREE
#Bind to the server
try:
    l.protocol_version = ldap.VERSION3
    l.simple_bind_s(binddn, pw) 
except ldap.INVALID_CREDENTIALS:
  print "Your username or password is incorrect."
  sys.exit(0)
except ldap.LDAPError, e:
  if type(e.message) == dict and e.message.has_key('desc'):
      print e.message['desc']
  else: 
      print e
  sys.exit(0)
try:    
    ldap_result_id = l.search(basedn, searchScope, searchFilter, searchAttribute)
    result_set = []
    while 1:
        result_type, result_data = l.result(ldap_result_id, 0)
        if (result_data == []):
            break
        else:
            ## if you are expecting multiple results you can append them
            ## otherwise you can just wait until the initial result and break out
            if result_type == ldap.RES_SEARCH_ENTRY:
                result_set.append(result_data)
    print result_set
except ldap.LDAPError, e:
    print e
l.unbind_s()
Чтобы завершить комментарий @Caumons; чтобы избежать использования while 1, сделайте это:res = l.search_s(basedn, searchScope, searchFilter, searchAttribute) print res l.unbind_s() The Django Ninja
Лучший пользовательsearch_s() чтобы избежатьwhile 1 Caumons
9

Вы, вероятно, хотите, чтобы мы"LDAP" модуль. Код будет выглядеть примерно так:

    import ldap
    l = ldap.initialize('ldap://ldapserver')
    username = "uid=%s,ou=People,dc=mydotcom,dc=com" % username
    password = "my password"
    try:
      l.protocol_version = ldap.VERSION3
      l.simple_bind_s(username, password)
      valid = True
    except Exception, error:
      print error
Тебе следуетapt-get install python-ldap до этого работает. 9000
Я сумасшедший, или это не отвечает на вопрос? Он спрашивает, как выполнить запрос, а вы показываете ему, как связывать. Mark E. Haase
@mehasse: этот пример предназначен для демонстрации общего использования модуля ldap, что, я думаю, и делает. Если вы пытаетесь выполнить запрос, вы можете использовать метод .search для объекта ldap. Claris
2

ldap_server это объект, который вы получаете от ldap.initialize (). Возможно, вам также потребуется выполнить привязку перед вызовом этой функции, в зависимости от того, какой сервер LDAP вы используете и к чему вы пытаетесь обратиться.base_dn а такжеfilter_ похожи на то, что у вас есть в вашей версии командной строки.limit максимальное количество возвращаемых записей.

def _ldap_list(ldap_server, base_dn, filter_, limit=0):
    """ Generator: get a list of search results from LDAP asynchronously. """

    ldap_attributes = ["*"] # List of attributes that you want to fetch.
    result_id = ldap_server.search(base_dn, ldap.SCOPE_SUBTREE, filter_, ldap_attributes)
    records = 0

    while 1:
        records += 1

        if limit != 0 and records > limit:
            break

        try:
            result_type, result_data = ldap_server.result(result_id, 0)
        except ldap.NO_SUCH_OBJECT:
            raise DirectoryError("Distinguished name (%s) does not exist." % base_dn)

        if result_type == ldap.RES_SEARCH_ENTRY:
            dn = result_data[0][0]
            data = result_data[0][1]
            yield dn, data
        else:
            break

Помните, что вставка пользовательских значений в ваш запрос LDAP опасна! Это форма внедрения, которая позволяет злоумышленнику изменить смысл запроса. Видеть:http://www.python-ldap.org/doc/html/ldap-filter.html

0

а запроса ldap:

from commands import getoutput
result = getoutput('ldapsearch -h hostname -b dc=ernet,dc=in -x "(&(uid=w2lame)(objectClass=posixAccount))"')
print result

в вашей системе должен быть установлен двоичный файл ldapsearch.

С уважением.-

Использование команд, когда есть библиотека Python, никогда не было бы хорошей идеей. jdborg
Некоторые компании используют собственные ИТ-команды для внутреннего взаимодействия с инфраструктурой, поэтому может потребоваться использовать такие команды, чтобы избежать посещения подразделения по обеспечению соблюдения ИТ. "Никогда не говори никогда". qneill

Похожие вопросы