Телефон +7 (812) 718-6184
СПб, Московский пр. 118
  1. О центре
  2. Статьи преподавателей
  3. Powershell в повседневной жизни

Powershell в повседневной жизни

13.02.2015

Задачи, которые приходится решать сотруднику ИТ, прежде всего связаны с поиском информации и порой требуют немедленного решения.
Представим реальную ситуацию – Ваша компания купила конкурента, и теперь запущен процесс интеграции (слияния или поглощения) с чужой самостоятельной ИТ-средой. В рамках этой масштабной задачи отдел ИТ неизбежно столкнется с анализом сервисов, ресурсов и прочего ИТ-хозяйства, а затем и с дальнейшей обработкой результатов. Среди основных компонентов инфраструктуры отдельно выделим Службу Каталогов/Active Directory.
Из пула типовых задач, обратим внимание на конкретную проблему: необходимо получить информацию по вхождению пользователя или пользователей в группы. Разберём её подробнее.
Итак, самый очевидный способ заглянуть в карточку пользователя в «Пользователи и компьютеры Active Directory»/«AD: Users and Computers» на вкладку участник групп (members of group). Понятно, что для нескольких пользователей решение «в лоб» (см. рисунок ниже) приемлемо, но, когда речь идёт о слиянии крупных компаний, просмотреть несколько десятков/сотен/тысяч пользователей становиться затруднительно, помимо этого необходимо избежать пресловутого «человеческого фактора» и максимально ускорить процесс. 
 
В таком контексте наиболее простым, быстрым и эффективным решением будет использование скриптов, явными плюсами которых является оптимизация рабочего процесса и гарантия результата. Таким образом, мы подошли к вопросу автоматизации типовых задач с помощью базовых средств операционной системы, и лучшим помощником для нас в среде Microsoft будет консоль PowerShell.
Приступим к решению задачи. В первую очередь сформулируем техническую часть: необходимо найти пользователя и проверить его группы. Кажется, будто задача простая, но оказывается здесь есть «подводные камни».
После краткого изучения функционала объектов Службы Каталогов, мы неожиданно выясним следующее - объект «Пользователь» не содержит искомой информации. Оказывается, «Группа» – это не атрибут данного объекта, и непосредственно обращением к атрибуту «Группа» объекта «Пользователь» мы получаем только пустую строку. Но если внимательно присмотреться к другим объектам Службы Каталогов, то необходимая информация обнаружится в атрибуте «Участники»/«Member of» объекта «Группа»/«Group».
Таким образом изначальная задача преобразилась в следующее:
1.       получить список групп Службы Каталогов;
2.       проверить атрибут «Участники»;
3.       создать список групп пользователя;
4.       вывести информацию.
Для решения первого пункта воспользуемся кодом ниже:
(Get-ADGroup -Filter 'name -like "*"' | select -ExpandProperty name | sort)
Так мы получим список объектов «Группа» Службы Каталога и выделим атрибут «Имя» - единственный необходимый нам для дальнейших действий.
Далее в цикле проверяем вхождение пользователя в разные группы. Просматривать будем состав участников группы, где лишние группы изымаем из списка с помощью кода:
(!($user -in (Get-ADGroup -Filter $grpfltr | Get-ADGroupMember).name)) {$GRPList.remove("$grp")}
Таким образом, получаем список групп пользователя. На этом можно закончить, но хотелось бы ещё увидеть информацию по вложенным группам пользователя. Для решения этой задачи добавим ключ  «–Recursive» к командлету Get-ADGroupMember.
Результат выведем в виде объекта с двумя атрибутами: «Имя пользователя» и «Группы пользователя». Эту информацию можно будет использовать в работе дальше, например, передать по конвейеру в следующий командлет.
Теперь добавим к основному коду перебор пользователей на случай шаблонного ввода, что позволит нам вывести полную коллекцию объектов и в дальнейшем обращаться к элементам коллекции. В соответствии с правилами хорошего тона при программировании, дополним описательную часть кода, чтобы получать справку по работе функции стандартными средствами (например, командлетом get-help).
В результате получаем изящный и относительно простой код, который остаётся только вставить в собственный модуль PowerShell. 

 
 
Скачать код функции Find-ADUsertInGroup

А если мы запустим, например, выполнение такого командлета:
  Find-ADUsertInGroup "Rostislav G. Bronzov"
то получим следующий ответ:
 
 
Итог: задача решена стандартными средствами среды PowerShell, для работы функции требуется импортировать модуль ActiveDirectory.А более подробную информацию по работе с PowerShell можно получить на курсах  10961: Автоматизация администрирования с Windows PowerShell 3.0  и 10962: Расширенные возможности по автоматизации администрирования с помощью Windows PowerShell в УЦ «Эврика».