Освойте ваши LDAP-фильтры в PowerShell, изучая AD

Одной из наиболее распространенных проблем при запросе Active Directory с помощью PowerShell является правильное построение синтаксиса фильтра. Параметры Filter и LDAP Filter на всех модулях cmdlet ActiveDirectory в PowerShell представляют собой черный ящик для многих.

В этом блоге мы глубоко погрузимся в понимание того, как использовать фильтры Active Directory. Надеюсь, что к концу этого поста вы больше не будете пытаться использовать этот Where-Object и правильный фильтр!

Предварительные требования

Для того, чтобы работал любой из кодов, которые я собираюсь вам показать, я предполагаю, что:

Есть два разных языка фильтра, которые вы можете использовать при поиске объектов с помощью большинства cmdlet Active Directory: фильтры PowerShell и фильтры LDAP.

Фильтры PowerShell

Фильтры PowerShell используют стандартный синтаксис выражений PowerShell. Это обычно называется синтаксисом фильтра поиска Active Directory.

Эти фильтры используются с параметром Filter. Синтаксис параметра Filter

Операторы

При построении фильтра для параметра Filter вам потребуется использовать как минимум один оператор. Здесь используются операторы, с которыми вы, возможно, знакомы из использования команд, наподобие Where-Object.

Внутри параметра Filter вы можете использовать следующие операторы.

Operator Explanation
-eq Equal to
-le Less than or equal to
-ge Greater than or equal to
-ne Not equal to
-lt Less than
-gt Greater than
-approx Approximately equal to
-bor Bitwise OR
-band Bitwise AND
-recursivematch Recursive match
-like Like
-notlike Not like
-and Boolean AND
-or Boolean OR
-not Boolean NOT

Ссылка на свойства объектов AD

Внутри фильтра вы будете сравнивать различные свойства объектов AD с помощью операторов. Например, команда Get-AdUser возвращает свойство Name. Если вы хотите найти всех пользователей, соответствующих определенному имени, вы бы использовали:

PS51> Get-Aduser -Filter "Name -eq 'Adam Bertram'"

Имена свойств могут быть именем или LDAP-фильтром, возвращаемым с помощью команды AD.

Значения свойств обычно заключаются в одинарные или двойные кавычки. Принимается только один подстановочный знак – звездочка (*). Вы можете видеть выше, что фильтр заключен в двойные кавычки, но Adam Bertram заключен в одинарные кавычки.

Некоторые символы должны быть ‘экранированы’ при использовании в фильтрах. Это:

Character Escaped As Notes
`” Only required if the data is enclosed in double quotes.
\’ Only required if the data is enclosed in single quotes.
NUL \00 This is a standard LDAP escape sequence.
\ \5c This is a standard LDAP escape sequence.
* \2a Automatically escaped. Only in -eq and -ne comparisons. You should use -like and -notlike operators for wildcard comparison.
( /28 Automatically escaped.
) /29 Automatically escaped.
/ /2f Automatically escaped.

Что такое LDAP в Active Directory?

LDAP, или Протокол доступа к каталогам Lightweight Directory Access Protocol, является поставщиконезависимым протоколом для доступа к данным каталога и их модификации. Когда вы слышите слово “каталог”, вы можете подумать о телефонном справочнике, но в контексте Active Directory это означает гораздо больше. Множество различных типов объектов хранятся и становятся доступными с помощью Active Directory с протоколом LDAP, который функционирует как средство доступа к этим данным.

Поскольку Active Directory может хранить множество различных типов данных, приложениям и пользователям нужен способ легко запрашивать этот каталог. Читайте далее, чтобы узнать, как LDAP-фильтры помогают фильтровать эти данные!

LDAP-фильтры

Active Directory реализует LDAP, протокол доступа к каталогам Lightweight Directory Access Protocol. Использование параметра LDAPFilter с командлетами позволяет использовать LDAP-фильтры, такие как те, которые созданы в Active Directory Users and Computers

. Синтаксис LDAP-фильтров определен в RFC номер 4515

. Каждое правило фильтра окружено скобками ( ). Правила фильтра могут быть сгруппированы, окружив группу скобками и включив сравнительный оператор из следующих:

Operator Function
& and
| or
! not

LDAP-фильтры также имеют специальное правило сопоставления Идентификаторы объектов (OID):

OID Purpose
1.2.840.113556.1.4.803 Bitwise AND
1.2.840.113556.1.4.804 Bitwise OR
1.2.840.113556.1.4.1941 Chain matching (for distinguished name attributes)

Существует четыре типа фильтров:

Operator Explanation
= Equal to
~= Approximately equal to
>= Greater than or equal to
<= Less than or equal to

Четыре типа элементов:

Type Explanation
= Simple
=* Present
=something* Substring
Extensible varies depending on type

Правила фильтра LDAP должны использоваться с LDAP-именами атрибутов, и некоторые символьные значения должны быть ‘экранированы’, если используются в LDAP-фильтре. Это:

Character Escaped As
* \2a
( \28
) \29
\ \5c
NUL \00

Свойства для сравнения обычно не требуют обрамления в кавычки.

Примеры фильтров LDAP

Построение фильтров LDAP может быть вызовом. Вот несколько примеров использования фильтров групп Active Directory, которые вы можете использовать в качестве основы для создания своих собственных.

  • Все группы с именем (cn) “Отдел профессиональных услуг”

    'cn -eq "Отдел профессиональных услуг"' или `'(cn=Отдел профессиональных услуг)'

  • Все группы с именем “Отдел профессиональных услуг” и описанием “Live”

    '(cn -eq "Отдел профессиональных услуг") -и (description -eq "Live")' или '(&(cn=Отдел профессиональных услуг)(description=Live))'

  • Все группы с именем “Отдел профессиональных услуг” или “Общий доступ ко всем отделам”

    '(cn -eq "Отдел профессиональных услуг") -или (cn -eq "Общий доступ ко всем отделам")' или '(|(cn=Отдел профессиональных услуг)(cn=Общий доступ ко всем отделам))'

  • Все группы без описания “Live”. Включая те, у которых вообще нет поля описания

    '(!(description=Live))'

  • Все группы без описания “Live”. Исключая те, у которых вообще нет поля описания

    'description -ne "Live"'

  • Все группы с описанием “Live”, но не с именем “Professional Services Department”

    '(description -eq "Live") -and (cn -ne "Professional Services Department")' или '(&(description=Live)(!(cn=Professional Services Department)))'

  • Все группы с описанием ‘\\fileserver1\fileshare’

    'description -eq "\5c\5cfileserver1\5cfileshare"' или '(description=\5c\5cfileserver1\5cfileshare)'

