Закрыть ... [X]

Сценарии для active directory

сценарии для active directory Скотт Лоу (Scott Lowe) рассказывает о сценарии PowerShell, позволяющем сохранить определенные данные из Active Directory в CSV-файл.

Как-то раз по работе мне потребовалось сравнить данные из Active Directory с информацией, хранящейся в нашей системе планирования ресурсов, и с данными учетных записей почты в Exchange 2003. Для этого я на скорую руку составил сценарий PowerShell, позволяющий извлечь определенную информацию из Active Directory и сохранить ее в CSV-файл. В дальнейшем предполагалось сравнить три набора данных — из Active Directory, Exchange и системы планирования ресурсов — с помощью Excel, причем так, чтобы все три набора были взаимосвязаны.

Ниже более подробно рассказывается об этом проекте и объясняется состав сценария PowerShell.

О проекте

Необходимость в сравнении данных из разных источников возникла у нас по следующим причинам:

• В нашей компании зарегистрировано 16 тысяч почтовых ящиков Exchange, и нам необходимо было проверить, действительно ли учетные записи почты есть только у тех пользователей, у которых они должны быть.

• Следовало также убедиться, что учетные записи Active Directory для сотрудников, покинувших компанию, неактивны и отмечены для удаления.

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

• Мне пришлось использовать WMI для сбора данных в Exchange, поскольку Exchange 2003 не поддерживает PowerShell.

• В нашей организации зарегистрировано более 600 тысяч учетных записей Active Directory, причем большинство из них активны. Сотрудникам компании принадлежат лишь около 20 тысяч аккаунтов, остальное — учетные записи клиентов. Однако некоторые клиенты одно время были и сотрудниками, поэтому Active Directory пришлось просканировать целиком на наличие учетных записей, потенциально принадлежащих сотрудникам компании.

Разбор сценария PowerShell

Сразу хочу предупредить: этот сценарий PowerShell был написан для однократного использования, поэтому при его создании я отступил от привычных принципов разработки и пренебрег элегантностью в пользу функциональности — в конце концов, я не программист. Именно поэтому я и упоминал в начале статьи, что сценарий был написан «на скорую руку».

Ниже я разбираю сценарий построчно (или посекционно) и объясняю, почему предпочел ту или иную команду.

# Start of script


Для начала необходимо очистить экран, чтобы лишняя информация не отвлекала при просмотре результатов.

Cls


Затем мне пришлось создать цикл обработки, чтобы разбить данные, полученные из Active Directory, на пригодные для анализа фрагменты. Без этого выполнение сценария аварийно завершалась, поскольку моему рабочему компьютеру не хватало памяти для обработки 600 с лишним тысяч учетных записей за раз.

Каждый объект в разделе «targetou» представляет организационную единицу Active Directory. Следующая команда выводит на экран сведения о том, какая организационная единица на данный момент находится в обработке. Это позволяет отслеживать процесс в режиме реального времени.

