В одной из предыдущих статей рубрики я рассказывал о применении операторов If/Else в процессе принятия решений при выполнении трудоемких задач обслуживания Active Directory (AD) средствами PowerShell. Рассматривался относительно простой случай: из двух взаимоисключающих вариантов выбирался один, в зависимости от наличия в имени среднего инициала. Теперь возьмем более сложную задачу, которую будем решать путем создания сценария с использованием оператора switch. Кроме того, мы познакомимся с командой move-adobject, позволяющей перемещать учетные записи в пределах домена.

Рассмотрим одну нетривиальную задачу. Предположим, что в течение некоторого времени вы успешно управляли средой AD и для каждого пользователя прилежно вводили значение атрибута AD Office, указывая город, где этот пользователь работает. (ADSIEdit и LDAP отображают данный атрибут как PhysicalDeliveryOfficeName, но специалисты по службам каталогов переименовали его в Office для применения с командами AD). Предположим также, что ваша организация имеет семь отделений, находящихся в Вудстоке и Фармвилле (шт. Вирджиния); Лиме и Дублине (шт. Огайо); Бельвью, Сибруке и Майами (шт. Техас). Вы решили провести реорганизацию и создать подразделения с именами «Вирджиния», «Огайо» и «Техас». Задача состоит в том, чтобы заполнить эти подразделения, то есть с помощью средств PowerShell перенести каждую учетную запись в нужное место в зависимости от текущего значения атрибута Office.

Эту задачу можно решить многими способами, но мы разберем ее решение с использованием оператора switch. По сути, требуется дать PowerShell указание проанализировать учетные записи всех пользователей, одну за другой, и для каждой из них выполнить код, предписывающий примерно следующее: если значение Office = Woodstock, то переместить пользователя в подразделение Virginia, либо, если значение Office = Farmville, то переместить пользователя в подразделение Virginia, либо, если значение Office = Lima, то переместить пользователя в подразделение Ohio и т.д. Конечно, можно это сделать с помощью операторов If и Else, но сценарий получится громоздким.

Мы будем писать сценарий, а не однострочную команду, потому что однострочная команда получилась бы не слишком красивой. Если у вас нет большого опыта создания сценариев, я позволю себе дать совет относительно того, с чего следует начинать. Написание кода – будь то сценарий PowerShell, VBScript, C# или что-либо другое – удобно начинать с составления так называемого псевдокода, то есть записи на смеси обычного языка и языка программирования. Для псевдокодов не существует правил; просто составляется схематичная запись того, что требуется сделать. Вот пример псевдокода решения нашей задачи:

Собрать учетные записи всех пользователей AD и последовательно подать их на конвейер.

Для каждой учетной записи пользователя на конвейере:

  • Извлечь имя пользователя и значение атрибута office и сохранить их в переменных;
  • Если Office=Woodstock, переместить пользователя в подразделение Virginia;
  • Если Office=Farmville, переместить пользователя в подразделение Virginia;
  • Если Office=Miami, переместить пользователя в подразделение Texas;
  • Если Office=Dublin, переместить пользователя в подразделение Ohio.

Далее следуют операторы If для всех остальных отделений.

Если пользователь не принадлежит ни к одному из этих отделений, не перемещать его.

Эта запись содержит краткое описание того, что требуется сделать. Отступами выделены возможные варианты цикла ForEach. Каков синтаксис PowerShell для кодирования этой записи? Как перемещать пользователей AD? Умеет ли PowerShell это делать? Известно, что AD позволяет перемещать учетные записи пользователей из одного подразделения в другое в пределах домена, поэтому можно предположить, что и средства PowerShell предусматривают такую возможность. Достоинство псевдокода состоит в возможности схематично изложить план действий, не заботясь о правильном синтаксисе.

Что же дальше? Постоянные читатели рубрики, посвященной средствам PowerShell, уже знакомы с некоторыми правилами синтаксиса и, несомненно, способны решить эту задачу с помощью If/Then без привлечения оператора switch. Заминка возникнет лишь при попытке перемещения объектов AD, что приведет к необходимости поиска команды, которая может это делать. Небольшое исследование с помощью get-command и get-help выявит команду под названием move-adobject с простым синтаксисом:

move-adobject DN-or-GUID-of-object DN-or-GUID-of-destination

Это мало отличается от других инструментов, с которыми мы уже знакомы, но здесь нет необходимости в применении SAMAccountName и SID. Например, для перемещения учетной записи пользователя Tom в контейнере Users в подразделение Virginia в bigfirm.com можно составить следующую команду:

move-aduser «cn=Tom,cn=Users,dc=bigfirm,dc=com» «OU=Virginia,dc=bigfirm,dc=com»

Обратите внимание, что использование двойных кавычек здесь обязательно. Итак, мы подошли к составлению нужного сценария, что и будет сделано в следующий раз.