PowerShell. Поиск объектов в каталоге Active Directory::Журнал СА 5.2009
www.samag.ru
     
Поиск   
              
 www.samag.ru    Web  0 товаров , сумма 0 руб.
E-mail
Пароль  
 Запомнить меня
Регистрация | Забыли пароль?
Журнал "Системный администратор"
Журнал «БИТ»
Подписка
Архив номеров
Где купить
Наука и технологии
Авторам
Рекламодателям
Контакты
   

  Опросы
  Статьи

Событие  

В банке рассола ждет сисадмина с полей фрактал-кукумбер

Читайте впечатления о слете ДСА 2024, рассказанные волонтером и участником слета

 Читать далее...

Организация бесперебойной работы  

Бесперебойная работа ИТ-инфраструктуры в режиме 24/7 Как обеспечить ее в нынешних условиях?

Год назад ИТ-компания «Крок» провела исследование «Ключевые тренды сервисного рынка 2023». Результаты

 Читать далее...

Книжная полка  

Читайте и познавайте мир технологий!

Издательство «БХВ» продолжает радовать выпуском интересных и полезных, к тому же прекрасно

 Читать далее...

СУБД PostgreSQL  

СУБД Postgres Pro

Сертификация по новым требованиям ФСТЭК и роль администратора без доступа к данным

 Читать далее...

Критическая инфраструктура  

КИИ для оператора связи. Готовы ли компании к повышению уровня кибербезопасности?

Похоже, что провайдеры и операторы связи начали забывать о требованиях законодательства

 Читать далее...

Архитектура ПО  

Архитектурные метрики. Качество архитектуры и способность системы к эволюционированию

Обычно соответствие программного продукта требованиям мы проверяем через скоуп вполне себе понятных

 Читать далее...

Как хорошо вы это знаете  

Что вам известно о разработках компании ARinteg?

Компания ARinteg (ООО «АРинтег») – системный интегратор на российском рынке ИБ –

 Читать далее...

Графические редакторы  

Рисование абстрактных гор в стиле Paper Cut

Векторный графический редактор Inkscape – яркий представитель той прослойки open source, с

 Читать далее...

День сисадмина  

Учите матчасть! Или как стать системным администратором

Лето – время не только отпусков, но и хорошая возможность определиться с профессией

 Читать далее...

День сисадмина  

Живой айтишник – это всегда движение. Остановка смерти подобна

Наши авторы рассказывают о своем опыте и дают советы начинающим системным администраторам.

 Читать далее...

Виртуализация  

Рынок решений для виртуализации

По данным «Обзора российского рынка инфраструктурного ПО и перспектив его развития», сделанного

 Читать далее...

Книжная полка  

Как стать креативным и востребованным

Издательский дом «Питер» предлагает новинки компьютерной литературы, а также книги по бизнесу

 Читать далее...

Книжная полка  

От создания сайтов до разработки и реализации API

В издательстве «БХВ» недавно вышли книги, которые будут интересны системным администраторам, создателям

 Читать далее...

Разбор полетов  

Ошибок опыт трудный

Как часто мы легко повторяем, что не надо бояться совершать ошибки, мол,

 Читать далее...

1001 и 1 книга  
19.03.2018г.
Просмотров: 6195
Комментарии: 0
Машинное обучение с использованием библиотеки Н2О

 Читать далее...

12.03.2018г.
Просмотров: 6903
Комментарии: 0
Особенности киберпреступлений в России: инструменты нападения и защита информации

 Читать далее...

12.03.2018г.
Просмотров: 4188
Комментарии: 0
Глубокое обучение с точки зрения практика

 Читать далее...

12.03.2018г.
Просмотров: 2989
Комментарии: 0
Изучаем pandas

 Читать далее...

12.03.2018г.
Просмотров: 3795
Комментарии: 0
Программирование на языке Rust (Цветное издание)

 Читать далее...

19.12.2017г.
Просмотров: 3805
Комментарии: 0
Глубокое обучение

 Читать далее...

19.12.2017г.
Просмотров: 6299
Комментарии: 0
Анализ социальных медиа на Python

 Читать далее...

19.12.2017г.
Просмотров: 3152
Комментарии: 0
Основы блокчейна

 Читать далее...

19.12.2017г.
Просмотров: 3446
Комментарии: 0
Java 9. Полный обзор нововведений

 Читать далее...

16.02.2017г.
Просмотров: 7263
Комментарии: 0
Опоздавших не бывает, или книга о стеке

 Читать далее...

17.05.2016г.
Просмотров: 10628
Комментарии: 0
Теория вычислений для программистов

 Читать далее...

