Share via


Как просмотреть удаленные объекты Active Directory перед восстановлением

Случайные удаления объектов в Active Directory могут происходить по многим причинам. Администратор может непредумышленно удалить один объект пользователя или, нечаянно нажав не ту клавишу на клавиатуре, удалить целое дерево OU. Некорректный скрипт может удалить несколько объектов в разных местах иерархии AD. В Active Directory, когда удаленные объекты перемещаются в контейнер для удаленных объектов, они теряют свое расположение в иерархии (т.к. DN уже изменено для обеспечения уникальности).
Когда происходит случайное удаление, важно внимательно проанализировать произошедшее перед разработкой стратегии восстановления. В этом случае необходимо определить:

  1. Что было удалено?
  2. Когда произошло удаление?
  3. Где (на каком контроллере домена) произошло удаление?

После выполнения анализа, когда определены объекты, которые необходимо восстановить, – вы можете выбрать предпочтительный метод восстановления.
Традиционное восстановление предполагает, что есть недавняя резервная копия состояния системы (system state) и необходимо произвести авторитетное восстановление удаленных объектов. Но для лесов с функциональным уровнем Windows Server 2008 R2 есть новая функция Корзина (Recycle Bin), которая делает восстановление одиночных объектов очень простым. С момента включения этой функции, все атрибуты сохраняются в объекте при его удалении. И когда объект восстанавливается с помощью командлета Restore-ADObject – объект восстанавливается полностью. Таким образом, если объект пользователя был случайно удален и восстановлен с помощью Restore-ADObject – все прямые и обратные ссылки на объект пользователя также восстанавливаются – членство в группах, менеджер, ManagedObjects, DirectReports и т.д., также, как и атрибуты, не являющиеся ссылками.
Этот пост описывает фазу анализа: определение объектов, которые необходимо восстановить.
Необходимо определить способы, которыми вы можете анализировать произошедшее удаление. Три основных подхода таковы:

  1. Если были случайно удалены несколько объектов, обычно все такие объекты удаляются за короткий промежуток времени. Это может быть действие непрофессиональных сотрудников во время установки приложения или некорректный скрипт, который удалил не только те объекты, которые требовалось, но и другие тоже, или неуклюжий администратор, удаливший целое дерево OU, или даже действие злоумышленника – в любом случае, обычно такие удаления происходят за несколько секунд или минут.
  2. При случайном удалении нескольких объектов, обычно все эти объекты удаляются с одного контроллера домена.
  3. Данные в AD расположены иерархически, графический интерфейс тоже иерархичен – при удалении более, чем одного объекта – обычно удаляется целая иерархическая структура.

В виду отсутствия хорошего графического интерфейса, позволяющего просмотреть содержимое корзины AD, предлагаю вам пример скрипта, который может просмотреть содержимое контейнера удаленных объектов и дать информацию по трем категориям, представленным выше.
Скрипт читает контейнер удаленных объектов, конструируя иерархию удаленных объектов (организационные подразделения и контейнеры). Далее, он считывает метаданные о репликации этих контейнеров для определения, когда и где объект был удален.
Посмотрите на схему ниже. Пять деревьев организационных подразделений были удалены. Четыре из них располагались в иерархии непосредственно ниже уровня домена и одно – внутри контейнера Users. Для каждого из удаленных OU, скрипт точно показывает, когда произошло удаление (а не изменение атрибута whenChanged) и где оно произошло.
clip_image001
Далее вывод этой команды можно передать по конвейеру командлету Where-Object и отфильтровать по нужному критерию – когда или где произошло удаление.

clip_image002

Можно также отсортировать по полю WhenDeleted – хотя это и нарушает вид дерева …

clip_image003

Восстановление дерева
Восстановление для удаленных деревьев не так просто, как для отдельных объектов. Когда объекты удаляются, они перемещаются в контейнер Deleted Objects с плоской иерархией. Таким образом, удаленное дерево теряет свою иерархию. Скрипт Restore-ADTree делает восстановление дерева более простым. Можно передать в скрипт DN или GUID корня дерева и он рекурсивно восстановит все нижележащие объекты. Скрипт Restore-ADTree можно использовать на удаленных OU, только если ВСЕ удаленные дочерние объекты этого OU (ныне расположенные в контейнере для удаленных объетов) должны быть восстановлены.
При использовании с параметром -LeafObjectInfo, этот скрипт (Get-ADDeletedContainers) также показывает информацию о подчиненных (subordinates) каждого контейнера. Поле 'subordinates' показывает количество удаленных объетов, непосредственно расположенных ниже удаленного OU и максимальный промежуток между временем удаления подчиненных объектов. Итак, пусть свежесозданное OU содержало 5 объектов пользователей. Один из них был удален 3 дня назад (правильное умышленное удаление), а сегодня OU и 4 дочерних объекта были удалены случайно – Поле “subordinates” (подчиненные) для данного OU покажет 5 (3.00:00:00).

clip_image004

С опцией LeafObjectsInfo скрипт будет выполняться дольше. Эта опция поможет проанализировать, нужно ли использовать для удаленных OU скрипт Restore-ADTree. Если время удаления подчиненных объектов различается более, чем на несколько минут – нужно проанализировать, все ли подчиненные объекты являются кандидатами на восстановление.
Таким образом, перед использованием Restore-ADObject или Restore-ADTree или даже если вы планируете использовать авторитетное восстановление (ввиду невозможности использования корзины) – вы можете использовать этот скрипт для лучшего просмотра и анализа содержимого контейнера удаленных объектов.
Использование: Укажите диском AD PowerShell на вашу AD или перейдите на диск AD: и используйте скрипт, как показано в примерах. Не требуется включать корзину, чтобы скрипт работал.

  1. PS CONTOSO:\> Get-ADDeletedContainers.ps1 | ft DisplayName,WhenDeleted,WhereDeleted
  2. PS CONTOSO:\> Get-ADDeletedContainers.ps1 | ft DisplayName,ObjectClass,ObjectGUID,WhenDeleted,WhereDeleted
  3. PS CONTOSO:\> Get-ADDeletedContainers.ps1 -LeafObjectsInfo | ft DisplayName,Subordinates
  4. PS CONTOSO:\> Get-ADDeletedContainers.ps1 | where {$_.WhenDeleted -gt [DateTime]::Parse("5/25/2009 9:40:00 AM")}|ft DisplayName,WhenDeleted,WhereDeleted
  5. PS CONTOSO:\> Get-ADDeletedContainers.ps1 | where {$_.WhereDeleted -like "CONTOSO-DC2*"}|ft DisplayName,WhenDeleted,WhereDeleted
  6. PS CONTOSO:\> Get-ADDeletedContainers.ps1 | where {$_.WhenDeleted -gt [DateTime]::Parse("5/25/2009") -and $_.WhereDeleted -like "CONTOSO-DC2*"}|ft DisplayName,WhenDeleted,WhereDeleted

ps: Защитите ваши OU от случайного удаления, для предотвращения подобного в дальнейшем. Чтобы узнать как – сделайте поиск по фразе "Protect an Organizational Unit from Accidental Deletion"

Наслаждайтесь!
Душянт Гилл (Dushyant Gill)
Program Manager, Directory Services

Присоединенный файл: Get-ADDeletedContainers ps1.txt

Оригинал

Перевод: Илья Лушников