foreach ($targetou in 'A','B','C','D','E','F','G','GUESTACCOUNTS','H','I','J','K','L','CONTRACTOR','M','N','O','P','Q','R','S','T',','U','V','W','X','Y','Z')
{
"Processing information for OU $targetou"


Переменная $targetou обозначает самый нижний уровень иерархии Active Directory, обрабатываемый в данном сценарии. Переменная $domainrootpath позволяет указать полный LDAP-путь к организационной единице в каждом шаге цикла.

$DomainRootPath='LDAP://OU='+$targetou+',OU=ORGUSER,DC=contoso,DC=com'


Следующие команды создают и заполняют объект искателя для Active Directory в PowerShell.

$adsearch = New-Object DirectoryServices.DirectoryAdsearch([adsi]$DomainRootPath)


Я ограничил результаты поиска таким образом, чтобы включить в них лишь данные о пользователях.

$adsearch.filter = "(objectclass=user)"


Команда PropertiesToLoad в следующем фрагменте кода необходима для создания отчета. Она еще больше ограничивает результаты поиска по Active Directory, включая в них лишь определенные сведения. Это необходимо из-за огромного массива данных, с которым мне пришлось работать.

$adsearch.PropertiesToLoad.AddRange(@("name"))
$adsearch.PropertiesToLoad.AddRange(@("lastLogon"))
$adsearch.PropertiesToLoad.AddRange(@("givenName"))
$adsearch.PropertiesToLoad.AddRange(@("SN"))
$adsearch.PropertiesToLoad.AddRange(@("DisplayName"))
$adsearch.PropertiesToLoad.AddRange(@("extensionAttribute1"))
$adsearch.PropertiesToLoad.AddRange(@("extensionAttribute2"))
$adsearch.PropertiesToLoad.AddRange(@("comment"))
$adsearch.PropertiesToLoad.AddRange(@("title"))
$adsearch.PropertiesToLoad.AddRange(@("mail"))
$adsearch.PropertiesToLoad.AddRange(@("userAccountControl"))
$adsearch.Container

Следующая команда осуществляет поиск на основе указанных выше параметров. На каждом шаге цикла foreach Active Directory осуществляет поиск данных для одной организационной единицы и выводит заданные атрибуты для каждой учетной записи. Вывод команды сохраняется в переменных с именами пользователей. Однако в таком виде эти данные нельзя просто экспортировать в CSV-файл, поскольку в таком случае он будет содержать лишь имя объекта Active Directory и запись «System.DirectoryServices.ResultPropertyCollection». Поэтому необходимо включить в вывод отдельные элементы Active Directory, что будет сделано в следующем разделе сценария.

$users = $adsearch.findall()


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

$users.Count


Затем я инициализировал переменную типа массива, в которой будут сохраняться отдельные элементы Active Directory.

$report = @()


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

foreach ($objResult in $users)
{


Затем мне необходимо было создать переменную для сохранения свойств отдельной записи. Можно обойтись и без этого, но я предпочитаю разбивать данные на несколько сегментов для удобства восприятия.

$objItem = $objResult.Properties


После этого я создал новый временный объект для сохранения различных атрибутов Active Directory для записи, обрабатываемой на данном шаге цикла (этот процесс повторяется для каждой записи, полученной из Active Directory).

$temp = New-Object PSObject


Для каждого свойства Active Directory, полученного в результате поиска, я добавил переменную temp с именем свойства. Это позволяет разбить данные учетной записи Active Directory для одного пользователя на отдельные компоненты — имя, должность, адрес электронной почты и так далее. Регистр в данном случае имеет значение.

$temp | Add-Member NoteProperty name $($objitem.name)
$temp | Add-Member NoteProperty title $($objitem.title)
$temp | Add-Member NoteProperty mail $($objitem.mail)
$temp | Add-Member NoteProperty displayname $($objitem.displayname)
$temp | Add-Member NoteProperty extensionAttribute1 $($objitem.extensionattribute1)
$temp | Add-Member NoteProperty extensionAttribute2 $($objitem.extensionattribute2)
$temp | Add-Member NoteProperty givenname $($objitem.givenname)
$temp | Add-Member NoteProperty sn $($objitem.sn)
$temp | Add-Member NoteProperty useraccountcontrol $($objitem.useraccountcontrol)


Затем я включил результаты обработки отдельных записей в основной массив, в котором сохраняются результаты поиска для дальнейшего экспорта в CSV-файл.

$report += $temp
}

Следующая команда определяет имя файла для сохранения. Для каждой организационной единицы я предпочел создать отдельный файл.

$csvfile="AD-"+$targetou+".csv"

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

$report | export-csv -notypeinformation $csvfile
"Wrote file for $targetou"
}

Заключение

Этот сценарий PowerShell прекрасно справился с поставленной задачей, предоставив мне необходимые данные для последующего сравнения. Если вам известен более элегантный способ получения тех же самых данных, поделитесь своим опытом в комментариях!

Автор: Scott Lowe
Перевод SVET


Поделись с друзьями



Рекомендуем посмотреть ещё:



Сценарии восстановления удаленных объектов в Active Directory / Виды долговременных покрытий для ногтей



Сценарии для active directory Новые возможности в Active Directory федерации службы для Windows
Сценарии для active directory Управляем объектами в Active Directory. Часть 1:Журнал СА 5.2008
Сценарии для active directory Windows PowerShell 2.0 преподносит сценарии для Active Directory
Сценарии для active directory PowerShell 2.0 преподносит сценарии для Active Directory, не
Сценарии для active directory Сценарий PowerShell для сбора данных в Active Directory
Сценарии для active directory А ну-ка, бабушки! - Сценарии - АсСоль
Алгоритм действия. t Посмертный уход на дому Как выстроить отношения с мамой и установить с ней дистанцию за 15 шагов Как на "Нокиа " сделать скриншот: советы для новичков Как связать овал крючком, правило вязания овала Как сделать сюрикен из металла? Как создать символьную ссылку на папку или файл в Windows Мониторинг законодательства (ежемесячный обзор изменений) Ответы что значит слово: губы подернутые маслом Производственная практика 5й курс

ШОКИРУЮЩИЕ НОВОСТИ