30.03.2015г.
Просмотров: 12352
Комментарии: 0
От математики к обобщенному программированию

 Читать далее...

18.02.2014г.
Просмотров: 13983
Комментарии: 0
Рецензия на книгу «Читаем Тьюринга»

 Читать далее...

13.02.2014г.
Просмотров: 9110
Комментарии: 0
Читайте, размышляйте, действуйте

 Читать далее...

12.02.2014г.
Просмотров: 7064
Комментарии: 0
Рисуем наши мысли

 Читать далее...

10.02.2014г.
Просмотров: 5375
Комментарии: 3
Страна в цифрах

 Читать далее...

18.12.2013г.
Просмотров: 4604
Комментарии: 0
Большие данные меняют нашу жизнь

 Читать далее...

18.12.2013г.
Просмотров: 3414
Комментарии: 0
Компьютерные технологии – корень зла для точки роста

 Читать далее...

04.12.2013г.
Просмотров: 3145
Комментарии: 0
Паутина в облаках

 Читать далее...

03.12.2013г.
Просмотров: 3392
Комментарии: 0
Рецензия на книгу «MongoDB в действии»

 Читать далее...

02.12.2013г.
Просмотров: 3013
Комментарии: 0
Не думай о минутах свысока

 Читать далее...

Друзья сайта  

 PowerShell. Поиск объектов в каталоге Active Directory

Архив номеров / 2009 / Выпуск №5 (78) / PowerShell. Поиск объектов в каталоге Active Directory

Рубрика: Программирование /  Программирование

Иван Коробко

PowerShell. Поиск объектов в каталоге Active Directory

Большинство операций в каталоге Active Directory сводится к поиску объектов по различным критериям. Рассмотрим подробно процедуру с помощью библиотек .NET Framework на PowerShell.

Поиск объектов в Active Directory осуществляется с помощью класса .NET FrameWork System.Directory Services.DirectorySearcher и одного из методов: FindAll() или FindOne() в зависимости от условий поиска. Сценарий поиска можно условно разделить на несколько логических частей:

  •  доступ к контейнеру;
  •  фильтр поиска;
  •  атрибуты поиска;
  •  область поиска;
  •  сортировка элементов;
  •  поиск объектов.

Доступ к контейнеру

Для поиска объекта необходимо определить точку входа – путь к контейнеру, в котором будет осуществляться поиск. Для выполнения этого условия необходимо создать объект DirectorySearcher:

$path = "LDAP://OU=WorkSpace,DC=Island,DC=ru"

$obj = New-Object DirectoryServices.DirectorySearcher($Path)

Созданный объект содержит ряд свойств и методов. Полный отображения списка свойств и методов, поддерживаемых объектом, необходимо использовать командлетом Get-Member или его псевдонимом (gm):

$obj | Get-Member

Примечание: командлет – это обычная команда, выполняющая определённое действие с указанным объектом. Любой командлет состоит из глагола и существительного, разделенных дефисом. Глагол указывает, какое действие будет производиться, а существительное указывает объект, над которым будет производиться это действие. Командлеты поддерживают сокращения. Полный список сокращений можно получить с помощью команды:

Get-Alias | Format-Table -Property Definition, Name -Autosize

Для осуществления процедуры поиска необходимо задать несколько параметров:

  • Фильтр поиска (обязательный параметр). С помощью него формируется поисковый запрос.
  • Список атрибутов. Задается для сокращения времени поиска.
  • Область поиска. Определяет глубину поиска.
  • Сортировка. Позволяет получить результат в нужном виде.

Фильтр поиска

При написании фильтра поиска используются выражения, строящиеся по определенным правилам, а именно (см. таблицу 1):

  • каждое выражение должно быть заключено в скобках;
  • в выражениях допускается использование операторов сравнения: «<», «<=», «=», «>=» и «>»;
  • допускаются составные выражения, образуемые с помощью префиксных операторов «&», «|», «!».

Любой фильтр обычно состоит из двух логических частей. С помощью одной части определяют тип искомых объектов, в другой – искомое значение. Наличие фильтра необязательно.

Таблица 1. Операторы фильтра поиска

Оператор

Значение

Оператор

Значение

=

Эквивалентно

&

И

~=

Примерно равно

|

ИЛИ

<=

Меньше или равно

!

НЕ

>=

Больше или равно

*

ВСЕ

Тип объекта определяется последним значением массива objectClass. Например, для учетной записи пользователя objectClass = person, для группы – group, для контейнера – organizationalUnit.

Приведу несколько характерных примеров фильтров:

  • (objectClass=*). Все объекты имеют принадлежность к одному из классов. Данный фильтр вернёт все объекты в области поиска;
  • &((objectClass=person)(!objectClass=computer)). Будут возвращены все объекты, принадлежащие к классу Person и не принадлежащие к классу computer. Такими объектами являются учетные записи пользователей;

