Active Directory: Использование LDAP-фильтров
В оснастке Пользователи и компьютеры Active Directory есть возможность создавать индивидуальные запросы и сохранять их.
Щелкаем правой кнопкой на Сохраненные запросы и выбираем Создать -> Запрос:

В окне Новый запрос впечатываем название запроса и нажимаем кнопку Запрос...:

В окне Поиск: Пользовательский поиск выбираем вкладку Дополнительно:


В поле Введите запрос LDAP вводим запрос, например, количество всех пользователей в домене:
(&(objectCategory=person)(objectClass=user))

Нажимаем Ok и еще раз Ok:

Теперь, чтобы увидеть результат запроса необходимо включить флажки для отображения элементов в окне консоли ММС. Переходим Вид -> Настроить:

В окне Настройка вида включаем необходимые флажки:

После включения элемента Область описания мы видим количество всех пользователей домена (в т.ч. и отключенных):

1. Фильтр (sAMAccountType=805306368) более эффективен для объектов "пользователь"
2. Обратный слеш должен быть заменен на \5C
3. Астериск "*" должен быть заменена на \2A
4. Строка 1.2.840.113556.1.4.803 указывает LDAP_MATCHING_RULE_BIT_AND. Обозначает побитовое "И" атрибута флага, например userAccounControl, groupType или systemFlags и битовая маска (2, 32, 65536). Условие возвращает "Истину", когда побитовое "И" значения атрибута и битовой маски не равно нулю, что указывает на установку бита.
5. Атрибут accountExpires имеет тип Integer8, 64-битное значение, представляющее дату в UTC - количество интервалов в 100 наносекунд, начиная с 12:00 01.01.1601. Если срок действия учетной записи не ограничен, то атрибут accountExpires равен 0 или 2^63-1 (9,223,372,036,854,775,807 - наибольшее Interger64 число), оба значат "никогда".
6. При фильтрации атрибутов типа Boolean (булевые), например msNPAllowDialin или isMemberOfPartialAttributeSet, значения TRUE и FALSE должны быть введены в верхнем регистре.
7. Атрибут pwdLastSet имеет тип Integer8.
8. Байтовые массивы, например objectGUID, могут быть представлены как последовательность исключаемых шестнадцатеричных байтов. GUID {b95f3990-b59a-4a1b-9e96-86c66cb18d99} имеет hex-представление 90395fb99ab51b4a9e9686c66cb18d99". Порядок первых восьми байтов изменен.
9. objectSID хранится как байтовый массив. Можно указывать как десятичный формат S-1-5-21-73586283-152049171-839522115-1111 или шестнадцатеричное представление, где каждый байт исключен \01\05\00\00\00\00\00\05\15\00\00\00\6B\D6\62\04\13\16\10\09\43\17\0A\32\57\04\00\00", что позже можно использовать в VBScript.
10. Строка 1.2.840.113556.1.4.1941 указывает LDAP_MATCHING_RULE_IN_CHAIN. Применимо только к DN-атрибутам. Это расширенный оператор совпадения, проходящий по цепи наследования к корню до тех пор, пока не найдет совпадение. Выявляет вложенность групп. Доступен на контроллерах домена с Windows Server 2003 SP2 и более поздних версий.
11. Строка "anr" обозначает "неоднозначное разрешение имен" (Ambiguous Name Resolution). Подробнее здесь http://www.rlmueller.net/AmbiguousNameResolution.htm
12. Для запросов к атрибутам схемы нужно использовать поиск по контейнеру Schema, например, cn=Schema,cn=Configuration,dc=MyDomain,dc=com.
13. Для запросов к атрибутам конфигурации нужно использовать поиск по контейнеру Configuration, например cn=Configuration,dc=MyDomain,dc=com.
14. Основной группой для контроллеров домена должна быть "Контроллеры домена" с известным RID, равным 516.
15. Многие LDAP-фильтры различных типов групп AD могут использовать атрибут groupType и опускать условие (objectCategory=group), т.к. только группы имеют атрибут groupType. Например, фильтр (groupType=2) вернет все глобальные группы распространения. При использовании оператора "НЕТ", например (!groupType:1.2.840.113556.1.4.803:=2147483648) для групп распространения (группы, не являющиеся группами безопасности) вернет все объекты без атрибута groupType. Таким образом, нужно использовать дополнительное условие (objectCategory=group).
16. Может показаться, что LDAP-фильтр для встроенных групп безопасности может быть (groupType=2147483649) или (groupType=-2147483643). т.к. побитовое "ИЛИ" между 2147483648 (маска групп безопасности) и 1 (маска встроенных групп) даст обозначенный результат. Однако результат фильтра будет пустым, т.к. встроенные группы являются локальными в домене.Нужно применить "ИЛИ" между полученными значениями и "4" (маска локальных в домене групп). Результат (2147483643 ИЛИ 1 ИЛИ 4) = 2147483653, после вычитания 2^32 станет -2147483643. Можно использовать как (groupType=2147483653), так и (groupType=-2147483643) для получения встроенных локальных в домене групп безопасности. Однако, проще использовать фильтр по условию (groupType:1.2.840.113556.1.4.803:=1).
17. Атрибуты userAccountControl и groupType принимают целочисленные 32-битные значения, т.е. от -2^31 до 2^31 - 1 или от -2147483648 до 2147483647. Значения, назначенные этим атрибутам будут результатом побитового "ИЛИ" указанной маски для каждого значения. Например, значение groupType для для универсальной группы безопасности определяется применением "ИЛИ" к маске универсальной группы 8 и и группы безопасности 2147483648. Результат (8 ИЛИ 2147483648) равен 2147483656. Данное значение превышает допустимое для целочисленного 32-битного значения, поэтому оно обращается в отцательно число. 2147483656 становится -2147483640. Правило сделюущее - если целочисленное 32-битное поле превышает 2^31-1, то нужно вычесть из него 2^32 (4294967296). Таким образом groupType для универсальной грппы безопасности становится 2147967296 - 4294967296 = -2147483640. Это значение можно увидеть через "редактирование ADSI". Предпочтительно использование менно отрицательного значения, что является требованием для VBScript, т.к. его побитовые операторы могут обрабатывать только целочисленные 32-битные значения.
18. Существует 5 FSMO ролей. Для эмулятора PDC, владельца относительных эмуляторов и владельца инфраструктуры нужно опрашивать домен. Для владельца схемы нужно опрашивать контейнер schema, например cn=Schema,cn=Configuration,dc=MyDomain,dc=com. Для владельца доменных имен нужно опрашивать контейнер configuration, например cn=Configuration,dc=MyDomain,dc=com. В любом случае запрос вернет объекта типа nTDSDSA. Родитель данного объекта будет иметь относительное уникальное имя, указывающее на контроллер домена. Родительский объект имеет атрибут dnsHostName равный DNS-имени контроллера домена с требуемой FSMO-ролью.
Список литературы:
Active Directory: Использование LDAP-фильтров (ru-RU)
Оригинал статьи о фильтрах LDAP: Active Directory: LDAP Syntax Filters (en-US)
Синтаксис фильтров: http://msdn.microsoft.com/en-us/library/aa746475%28v=VS.85%29.aspx
Вернуться к Оглавлению
В оснастке Пользователи и компьютеры Active Directory есть возможность создавать индивидуальные запросы и сохранять их.
Щелкаем правой кнопкой на Сохраненные запросы и выбираем Создать -> Запрос:

