LDAP: запрос пользователя во всем домене с использованием sAMAccountName - PullRequest
0 голосов
/ 09 сентября 2011

Я использую модуль python-ldap для работы с AD на сервере Windows 2003 R2.

Когда я ищу ObjectClass=Person, я вижу, что некоторые услуги также возвращаются в результатах запроса. Я хочу знать, как я могу изменить свой запрос так, чтобы возвращались только пользовательские записи. Также можете ли вы указать мне любую документацию, которая фокусируется на этом.

Вот фрагмент из моей ipython командной строки:


    ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)
    l=ldap.initialize(server)
    l.simple_bind_s(user, password) 
    user_filter = '(&(objectClass=person)(sAMAccountName=ouuser1))'
    base_dn='DC=id-ad, DC=idea, DC=com'
    qres=l.search_ext_s(base_dn, ldap.SCOPE_SUBTREE, user_filter)
    print qres

Результат, который я получаю


    [('CN=ouuser1,OU=newou,DC=id-ad,DC=idea,DC=com',
      {'accountExpires': ['9223372036854775807'],
       'badPasswordTime': ['0'],
       'badPwdCount': ['0'],
       'cn': ['ouuser1'],
       'codePage': ['0'],
       'countryCode': ['0'],
       'displayName': ['ouuser1'],
       'distinguishedName': ['CN=ouuser1,OU=newou,DC=id-ad,DC=idea,DC=com'],
       'givenName': ['ouuser1'],
       'instanceType': ['4'],
       'lastLogoff': ['0'],
       'lastLogon': ['0'],
       'logonCount': ['0'],
       'memberOf': ['CN=ougroup1,OU=newou,DC=id-ad,DC=idea,DC=com'],
       'name': ['ouuser1'],
       'objectCategory': ['CN=Person,CN=Schema,CN=Configuration,DC=id-ad,DC=idea,DC=com'],
       'objectClass': ['top', 'person', 'organizationalPerson', 'user'],
       'objectGUID': ['@\x87C\\\xdf\xbe\xe0M\x8c\xb7S-\xf4\x00.\xd0'],
       'objectSid': ['\x01\x05\x00\x00\x00\x00\x00\x05\x15\x00\x00\x00\x8c\xc6\xd8N\xe3`\x16\xe0\x96\xcf4\xabb\x04\x00\x00'],
       'primaryGroupID': ['513'],
       'pwdLastSet': ['0'],
       'sAMAccountName': ['ouuser1'],
       'sAMAccountType': ['805306368'],
       'uSNChanged': ['417845'],
       'uSNCreated': ['417839'],
       'userAccountControl': ['512'],
       'userPrincipalName': ['ouuser1@id-ad.idea.com'],
       'whenChanged': ['20110909055335.0Z'],
       'whenCreated': ['20110909055335.0Z']}),
     (None,
      ['ldaps://ForestDnsZones.id-ad.idea.com/DC=ForestDnsZones,DC=id-ad,DC=idea,DC=com']),
     (None,
      ['ldaps://DomainDnsZones.id-ad.idea.com/DC=DomainDnsZones,DC=id-ad,DC=idea,DC=com']),
     (None, ['ldaps://id-ad.idea.com/CN=Configuration,DC=id-ad,DC=idea,DC=com'])]

Записи, которые я хочу исключить, являются.

(None,
  ['ldaps://ForestDnsZones.id-ad.idea.com/DC=ForestDnsZones,DC=id-ad,DC=idea,DC=com']),
 (None,
  ['ldaps://DomainDnsZones.id-ad.idea.com/DC=DomainDnsZones,DC=id-ad,DC=idea,DC=com']),
 (None, ['ldaps://id-ad.idea.com/CN=Configuration,DC=id-ad,DC=idea,DC=com'])]

1 Ответ

0 голосов
/ 24 марта 2016

У меня недавно возникла эта проблема, когда наша команда AD включила встроенные функции AD DNS (разделы приложений DNS). У меня было много существующего кода, который будет перебирать результаты LDAP, например, так:

for record in records:
    for key, value in record[1].items():
        # Do stuff with the returned keys/values here

Из-за этого изменения мой код сломался, потому что теперь неожиданно появились результаты, такие же как ваш:

(None,
      ['ldaps://ForestDnsZones.ourdomain.com/DC=ForestDnsZones,DC=ourdomain,DC=com']),

Исправление относительно простое:

for record in records:
    if record[0]: # Add this conditional
        for key, value in record[1].items():

Если первый элемент в кортеже, возвращенный AD / LDAP, равен None, то это означает, что это реферал LDAP. Их можно безопасно игнорировать, так как мы не следуем за рефералами (потому что они по своей сути повреждены; они не сообщают вам, какие учетные данные необходимы для подключения к указанному адресу).

Дополнительная информация: эта ситуация возникнет только в том случае, если вы запрашиваете весь домен (например, ваш base_dn равен 'dc = что угодно, dc = ваша компания, dc = com' без 'ou = что-то'). Это происходит потому, что AD считает свою службу записи DNS «равноправным» глобальным доменом. Поэтому, когда вы запрашиваете что-нибудь , используя только глобальный домен в качестве вашего base_dn, он добавляет эти странные дополнительные записи в конец каждого успешного запроса (в основном: если все контроллеры домена настроены одинаково - что их может и не быть!).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...