Будут возвращены все объекты с описанием test и именем, начинающимся со слова User, а также объект Group1.

Встречаются случаи, в которых необходимо указывать служебные символы в качестве значений, такие как звездочку, скобку и др. Чтобы реализовать эту возможность, вместо символа необходимо указать соответствующее ему кодовое значение, приведенное в таблице 2.

Таблица 2. Зарезервированные имена, используемые в фильтрах поиска

Символ

Значение

*

\2a

(

\28

)

\29

\

\5c

NUL

\00

/

\2f

Атрибуты объекта

Для ускорения процедуры поиска используется свойство PropertiesToLoad. Используя метод Add()формируется массив полей, значения которых загружаются в память во время поиска. Например: PropertiesToLoad.Add("cn").

Область поиска

Область поиска задается с помощью свойства SearchScope:

  • SearchScope.Base или 0 – поиск осуществляется по корневому объекту, указанному в первой части запроса. Всегда возвращается либо один объект, либо пустой набор объектов. Эта область поиска чаще всего используется для проверки существования объекта, указанного в запросе.
  • SearchScope.OneLevel или 1 – поиск осуществляется в пределах указанного контейнера, указанного в первой части запроса. Поиск по вложенным объектам более низких уровней не производится. В поиск также не попадет и сам объект-контейнер.
  • SearchScope.SubTree или 2 – поиск осуществляется по всем вложенным объектам. В поиск при этом не попадает сам объект-контейнер. Эта область поиска задана по умолчанию.

Сортировка элементов

Сортировка элементов осуществляется с помощью метода Sort, поддерживающего два свойства: PropertyName и Direction. С помощью свойства PropertyName указывается название поля, по которому будет осуществляться сортировка, а с помощью Direction – направление. В случае Sort.Direction = 0 или Sort.Direction = "Ascending" осуществляется упорядочивание от «А» до «Я», при Sort.Direction = 1 или Sort.Direction = «Descending» – в обратном порядке.

Поиск объктов

В зависимости от конкретного случая для выполнения процедуры поиска после задания всех условий осуществляется вызов одного из методов поиска:

  • FindOne() – возвращает только один/первый объект;
  • FindAll() – возвращают коллекцию (массив) объектов, элементы которой удовлетворяют заданным критериям поиска.

Приведу по одному примеру на каждый из методов.

Каталог Active Directory устроен так, что имя учетной записи группы или пользователя должны быть уникальны. Например, если необходимо определить список членов группы и если имя группы точно известно, то разумнее всего использовать метод FindOne(). В листинге 1 приведен пример определения списка пользователей, являющихся членами группы Print Managers. Поскольку результат поиска единственный элемент, то управлять сортировкой выводимых значений не имеет смысла.

