Одной из наиболее распространенных проблем при запросе Active Directory с помощью PowerShell является правильное построение синтаксиса фильтра. Параметры Filter
и LDAP Filter на всех модулях cmdlet ActiveDirectory в PowerShell представляют собой черный ящик для многих.
В этом блоге мы глубоко погрузимся в понимание того, как использовать фильтры Active Directory. Надеюсь, что к концу этого поста вы больше не будете пытаться использовать этот Where-Object
и правильный фильтр!
Предварительные требования
Для того, чтобы работал любой из кодов, которые я собираюсь вам показать, я предполагаю, что:
- у вас установлен модуль PowerShell ActiveDirectory
- вы находитесь на компьютере, присоединенном к домену
- вы можете успешно подключиться и аутентифицироваться на контроллере домена AD
Есть два разных языка фильтра, которые вы можете использовать при поиске объектов с помощью большинства 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
. Если вы хотите найти всех пользователей, соответствующих определенному имени, вы бы использовали:
Имена свойств могут быть именем или 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 отражает это; только Отдел профессиональных услуг отображается.
Используя идентификатор объекта сопоставления или параметр RecursiveMatch
, вы узнаете, что они косвенно являются членами Общего доступа ко всем отделам. Это потому, что группа Отдел профессиональных услуг является членом Общего доступа ко всем отделам.
Оба возвращают следующее:
Параметры SearchBase и SearchScope
В больших средах AD может содержаться много тысяч объектов. Способ улучшения производительности и сокращения количества возвращаемых объектов для любого запроса – установка области поиска.
Параметр SearchBase
определяет, где в иерархии AD начинается поиск. При использовании командлетов это строковое представление уникального имени (и по умолчанию является «вершиной» домена). Также существует три уровня SearchScope
:
- Base – Объект, указанный в качестве SearchBase.
- OneLevel – ищет объекты, непосредственно содержащиеся в SearchBase, но не в подконтейнерах.
- SubTree – ищет объекты, содержащиеся в SearchBase и в любых подконтейнерах, рекурсивно по всей иерархии AD.

В приведенном выше примере, при установке параметра 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, и вы получите преимущества от отличной производительности и эффективности!