Пользователи фильтра запросов LDAP с группами, подобными * x * - PullRequest
0 голосов
/ 14 декабря 2018

В настоящее время я использую Python и LDAP для запросов к Active Directory для пользователей.

У меня есть список имен, которые являются первыми последними.Не достаточно конкретно, чтобы найти точного пользователя.

Я бы хотел фильтр, который бы нашел всех пользователей, которые соответствуют 'Last, First *' и принадлежат к любой группе с ключевым словом в ней.

    _filter = '''(& (objectclass=user)
                    (objectcategory=person)
                    (name={}*) )'''.format(search_string)

и я попытался добавить ...

                    (memberOf=CN=*Keyword*,OU=Delegated,OU=Groups,DC=amr,DC=corp,DC=xxxxxx,DC=com)

к моему фильтру, но безуспешно.

Если бы это был SQL, я бы написал что-то вроде:

 Select *  
 From    
    Users 
 Where
    Users.name like 'First, Last%'    
 and Users.memberOf like 'Keyword%'

Обновление:

После просмотра ответа Габриэля я запускаю это.

def get_idsids(self, search_string):
   _filter = '''(& (objectclass=user)
                   (objectcategory=person)
                   (anr={}) )'''.format(search_string)

    # Search for user. 
    # Will return list of users matching criteria.
    # The results are wrapped up as a list(tuple(dict))) where the dict vals are binary strings or lists of binary strings.
    users = self.con.search_s(ActiveDirUser.BASEDN, ldap.SCOPE_SUBTREE, _filter, ['displayName', 'sAMAccountName', 'memberOf'])

    # This line is ugly... It just converts the results to a list of ids
    # So long as the user has at least one group with 'Keyword' in the name.
    # upper() is used to make the Keyword requriement case insensitive.
    return [user[1]['sAMAccountName'][0].decode() for user in users if 'KEYWORD' in ''.join(map(str, user[1]['memberOf'])).upper()]

Интересно, могу ли я искать группы с ключевым словом в названии и строить фильтры из этого?Кроме того, это будет быстрее?Я предполагаю, что так как AD вероятно хэширует членство в группе.

Я пойду почитаю, но я предполагаю, что имена групп доступны для поиска по шаблону?

1 Ответ

0 голосов
/ 14 декабря 2018

Я предлагаю вам использовать Разрешение неоднозначных имен :

_filter = '''(& (objectclass=user)
                (objectcategory=person)
                (anr={}) )'''.format(search_string)

Прочтите эту документацию, чтобы понять, как она работает, но она может найти пользователей, если вы передадите ей строку «первый последний»».Это то, что использует окно поиска в AD Users and Computers.

Просто имейте в виду, что вы можете получить двойные числа, если у людей схожие имена.Если вы возьмете мое имя, например: если вы будете искать «Габриэль Люси», и там был кто-то еще с именем «Габриэль Лучано», вы найдете нас обоих.

Это:

(memberOf=CN=*Keyword*,OU=Delegated,OU=Groups,DC=amr,DC=corp,DC=xxxxxx,DC=com)

не работает, потому что вы не можете использовать подстановочные знаки для любого атрибута, который является distinguishedName, например memberOf.

Это в любом случае для Active Directory.Другие каталоги LDAP могут разрешить это.

Если вам нужно проверить, являются ли пользователи членами групп, тогда вы можете указать при поиске вернуть атрибут memberOf в поиске (я не знаю, phython,но у вас должен быть способ сообщить, какие атрибуты вы хотите вернуть).Затем вы можете просмотреть группы в атрибуте memberOf и найти это ключевое слово.

...