Замечание: комментарии в листинге на языке Power Shell начинаются с символа решетки (#).

Листинг 1. Поиск объекта с помощью метода FindOne()

# Получение доступа к корню домена

$Search = New-Object DirectoryServices.DirectorySearcher("LDAP://DC=Island,DC=ru")

 

# Критерий поиска — отображаемое имя группы

$Search.Filter = "(&(cn=Print Managers))"

 

# Поиск по всему каталогу Active Directory

$Search.SearchScope = 2

 

# Выполнение поиска

$result = $Search.FindOne()

 

# Получение доступа к группе с помощью относительного пути

$obj = $result.GetDirectoryEntry()

 

# Чтение элементов массива

$obj.psbase.properties.member | % {

$member = [ADSI]( "LDAP://"+$_)

Write-Host $member.Name}

Рассмотрим подробно алгоритм работы сценария. На первом этапе определяется контейнер, в котором будет осуществляться поиск. Затем осуществляется настройка параметров поиска: фильтр, глубина и др. Исходя из поставленной задачи можно составить несколько вариантов фильтра.

Предпочтение стоит отдать самому короткому, поскольку это, с одной стороны, упростит скорость поиска, а с другой – сделает ваш листинг более понятным. После того как все необходимые параметры заданы, осуществляется вызов метода FindOne(). Результат поиска в данном случае присваивается объекту $result.

Для получения доступа к указанному объекту используют метод GetDirectoryEntry(). Обратите внимание, что при его вызове относительный составной путь (distinguishedName) найденного объекта не указывается, поскольку он подставляется автоматически.

По своему действию строка:

$obj = $result.GetDirectoryEntry()

эквивалентна строке:

$obj=[ADSI]("LDAP://"+ $result.distinguishedName)

На завершающем этапе осуществляется чтение значений указанного атрибута. PowerShell представляет значения атрибутов в зависимости от их типа: в строку (числа, строки), в массив (массив). Получение доступа к данным осуществляется по шаблону:

$data = $obj.psbase.properties.СВОЙСТВО

где «СВОЙСТВО» – имя атрибута. Таким образом, для чтения строковых и числовых характеристик следует использовать шаблон 1, для массивов – шаблон 2.

Шаблон 1. Чтение строковых и числовых атрибутов

# Атрибуты name, primarygroup, description и т.д.

$data = $obj.psbase.properties.СВОЙСТВО

write-host $data

 

Шаблон 2. Чтение массивов

# Атрибуты member, memberOf и т.д.

$data = $obj.psbase.properties.СВОЙСТВО

ForEach ($item in $data) {

Write-Host $item}

Для чтения массивов используется оператор ForEach, который в отличие от других языков программирования в PowerShell имеет сокращенную форму записи (см. шаблон 3). Конструкция «ForEach ($element in $array){}» заменяется конструкцией «$array | % {}». В этом случае в цикле обращение к текущему элементу массива осуществляется с помощью $_.

Шаблон 3. Чтение массивов (сокращенная запись)

# Атрибуты member, memberOf и т.д.

$obj.psbase.properties.СВОЙСТВО | % {

Write-Host $_}

Метод поиска FindAll() используется в тех случаях, когда необходимо найти все объекты, удовлетворяющие указанным критериям, например, все учетные записи пользователей в указанном контейнере или выключенные учетные записи и др. Приведем пример поиска всех учетных записей пользователей (см. листинг 2), находящихся в указанном контейнере, имена которых начинаются с буквы «А».

Листинг 2. Поиск объекта с помощью метода FindAll()

# Получение доступа к корню домена

$Search = New-Object DirectoryServices.DirectorySearcher("LDAP://DC=Island,DC=ru")

 

# Критерий поиска — отображаемое имя группы

$Search.Filter = "(&(objectClass=User)(cn=A*)(!objectClass=Computer))"

 

# Поиск по всему каталогу Active Directory

$Search.SearchScope = 2

 

# Сортировка результатов поиска

$Search.Sort.Direction = 1

$Search. Sort.PropertyName="sAMAccountName"

 

# Выполнение поиска

$Search.FindAll() | % {

 

# Получение доступа к группе с помощью относительного пути

$obj = $_.GetDirectoryEntry()

 

# Чтение данных

Write-Host $obj.samaccountname}

Исходя из поставленной задачи отметим, что фильтр поиска состоит из двух частей. В первой из них выбираются учетные записи пользователей (см. таблицу 3):

(&(objectClass=User)(!(objectClass=Computer)))

Вторая часть – из отобранных учетных записей выбрать начинающиеся с буквы «А». Фамилия пользователя хранится в значении атрибута sn (second name), поэтому фильтр будет выглядеть следующим образом:

(&(cn=А*))

Объединим два фильтра в один, получим:

(&(objectClass=User)(cn=A*)(!objectClass=Computer))

Таблица 3. Взаимосвязь типов объектов Active Directory и значений параметра objectClass

Комментарий

Тип объекта

Значение objectClass

Фрагмент поискового запроса

Учетная запись компьютера

Computer

Top

Person

OrganizationalPerson

User

Computer

(&(objectClass=Computer))

Группа безопасности

Group

Top

Group

(&(objectClass=Group))

Папка дерева каталогов Active Directory

OU

Top

OrganizationalUnit

(&(objectClass=OrganizationalUnit))

Опубликованный в Active Directory сетевой принтер

Printer

Top

Leaf

ConnectionPoint

PrintQueue

(&(objectClass=PrintQueue))

Опубликованная в Active Directory сетевая папка

Shared Folder

Top

Leaf

ConnectionPoint

Volume

(&(objectClass=Volume))

Учетная запись пользователя, совместимая с доменами Windows NT

User

Top

Person

OrganizationalPerson

User

(&(objectClass=User)(!(objectClass=Computer)))

Заключение

Уже на стадии поиска можно осуществлять сортировку значений выбранного поля в указанном направлении. Составлять запрос стало гораздо проще по сравнению с VBScript. Если раньше для составления запроса требовались хотя бы минимальные знания по SQL, то сейчас достаточно знать названия полей. С выходом Windows Server 2008 узнать поля стало еще легче: утилита ADSI Edit теперь входит в комплект операционной системы и устанавливается по умолчанию.


Комментарии отсутствуют

Добавить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

               Copyright © Системный администратор

Яндекс.Метрика
Tel.: (499) 277-12-45
E-mail: sa@samag.ru