главная    •     Новости      •     софт      •     RSS-ленты     •     реклама      •     PDA-Версия      •    Контакты
Windows XP    •      Windows 7     •    Windows 8    •    Windows 9-10-11     •    Windows Server     •    Железо
Советы      •     Администрирование      •     Сеть      •     Безопасность      •     Статьи      •     Материалы
Реклама на сайте
Книга жалоб и предложений
Правила на сайте
О Winblog.ru и о копирайте
Написать в редакцию
Конфиденциальность
                       
  • Microsoft Edge - еще более безопасный!
  • ActiveCloud - надежный провайдер облачных услуг для вашей компании
  • ANYSERVER - ваш поставщик б/у серверов из Европы
  • Настройка контекстной рекламы в Yandex и Google: Эффективный путь к росту вашего бизнеса
  • Коммутаторы с функцией PoE: Обеспечение эффективной передачи данных и питания
  • Очередное обновление сломало выключатель компьютеров на Windows 11
  • Скотт Лоу (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 учетных записей компьютеров с незаполненным полем описания
  • Создание моментальных снимков домена с помощью Sysinternals Active Directory Explorer
  • Десять поводов научиться использовать PowerShell
  • Секреты реестра. Часть 10.
  • Десять незаменимых серверных инструментов Windows



  • Для отправки комментария, обязательно ответьте на вопрос

    Вопрос:
    Сколько будет один минус один?
    Ответ:*




    ВЕРСИЯ ДЛЯ PDA      СДЕЛАТЬ СТАРТОВОЙ    НАПИШИТЕ НАМ    МАТЕРИАЛЫ    ОТ ПАРТНЁРОВ

    Copyright © 2006-2022 Winblog.ru All rights reserved.
    Права на статьи принадлежат их авторам. Копирование и использование материалов разрешается только в случае указания явной гиперссылки на веб-сайт winblog.ru, как на источник получения информации.
    Сайт для посетителей возрастом 18+