Используя RecursiveMatch или Chain Matching

Использование идентификатора правила сопоставления OID или параметра RecursiveMatch – мощный способ решения часто задаваемого вопроса о запросе AD: ‘Как узнать все группы, в которых пользователь является членом, как напрямую, так и косвенно?’ Вы используете свойство поиска Active Directory memberOf для определения этого.

Использование простого правила сопоставления LDAP может быть более эффективным, чем большой сценарий. На примере нашего домена domain.local Кристин Диас является прямым членом группы безопасности Отдел профессиональных услуг. Просмотр свойства memberOf в AD отражает это; только Отдел профессиональных услуг отображается.

PS51> Get-ADUser -Identity Kristin.Diaz -Property memberOf

DistinguishedName : CN=Diaz Kristin,OU=Professional Services,OU=All User Accounts,DC=domain,DC=local
Enabled           : True
GivenName         : Kristin
MemberOf          : {CN=Professional Services Department,OU=All Groups,DC=domain,DC=local}
Name              : Diaz Kristin
ObjectClass       : user
ObjectGUID        : 04fe6336-c541-4e71-b7ed-6fee7db23482
SamAccountName    : Kristin.Diaz
SID               : S-1-5-21-447422785-3715515833-3878445295-1186
Surname           : Diaz
UserPrincipalName :

Используя идентификатор объекта сопоставления или параметр RecursiveMatch, вы узнаете, что они косвенно являются членами Общего доступа ко всем отделам. Это потому, что группа Отдел профессиональных услуг является членом Общего доступа ко всем отделам.

PS51> Get-ADGroup -LDAPFilter '(member:1.2.840.113556.1.4.1941:=CN=Diaz Kristin,OU=Professional Services,OU=All User Accounts,DC=domain,DC=local)'
PS51> Get-ADGroup -Filter 'member -RecursiveMatch "CN=Diaz Kristin,OU=Professional Services,OU=All User Accounts,DC=domain,DC=local"'

Оба возвращают следующее:

DistinguishedName : CN=All Departments Share Access,OU=All Groups,DC=domain,DC=local
GroupCategory     : Security
GroupScope        : Universal
Name              : All Departments Share Access
ObjectClass       : group
ObjectGUID        : 8ac0e0b7-9225-40a4-b168-a0330960e182
SamAccountName    : All Departments Share Access
SID               : S-1-5-21-447422785-3715515833-3878445295-1254

DistinguishedName : CN=Professional Services Department,OU=All Groups,DC=domain,DC=local
GroupCategory     : Security
GroupScope        : Universal
Name              : Professional Services Department
ObjectClass       : group
ObjectGUID        : a8432583-7cac-4e8e-8d94-51e1c5bb1989
SamAccountName    : Professional Services Department
SID               : S-1-5-21-447422785-3715515833-3878445295-1255

Параметры SearchBase и SearchScope

В больших средах AD может содержаться много тысяч объектов. Способ улучшения производительности и сокращения количества возвращаемых объектов для любого запроса – установка области поиска.

Параметр SearchBase определяет, где в иерархии AD начинается поиск. При использовании командлетов это строковое представление уникального имени (и по умолчанию является «вершиной» домена). Также существует три уровня SearchScope:

  1. Base – Объект, указанный в качестве SearchBase.
  2. OneLevel – ищет объекты, непосредственно содержащиеся в SearchBase, но не в подконтейнерах.
  3. SubTree – ищет объекты, содержащиеся в SearchBase и в любых подконтейнерах, рекурсивно по всей иерархии AD.
Example OU Structure

В приведенном выше примере, при установке параметра SearchBase в OU=All User Accounts,DC=domain,DC=local, значение SearchScope Base попытается запросить сам объект OU, значение SearchScope OneLevel будет искать только OU All User Accounts, а значение SearchScope SubTree будет искать как OU All User Accounts, так и OU Professional Services.

Итог

Теперь у вас должно быть хорошее представление о том, как фильтровать объекты с помощью командлетов PowerShell Active Directory. Вы видите, что создание правильного синтаксиса фильтра требует определенных усилий. Гораздо сложнее создавать подходящий фильтр, чем использовать cmdlet Where-Object.

Но затратьте время на изучение “правильного” способа фильтрации объектов AD, и вы получите преимущества от отличной производительности и эффективности!

Дополнительное чтение

Source:
https://adamtheautomator.com/ldap-filter/