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

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

В базовом варианте синтаксис get-adgroupmember очень прост:

get-adgroupmember <имя группы>

Например, вывести членов группы folks позволит следующий запрос:

get-adgroupmember folks

Чтобы разблокировать все учетные записи из группы folks, результат выполнения команды get-adgroupmember можно передать другой команде AD – enable-adaccount:

get-adgroupmember folks|enable-adaccount

Несложно догадаться, что enable-adaccount включает не активные ранее учетные записи. В этом запросе используется символ «|" (конвейер), функция которого заключается в передаче результата выполнения одной команды на вход другой команде. Такая запись замечательна своей лаконичностью, поскольку выполнение задачи, формулировка которой укладывается в этот короткий незамысловатый запрос, с помощью VBScript и интерфейса создания сценариев Active Directory (ADSI) вылилось бы в написание 50-75 строк кода с последующим его тестированием. У того, кто не занимается этим постоянно, данная задача отняла бы пару дней рабочего времени. Для сравнения, приведенный выше запрос с использованием PowerShell я создал примерно за три минуты.

Опробовать возможности get-adgroupmember можно на примере создания и заполнения групп с помощью команд PowerShell. Вначале создадим три учетные записи – user1, user2 и user3 – с помощью следующей команды:

for /l %i in (1 1 3) do (net user user%i PassW0rd /add)

Этот запрос вводится не в командной строке PowerShell, а в обычном окне командной строки Windows. Создадим пару вложенных глобальных групп, куда поместим эти учетные записи. Одну глобальную группу назовем manyfolks, а в нее вложим другую, по имени folks. Для создания групп воспользуемся командой new-adgroup:

new-adgroup имя область-группы

Параметр "область группы» принимает числовое или текстовое значение: 0 или domainlocal – локальная группа домена, 1 или global – глобальная группа, 2 или universal – универсальная группа. Этот параметр не является описанием типа группы, как может показаться; для описания типа группы у new-adgroup существует другой параметр, который определяет, является ли эта группа группой безопасности или группой рассылки. Для создания групп folks и manyfolks построим следующие запросы:

new-adgroup manyfolks global
new-adgroup folks global

Теперь вложим группу folks в группу manyfolks. Для добавления группы или учетной записи в группу применяется команда add-adgroupmember. В наиболее общем случае запрос выглядит следующим образом:

add-adgroupmember groupname newmember1,newmember2,newmember3…

Чтобы поместить группу folks и учетную запись user1 в группу manyfolks, введем следующую команду:

add-adgroupmember manyfolks user1,folks

Обратите внимание, что список user1,folks не содержит пробелов. Запрос на добавление учетных записей user2 и user3 в группу folks выглядит следующим образом:

add-adgroupmember folks user2,user3

Теперь можно испытать возможности get-adgroupmember. Если ввести команду

get-adgroupmember manyfolks | ft samaccountname,

результат ее выполнения будет выглядеть следующим образом:

samaccountname
--------------
user1
folks

С технической точки зрения все правильно, но представление может оказаться не таким, как мы ожидали. Обычно необходимо вывести список пользователей во вложенной группе независимо от глубины вложения, что можно сделать путем добавления переключателя –recursive (сокращаемого до -r):

get-adgroupmember manyfolks -r | ft samaccountname
Результат выполнения запроса будет иметь вид:
samaccountname
--------------
user1
user2
user3

Переключатель –recursive предписывает команде get-adgroupmember анализировать каждую вложенную группу и выводить только объекты, не являющиеся контейнерами (пользователь или компьютер).

В заключение отметим одну особенность синтаксиса add-adgroupmember и new-adgroup. Можно заметить, что каждая из этих команд использует два неименованных параметра. Например, более полным вариантом команды new-adgroup был бы такой:

new-adgroup -name manyfolks -groupscope global

Однако указывать наименования параметров (–name и –groupscope) не требуется. PowerShell позволяет просто указывать в запросе их значения в определенном порядке, то есть эти параметры являются «позиционными», а не «именованными». Чтобы узнать, какие параметры являются позиционными, я изучил текст справки (Help), в котором нужную информацию еще пришлось поискать. Необходимые пояснения будут даны в следующей статье.