В окне Новый запрос впечатываем название запроса и нажимаем кнопку Запрос...:

В окне Поиск: Пользовательский поиск выбираем вкладку Дополнительно:


В поле Введите запрос LDAP вводим запрос, например, количество всех пользователей в домене:
(&(objectCategory=person)(objectClass=user))

Нажимаем Ok и еще раз Ok:

Теперь, чтобы увидеть результат запроса необходимо включить флажки для отображения элементов в окне консоли ММС. Переходим Вид -> Настроить:

В окне Настройка вида включаем необходимые флажки:

После включения элемента Область описания мы видим количество всех пользователей домена (в т.ч. и отключенных):

Примеры запросов
| Запрос | LDAP-фильтр |
| Все пользователи |
(&(objectCategory=person)(objectClass=user)) |
| Все пользователи (прим. 1) | (sAMAccountType=805306368) |
| Все компьютеры |
(objectCategory=computer) |
| Все контакты |
(objectClass=contact) |
| Все группы |
(objectCategory=group) |
| Все организационные подразделения |
(objectCategory=organizationalUnit) |
| Все контейнеры |
(objectCategory=container) |
| Все встроенные контейнеры |
(objectCategory=builtinDomain) |
| Все домены |
(objectCategory=domain) |
| Компьютеры без описания |
(&(objectCategory=computer)(!description=*)) |
| Группы с описанием |
(&(objectCategory=group)(description=*)) |
| Пользователи с cn начитающимися на "Вас" |
(&(objectCategory=person)(objectClass=user) (cn=Вас*)) |
| Объекты с описанием "Отдел IT Ижевск\Казань" (прим. 2) |
(description=Отдел IT Ижевск\5CКазань) |
| Группы с cn начинающимся на "Test" или "Admin" | (&(objectCategory=group(|(cn=Test*)(cn=Admin*))) |
| Все пользователи с заполненными именем и фамилией. | (&(objectCategory=person)(objectClass=user) (givenName=*)(sn=*)) |
| Все пользователи с указанным e-mail |
(&(objectCategory=person)(objectClass=user) (|(proxyAddresses=*:jsmith@company.com) (mail=jsmith@company.com))) |
| Объекты с общим именем "Василий * Пупкин" (прим. 3) |
(cn=Василий \2A Пупкин) |
| Объекты с sAMAccountName, начинающимся на "x", "y", или "z" |
(sAMAccountName>=x) |
| Объекты с sAMAccountName начинающимся с "a" или цифры или символа, кроме "$" |
(&(sAMAccountName<=a)(!sAMAccountName=$*)) |
| пользователи с установленным параметром "Срок действия пароля не ограничен" (прим. 4) |
(&(objectCategory=person)(objectClass=user) (userAccountControl:1.2.840.113556.1.4.803:=65536)) |
| Все отключенные пользователи (прим. 4) | (&(objectCategory=person)(objectClass=user) (userAccountControl:1.2.840.113556.1.4.803:=2)) |
| Все включенные пользователи (прим. 4) | (&(objectCategory=person)(objectClass=user) (!userAccountControl:1.2.840.113556.1.4.803:=2)) |
| Пользователи, не требующие паролей (прим. 4) | (&(objectCategory=person)(objectClass=user) (userAccountControl:1.2.840.113556.1.4.803:=32)) |
| Пользователи с включенным параметром "Без предварительной проверки подлинности Kerberos" |
(&(objectCategory=person)(objectClass=user) (userAccountControl:1.2.840.113556.1.4.803:=4194304)) |
| Пользователи с неограниченным сроком действия учетной записи (прим. 5) | (&(objectCategory=person)(objectClass=user) (|(accountExpires=0) (accountExpires=9223372036854775807))) |
| Учетные записи, доверенные для делегирования |
(userAccountControl:1.2.840.113556.1.4.803:=524288) |
| Чувствительные и недоверенные для делегирования учетные записи |
(userAccountControl:1.2.840.113556.1.4.803:=1048574) |
| Все группы распространения (прим. 4, 15) | (&(objectCategory=group) (!groupType:1.2.840.113556.1.4.803:=2147483648)) |
| Все группы безопасности (прим. 4) | (groupType:1.2.840.113556.1.4.803:=2147483648) |
| Все встроенные группы (прим. 4, 16) | (groupType:1.2.840.113556.1.4.803:=1) |
| Все глобальные группы (прим. 4) | (groupType:1.2.840.113556.1.4.803:=2) |
| Все локальные в домене группы (прим. 4) | (groupType:1.2.840.113556.1.4.803:=4) |
| Все универсальные группы (прим. 4) | (groupType:1.2.840.113556.1.4.803:=8) |
| Все глобальные группы безопасности (прим. 17) | (groupType=-2147483646) |
| Все универсальные группы безопасности (прим. 17) | (groupType=-2147483640) |
| Все локальные в домене группы безопасности (прим. 17) | (groupType=-2147483644) |
| Все глобальные группы распространения |
(groupType=2) |
| Все объекты с имемем участника-службы | (servicePrincipalName=*) |
| Пользователи с параметром "Разрешить доступ" на вкладке "Входящие звонки" (прим. 6) |
(&(objectCategory=person)(objectClass=user) (msNPAllowDialin=TRUE)) |
| Группы, созданные после 1 марта 2011 | (&(objectCategory=group) (whenCreated>=20110301000000.0Z)) |
| Пользователи, обязанные изменить свой пароль при следующем входе в систему |
(&(objectCategory=person)(objectClass=user) (pwdLastSet=0)) |
| Пользователи, сменившие свои пароли после 15.04.2011 (прим. 7) |
(&(objectCategory=person)(objectClass=user) (pwdLastSet>=129473172000000000)) |
| Пользовали с "основной" группой, отличающейся от "Пользователи домена" |
(&(objectCategory=person)(objectClass=user) (!primaryGroupID=513)) |
| Компьютеры с "основной" группой "Контроллеры домена" | (&(objectCategory=computer)(primaryGroupID=515)) |
| Объект с GUID "90395FB99AB51B4A9E9686C66CB18D99" (прим. 8) |
(objectGUID=\90\39\5F\B9\9A\B5\1B\4A\9E\96 \86\C6\6C\B1\8D\99) |
| Объект с SID "S-1-5-21-73586283-152049171 -839522115-1111" (прим. 9) |
(objectSID=S-1-5-21-73586283-152049171 -839522115-1111) |
| Объект с SID "010500000000000515 0000006BD662041316100943170A3257040000" (прим. 9) |
(objectSID=\01\05\00\00\00\00\00\05\15 \00\00\00\6B\D6\62\04\13\16\10\09\43\17\0A\32 \57\04\00\00) |
| Компьютеры, не являющиеся контроллерами домена (прим. 4) | (&(objectCategory=computer) (!userAccountControl:1.2.840.113556.1.4.803:=8192)) |
| Все контроллеры домена (прим. 4) | (&(objectCategory=computer) (userAccountControl:1.2.840.113556.1.4.803:=8192)) |
| Все контроллеры домена (прим. 14) | (primaryGroupID=516) |
| Все компьютеры с Windows Server |
(&(objectCategory=computer) (operatingSystem=*server*)) |
| Все с Windows Server, исключая контроллеры домена (прим. 4) | (&(objectCategory=computer) (operatingSystem=*server*) (!userAccountControl:1.2.840.113556.1.4.803:=8192)) |
| Прямые члены группы |
(memberOf=cn=Test,ou=East,dc=Domain,dc=com) |
| Пользователя - не прямые члены указанной группы |
(&(objectCategory=person)(objectClass=user) (!memberOf=cn=Test,ou=East,dc=Domain,dc=com)) |
| Группы с указанным прямым членом |
(member=cn=Jim Smith,ou=West, dc=Domain,dc=com) |
| Все члены группы, включая вложенность групп (прим. 10) | (memberOf:1.2.840.113556.1.4.1941:= cn=Test,ou=East,dc=Domain,dc=com) |
| все группы, членом которых является указанный пользователь, учитывая вложенность групп (прим. 10) | (member:1.2.840.113556.1.4.1941:= cn=Jim Smith,ou=West,dc=Domain,dc=com) |
| Объекты с givenName "Василий*" и sn "Пупкин*", или cn "Василий Пупкин*" (прим. 11) | (anr=Василий Пупкин*) |
| Атрибуты контейнера "Schema", реплицируемые в глобальный каталог (прим. 6, 12) | (&(objectCategory=attributeSchema) (isMemberOfPartialAttributeSet=TRUE)) |
| Атрибуты схемы, не реплицируемые на другие контроллеры домена (прим. 4, 12) | (&(objectCategory=attributeSchema) (systemFlags:1.2.840.113556.1.4.803:=1)) |
| Все связи сайтов в контейнере configuration (Прим. 13) | (objectClass=siteLink) |
| Объекты nTDSDSA связаные с глобальными каталогами. Позволяет определить контроллеры домена с глобальным каталогом. (Прим. 4) | (&(objectCategory=nTDSDSA) (options:1.2.840.113556.1.4.803:=1)) |
| Объект nTDSDSA связанный с ролью PDC-эмулятора. Позволяет определить контроллер домена с FSMO-ролью PDС-эмулятор (прим. 18). | (&(objectClass=domainDNS)(fSMORoleOwner=*)) |
| Объект nTDSDSA связанный с ролью Владелец относительных идентификаторов. Позволяет определить контроллер домена с FSMO-ролью Владелец относительных идентификаторов (прим. 18). | (&(objectClass=rIDManager)(fSMORoleOwner=*)) |
| Объект nTDSDSA связанный с ролью владелец инфраструктуры. Позволяет определить контроллер домена с FSMO-ролью владелец инфраструктуры (прим. 18). | (&(objectClass=infrastructureUpdate)(fSMORoleOwner=*)) |
| Объект nTDSDSA связанный с ролью владелец доменных имен. Позволяет определить контроллер домена с FSMO-ролью владелец доменных имен(прим. 18). | (&(objectClass=crossRefContainer)(fSMORoleOwner=*)) |
| Объект nTDSDSA связанный с ролью владелец схемы. Позволяет определить контроллер домена с FSMO-ролью владелец схемы (прим. 18). | (&(objectClass=dMD)(fSMORoleOwner=*)) |
| Все серверы Exchange в контейнере Configuration (прим. 13) |
(objectCategory=msExchExchangeServer) |
| Объекты, защищенные AdminSDHolder | (adminCount=1) |
| Все отношения доверия |
(objectClass=trustedDomain) |
| Все объекты групповой политики |
(objectCategory=groupPolicyContainer) |
| Все контроллеры домена, доступные только для чтения (прим. 4) | (userAccountControl:1.2.840.113556.1.4.803:=67) |
Примечания
1. Фильтр (sAMAccountType=805306368) более эффективен для объектов "пользователь"
2. Обратный слеш должен быть заменен на \5C
3. Астериск "*" должен быть заменена на \2A
4. Строка 1.2.840.113556.1.4.803 указывает LDAP_MATCHING_RULE_BIT_AND. Обозначает побитовое "И" атрибута флага, например userAccounControl, groupType или systemFlags и битовая маска (2, 32, 65536). Условие возвращает "Истину", когда побитовое "И" значения атрибута и битовой маски не равно нулю, что указывает на установку бита.
5. Атрибут accountExpires имеет тип Integer8, 64-битное значение, представляющее дату в UTC - количество интервалов в 100 наносекунд, начиная с 12:00 01.01.1601. Если срок действия учетной записи не ограничен, то атрибут accountExpires равен 0 или 2^63-1 (9,223,372,036,854,775,807 - наибольшее Interger64 число), оба значат "никогда".
6. При фильтрации атрибутов типа Boolean (булевые), например msNPAllowDialin или isMemberOfPartialAttributeSet, значения TRUE и FALSE должны быть введены в верхнем регистре.
7. Атрибут pwdLastSet имеет тип Integer8.
8. Байтовые массивы, например objectGUID, могут быть представлены как последовательность исключаемых шестнадцатеричных байтов. GUID {b95f3990-b59a-4a1b-9e96-86c66cb18d99} имеет hex-представление 90395fb99ab51b4a9e9686c66cb18d99". Порядок первых восьми байтов изменен.
9. objectSID хранится как байтовый массив. Можно указывать как десятичный формат S-1-5-21-73586283-152049171-839522115-1111 или шестнадцатеричное представление, где каждый байт исключен \01\05\00\00\00\00\00\05\15\00\00\00\6B\D6\62\04\13\16\10\09\43\17\0A\32\57\04\00\00", что позже можно использовать в VBScript.
10. Строка 1.2.840.113556.1.4.1941 указывает LDAP_MATCHING_RULE_IN_CHAIN. Применимо только к DN-атрибутам. Это расширенный оператор совпадения, проходящий по цепи наследования к корню до тех пор, пока не найдет совпадение. Выявляет вложенность групп. Доступен на контроллерах домена с Windows Server 2003 SP2 и более поздних версий.
11. Строка "anr" обозначает "неоднозначное разрешение имен" (Ambiguous Name Resolution). Подробнее здесь http://www.rlmueller.net/AmbiguousNameResolution.htm
12. Для запросов к атрибутам схемы нужно использовать поиск по контейнеру Schema, например, cn=Schema,cn=Configuration,dc=MyDomain,dc=com.
13. Для запросов к атрибутам конфигурации нужно использовать поиск по контейнеру Configuration, например cn=Configuration,dc=MyDomain,dc=com.
14. Основной группой для контроллеров домена должна быть "Контроллеры домена" с известным RID, равным 516.
15. Многие LDAP-фильтры различных типов групп AD могут использовать атрибут groupType и опускать условие (objectCategory=group), т.к. только группы имеют атрибут groupType. Например, фильтр (groupType=2) вернет все глобальные группы распространения. При использовании оператора "НЕТ", например (!groupType:1.2.840.113556.1.4.803:=2147483648) для групп распространения (группы, не являющиеся группами безопасности) вернет все объекты без атрибута groupType. Таким образом, нужно использовать дополнительное условие (objectCategory=group).
16. Может показаться, что LDAP-фильтр для встроенных групп безопасности может быть (groupType=2147483649) или (groupType=-2147483643). т.к. побитовое "ИЛИ" между 2147483648 (маска групп безопасности) и 1 (маска встроенных групп) даст обозначенный результат. Однако результат фильтра будет пустым, т.к. встроенные группы являются локальными в домене.Нужно применить "ИЛИ" между полученными значениями и "4" (маска локальных в домене групп). Результат (2147483643 ИЛИ 1 ИЛИ 4) = 2147483653, после вычитания 2^32 станет -2147483643. Можно использовать как (groupType=2147483653), так и (groupType=-2147483643) для получения встроенных локальных в домене групп безопасности. Однако, проще использовать фильтр по условию (groupType:1.2.840.113556.1.4.803:=1).
17. Атрибуты userAccountControl и groupType принимают целочисленные 32-битные значения, т.е. от -2^31 до 2^31 - 1 или от -2147483648 до 2147483647. Значения, назначенные этим атрибутам будут результатом побитового "ИЛИ" указанной маски для каждого значения. Например, значение groupType для для универсальной группы безопасности определяется применением "ИЛИ" к маске универсальной группы 8 и и группы безопасности 2147483648. Результат (8 ИЛИ 2147483648) равен 2147483656. Данное значение превышает допустимое для целочисленного 32-битного значения, поэтому оно обращается в отцательно число. 2147483656 становится -2147483640. Правило сделюущее - если целочисленное 32-битное поле превышает 2^31-1, то нужно вычесть из него 2^32 (4294967296). Таким образом groupType для универсальной грппы безопасности становится 2147967296 - 4294967296 = -2147483640. Это значение можно увидеть через "редактирование ADSI". Предпочтительно использование менно отрицательного значения, что является требованием для VBScript, т.к. его побитовые операторы могут обрабатывать только целочисленные 32-битные значения.
18. Существует 5 FSMO ролей. Для эмулятора PDC, владельца относительных эмуляторов и владельца инфраструктуры нужно опрашивать домен. Для владельца схемы нужно опрашивать контейнер schema, например cn=Schema,cn=Configuration,dc=MyDomain,dc=com. Для владельца доменных имен нужно опрашивать контейнер configuration, например cn=Configuration,dc=MyDomain,dc=com. В любом случае запрос вернет объекта типа nTDSDSA. Родитель данного объекта будет иметь относительное уникальное имя, указывающее на контроллер домена. Родительский объект имеет атрибут dnsHostName равный DNS-имени контроллера домена с требуемой FSMO-ролью.
Список литературы:
Active Directory: Использование LDAP-фильтров (ru-RU)
Оригинал статьи о фильтрах LDAP: Active Directory: LDAP Syntax Filters (en-US)
Синтаксис фильтров: http://msdn.microsoft.com/en-us/library/aa746475%28v=VS.85%29.aspx
Вернуться к Оглавлению