Скрипт Jython LDAP для получения значения атрибута sAMAccountName

Мне нужно создать сценарий jython для извлечения атрибута sAMAccountName из Active Directory и либо сохранить его в таблице базы данных, либо сравнить с существующими данными. Цель состоит в том, чтобы оценить, был ли пользователь удален из группы в AD, и сделать этого пользователя неактивным в Maximo. Сценарий вернет имена учетных записей и установит пользователя Maximo как неактивного для тех пользователей Maximo, которые не возвращены запросом LDAP. Maximo не удаляет или иным образом не изменяет пользователя, если он был удален из AD. Вот код, который я нашел из примера.

# Jython LDAP Example

from javax.naming import *
from java.util import *
from javax.naming.directory import *

# Credentials to access LDAP
user = "cn=binduser,dc=domain,dc=com"
passwd = "password"

# Query starting point and query target 
search_start = "dc=domain,dc=com"
search_target = "(&(objectClass=user)(memberof=CN=Maximo,OU=Groups,DC=domain,DC=com))"
#search_attributes = "sAMAccountName"

# Setup LDAP Context Options
settings = Hashtable()
settings.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory")
settings.put(Context.PROVIDER_URL, "ldap://ldapserver:389")
settings.put(Context.SECURITY_PRINCIPAL, user)
settings.put(Context.SECURITY_CREDENTIALS, passwd)

# Connect to LDAP Server
ctx = InitialDirContext(settings)

srch = SearchControls()
srch.setSearchScope(SearchControls.SUBTREE_SCOPE)

# Execute LDAP Search
results = ctx.search(search_start, search_target, srch )

#Display Search`
for result in results:

    attributes = result.getAttributes()
    names = []
    for atr in attributes.getIDs():
        if atr == "sAMAccountName":
            names.append(str(atr))

    for name in names:
        print attributes.get(name)

Однако это дает результат: «sAMAccountName: userid».

Как я могу указать ему искать или возвращать только значение sAMAccountName, а не все остальные атрибуты? Прямо сейчас этот скрипт возвращает все атрибуты, связанные с пользователем, которые не требуются, требуется только имя sAMAccountName.

Первая часть — получение только имен учетных записей из LDAP, с которыми я не знаком.

Спасибо!


person TrojanMan78    schedule 16.12.2016    source источник


Ответы (1)


Ускоренный курс по запросам LDAP Каждое сравнение или логическая инструкция заключены в круглые скобки. Итак, учитывая ваш search_target:

  • (objectClass=user) -- пример сравнения
  • (& ... ) -- логическая инструкция "и" для ... списка сравнений или других инструкций
  • (| ... ) -- это логическая инструкция "или" для ... списка сравнений или других инструкций
  • (! ... ) -- логическая инструкция "не" для ... списка сравнений или других инструкций

Для поиска по определенному атрибуту просто добавьте условие в запрос LDAP, как показано здесь:

search_target = "(&(objectClass=user)(memberof=CN=Maximo,OU=Groups,DC=domain,DC=com)(sAMAccountName=%s))" % varWithSearchString

Что касается получения «sAMAccountName» в вашем выводе:

Вкратце: измените свой attributes.get(name) на attributes.get(name).get().

Вкратце: ваша проблема в том, что attributes.get(), имеющее тип java.naming.directory.Attributes (множественное число), возвращает javax.naming.directory.Attribute (единственное число), а не java.lang.String. И строковое представление атрибута Python — это то, что вы печатаете. Чтобы получить объект java.lang.Object, содержащийся в атрибуте, вам нужно вызвать его метод get().

person Preacher    schedule 17.12.2016