вторник, 6 декабря 2011 г.

Особенности параметра–Filter

Сегодня в почту пришло письмо от многоуважаемого коллеги. К слову, как хорошо, когда задают вопросы. Это позволяет столкнуться с задачами и проблемами, с которыми раньше не сталкивался. Так вот:
Андрей, добрый день! У меня возник ещё один вопрос, т.к. я столкнулся с некорректной, на мой взгляд ,работой ключевого командлета Get-ADUser Задача состояла в том, чтоб выбрать членов указанной группы, для этого я написал простую, на мой взгляд, конструкцию:
Get-ADUser  –Properties * -Filter ‘memberof –like “*abc*”’ | ft name 
На выходе получаю пустой список Когда я немножко так сказать усложнил путь:
Get-ADUser –Properties * -Filter * | where {$_.memberof  –like “*abc*”} | ft name

То всё сработало чудесно.. Отсюда вопрос – почему так, и можно ли вообще доверять опции  -filter  данного командлета? Конечно, я могу пользоваться и вторым вариантом, однако это вызывает определённые неудобства связанные с работой в удаленных сессиях, т.к. объем выборки очень большой, и сессия обрывается..

И, мой ответ.
Здравствуйте!
Что тут стоит сказать. Прежде всего вот http://technet.microsoft.com/en-us/library/hh531527(WS.10).aspx. Обратите внимание на 11 пример. По сути получается примерно следующее. Атрибут memberof, это не совсем обычный атрибут. Это бэклинк (back-link) - вычисляемое значение. Мало того, согласно его описанию вот тут http://msdn.microsoft.com/en-us/library/ms677943.aspx, он может хранить не все группы, членом которых является пользователь, а только самую нижнюю в иерархии. Например, если пользователь является членом группы А и Б, а Б в свою очередь входит в С то группы С в списке не будет. По-этому с этим нужно работать совсем иначе. Для него требуется совсем другой синтаксис LDAP запроса, с указанием matching rule OID, который, при обработке запроса LDAP сервером вызовет рекурсивный обход всех вложенных объектов начиная от потомка в сторону предков.
Как-то так:
filter1
Указывая параметр filter, Вы задаете LDAP фильтр, который отрабатывает на сервере и возвращает уже отфильтрованный результат. А вот второй запрос
Get-ADUser –Properties * -Filter * | where {$_.memberof  –like “*abc*”} | ft name
работает немного иначе. Обратите внимание на вывод get-member. В нем атрибут memberof уже является обычной строкой. Поэтому этот oneliner работает без проблем, но количество объектов, которое он возвращает может быть очень большим.
Посему мне кажется, что значительно проще в этом плане использовать комадлет get-adgroupmember:filter2

Итого. Доверять опции -filter можно и нужно. Просто данный конкретный случай - особенность.
В общем, пишите, задавайте вопросы! Разберемся!

Комментариев нет: