Марк Минаси (www.minasi.com/gethelp) – старший редактор журнала Windows IT Pro, сертифицированный системный инженер по продуктам Microsoft

Реализованные в PowerShell команды поиска в Active Directory (AD), такие как get-aduser, get-adgroupmember и search-adaccount, относятся к числу наиболее мне интересных новых команд Windows Server 2008 R2, поэтому они остаются основной темой моих статей на протяжении последних нескольких месяцев. Меня чрезвычайно радует, например, что с помощью запроса

get-aduser -f {title -eq «claims adjuster» -and manager -eq «cn=JFarkus,cn=users,dc=bigfirm,dc=com"} –searchbase "ou=Montana,dc=bigfirm,dc=com»

можно вывести список сотрудников, занимающихся рассмотрением исков в подразделении Montana компании Bigfirm.com и имеющих руководителя с именем пользователя JFarkus. Составление этого запроса заняло не более 30 секунд, и основная трудность была лишь в том, чтобы знать отличительное имя (DN) руководителя. Если вспомнить, сколько времени отнимало решение подобной задачи с помощью VBScript, повод для радости очевиден.

Отдавая должное способностям команд PowerShell, следует помнить и о возможном разочаровании, поскольку в действительности они – не более чем облагороженная интерфейсная часть LDAP-запросов, и иногда то, что, как кажется, должно работать, на самом деле не работает (например, поиск сотрудников, у которых имена руководителей начинаются с S). Однако даже если при попытке использования команды get- вы оказываетесь в тупике, не сдавайтесь, а попробуйте подойти к проблеме с другой стороны.

Вернемся к задаче поиска членов группы, относящихся к конкретному организационному подразделению (OU). Например, как вывести список сотрудников из группы folks, работающих в отделе сбыта?

Попробуем сделать это с помощью get-aduser, а не get-adgroupmember, и поставить в конец запроса параметр -searchbase. Всякий раз, когда передо мной встает вопрос, есть ли у команды get- свойство, позволяющее решить конкретную задачу, я изучаю атрибуты интересующего объекта. Как мы уже видели, список атрибутов объектов «пользователь» в PowerShell можно вывести с помощью следующего запроса:

get-aduser -f * | gm

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

get-aduser -f {samaccountname -eq «mark"} -pr MemberOf | ft name,memberof -auto

Вспомним, что ft – сокращенная запись format-table, а также то, что, если не включить -pr MemberOf в запрос get-aduser, то этот атрибут не будет передан дальше по конвейеру. В конечном итоге атрибут MemberOf выглядит следующим образом: {CN=Enterprise Admins, CN=Users,DC=Bigfirm,DC=com,CN=Schema Admins,CN=Users, DC=Bigfirm,DC=com. .. } и т.д., то есть представляет собой разделенный запятыми список имен (DN) групп, которым принадлежит пользователь mark.

Попробуем использовать MemberOf для фильтрации результатов запроса get-aduser. Возможно, следующий запрос позволит вывести весь состав группы Enterprise Admins?

get-aduser -f {MemberOf -like "*Enterprise Admins*"}

К сожалению, это не дает результата, поскольку MemberOf, по-видимому, требует сопоставления с точными именами (DN) групп. Таким образом, запрос

get-aduser -f {Memberof -eq "CN=Enterprise Admins,CN=Users,DC=Bigfirm,DC=com"}

позволяет извлечь членов группы Enterprise Admins, и единственное неудобство в этом случае состоит в необходимости знать отличительные имена всех групп. Однако вывести список групп в домене и их имен просто:

get-adgroup -f *|ft name,distinguishedname -auto

Начиная с этого момента, все сводится к копированию и вставке. Таким образом, запрос о том, кто из членов группы folks работает в отделе сбыта, можно построить следующим образом:

get-aduser -f {memberof -eq "CN=Folks,CN=Users,DC=Bigfirm,DC=com"} -searchbase "ou=sales,dc=bigfirm,dc=com»

Этот запрос можно также адресовать глобальному каталогу (GC), добавив параметр -servername:port, в предположении, что сервером GC является контроллер домена по имени DC4:

get-aduser -f {memberof -eq «CN=Folks,CN=Users,DC=Bigfirm,DC=com"} -searchbase "ou=sales,dc=bigfirm,dc=com» –server dc4:3268

Таким образом, суть данной статьи сводится к тому, что никогда не повредит взглянуть на список объектов по-новому и что не следует рассчитывать на возможность использования групповых символов вместо отличительных имен (DN).