Назад | Перейти на главную страницу

Запрос PowerShell AD LDS с фильтром с использованием подстановочного знака ведет себя не так, как ожидалось

Я являюсь администратором веб-сайта системы управления обучением, структура страниц которого хранится в AD LDS. Я пытаюсь выполнить запрос, чтобы получить объекты (страницы на сайте), соответствующие фильтру для отличительного имени. Мой фильтр работает не так, как ожидалось.

Ниже приведены три запроса, все они идентичны, за исключением параметра фильтра. Это не совсем то, что я пытаюсь сделать, но в демонстрационных целях это проиллюстрирует мою проблему.

Это работает (возвращает очень большое количество результатов):

Get-ADObject -Server 'localhost:389' -SearchBase 'CN=Academics,CN=Portal,O=Jenzabar,C=US' -Filter 'distinguishedName -like "*"'

Это также работает (возвращает один результат):

Get-ADObject -Server 'localhost:389' -SearchBase 'CN=Academics,CN=Portal,O=Jenzabar,C=US' -Filter 'distinguishedName -like "CN=LEC,CN=Academics,CN=Portal,O=Jenzabar,C=US"'

Однако это не дает результатов, и я не понимаю, почему:

Get-ADObject -Server 'localhost:389' -SearchBase 'CN=Academics,CN=Portal,O=Jenzabar,C=US' -Filter 'distinguishedName -like "C*"'

Насколько я могу судить, третий запрос должен возвращать все результаты первого запроса и, по крайней мере, обязательно должен возвращать единственный результат второго запроса. Любая помощь будет оценена по достоинству!

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

Из Active Directory: фильтры синтаксиса LDAP

Подстановочный знак '*' разрешен, кроме случаев, когда (Атрибут AD) является атрибутом DN. Примерами атрибутов DN являются различающееся имя, менеджер, directReports, member и memberOf. Если атрибут - DN, то разрешен только оператор равенства, и вы должны указать полное отличительное имя для значения (или символ * для всех объектов с любым значением атрибута).

Ваш первый пример distinguishedName -like "*" означает, что «отличительное имя не пусто», поэтому оно возвращает результаты.

Вместо этого используйте Where-Object для сопоставления атрибутов вне синтаксиса фильтра LDAP. Следующее возвращает все объекты AD из $server под $searchBase затем использует Where-Object для фильтрации коллекции, где distinguishedName Спички CN=Jason*.

Get-ADObject -Server $server -SearchBase $searchBase -Filter * |
  Where-Object { $_.distinguishedName -like 'CN=Jason*' }

У вас также есть полный вариант регулярного выражения, используя -match вместо того -like.