Active Directory Recycle Bin: восстановление — АйТи Фреш
· 14 мин чтения

Active Directory Recycle Bin: восстановление удалённых объектов без слёз и даунтайма

Active Directory Recycle Bin: восстановление удалённых объектов без слёз и даунтайма

Привет! Меня зовут Семёнов Евгений Сергеевич, я директор АйТи Фреш. Если у вас в корпоративной сети до сих пор не активирована корзина Active Directory, то я просто обязан рассказать, почему это большая ошибка. За 15 лет моей работы я видел десятки ситуаций, когда какой-нибудь младший админ случайно нажимал Delete не на ту OU и в мгновение ока сносил целое подразделение на 80 человек, а с ним — все доступы, группы и профили. После первой же такой крупной аварии у клиента я всегда первым делом включаю корзину. Это абсолютно бесплатная страховка, которая спасает не только часы работы, но иногда и репутацию компании.

Что такое AD Recycle Bin и зачем он нужен

До выхода Windows Server 2008 R2 удалённые объекты AD превращались в так называемые tombstone — это была, по сути, пустышка с минимумом атрибутов и без какого-либо членства в группах. Восстановление в те времена было сущей болью! Приходилось делать это через ldp.exe, вручную возвращая каждый атрибут, и, конечно, без восстановления групп. А вот с включённой корзиной всё совсем иначе: объект остаётся в контейнере CN=Deleted Objects целиком, со всеми своими атрибутами, паролями, SID и, что важно, членством в группах.

По умолчанию, стандартное время хранения составляет 180 дней — это параметр атрибута msDS-DeletedObjectLifetime корневого контейнера. После истечения этого срока объект переходит в состояние recycled, и ещё на 180 дней он лежит в базе, но уже как tombstone. Затем он удаляется окончательно. То есть, получается, у вас есть целый год на восстановление, прежде чем данные будут утеряны навсегда.

Предварительные требования

Проверить функциональные уровни:

Get-ADForest | Select ForestMode
Get-ADDomain | Select DomainMode

# Если ниже 2008R2 — поднимаем (операция необратима)
Set-ADForestMode -Identity corp.example.ru -ForestMode Windows2016Forest -Confirm
Set-ADDomainMode -Identity corp.example.ru -DomainMode Windows2016Domain -Confirm

Включение корзины

Командой выше я уже показал модулю AD. Теперь — включаем фичу. Операция одноразовая и необратимая: выключить корзину штатно нельзя.

Import-Module ActiveDirectory

Enable-ADOptionalFeature -Identity "Recycle Bin Feature" `
  -Scope ForestOrConfigurationSet `
  -Target "corp.example.ru" `
  -Confirm:$false

# Проверка
Get-ADOptionalFeature -Filter "Name -eq 'Recycle Bin Feature'" | `
  Select Name, EnabledScopes

В атрибуте EnabledScopes появляется DN вашего леса — это значит, что корзина работает. С этого момента все удаляемые объекты будут сохраняться целиком.

Поиск удалённых объектов

Удалённые объекты хранятся в контейнере CN=Deleted Objects,DC=corp,DC=example,DC=ru. Чтобы их найти, мы используем PowerShell:

# Все удалённые пользователи за последние 7 дней
Get-ADObject -Filter 'isDeleted -eq $true -and objectClass -eq "user"' `
  -IncludeDeletedObjects `
  -Properties * |
  Where-Object { $_.WhenChanged -gt (Get-Date).AddDays(-7) } |
  Select Name, LastKnownParent, WhenChanged, ObjectGUID

# Поиск конкретного пользователя
Get-ADObject -Filter 'samAccountName -eq "ivanov"' `
  -IncludeDeletedObjects -Properties *

# Все удалённые OU
Get-ADObject -Filter 'isDeleted -eq $true -and objectClass -eq "organizationalUnit"' `
  -IncludeDeletedObjects

Атрибут LastKnownParent указывает, в какой OU объект был до удаления — понадобится для восстановления на место.

Восстановление объектов

Основная команда, которой мы пользуемся, это Restore-ADObject. Здесь есть очень важный момент: сначала нужно восстановить OU, и только потом её содержимое. Если попробовать наоборот, контейнера для возврата просто не будет существовать, и команда выдаст ошибку.

# Один пользователь по имени
Get-ADObject -Filter 'samAccountName -eq "ivanov"' `
  -IncludeDeletedObjects | Restore-ADObject

# OU целиком со всем содержимым (двумя шагами)
# 1) Сначала сама OU
Get-ADObject -Filter 'Name -eq "Финансы" -and isDeleted -eq $true' `
  -IncludeDeletedObjects | Restore-ADObject

# 2) Затем все объекты, у которых lastKnownParent = DN этой OU
$ouDN = "OU=Финансы,DC=corp,DC=example,DC=ru"
Get-ADObject -Filter "lastKnownParent -eq '$ouDN' -and isDeleted -eq `$true" `
  -IncludeDeletedObjects | Restore-ADObject

# Массовое восстановление группы объектов за последние 24 часа
Get-ADObject -Filter 'isDeleted -eq $true' `
  -IncludeDeletedObjects -Properties WhenChanged |
  Where-Object { $_.WhenChanged -gt (Get-Date).AddHours(-24) } |
  Restore-ADObject

После восстановления пользователь попадает в ту же OU, где был, членство в группах возвращается автоматически, пароль тот же, SID тот же. С точки зрения сервисов — как будто ничего не было.

Ключевые атрибуты удалённых объектов

АтрибутЗначение
isDeletedTRUE для удалённых объектов
lastKnownParentDN родительской OU на момент удаления
objectGUIDСохраняется, остаётся тем же после восстановления
objectSidСохраняется — все ACL продолжат работать
sAMAccountNameМожет быть переименован в «Name\0ADEL:GUID»
whenChangedВремя удаления (полезно для фильтрации)

Настройка времени хранения

Стандартные 180 дней меня, как правило, вполне устраивают. Но иногда, конечно, возникает необходимость увеличить этот срок. Это актуально для регулируемых отраслей или очень больших лесов, где аудит удалений могут проводить полгода или даже год. Вот как это можно изменить:

$domain = (Get-ADDomain).DistinguishedName
Set-ADObject -Identity "CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration,$domain" `
  -Partition "CN=Configuration,$domain" `
  -Replace @{"msDS-DeletedObjectLifetime" = 365}

Уменьшать ниже 180 дней нельзя — Windows не даст. Увеличение разумно до 365 дней; дольше обычно не нужно, NTDS.dit начинает ощутимо расти.

Восстановление через ldp.exe (если корзина не была включена)

Самый, пожалуй, печальный сценарий — это когда объект удалили, а корзина почему-то не была активирована. В таком случае в контейнере Deleted Objects остаётся лишь tombstone с минимумом атрибутов. Восстановить его можно через ldp.exe, вот так:

  1. Открываем ldp.exe от администратора, Connection → Connect → свой DC, Bind.
  2. Options → Controls → Load Predefined → Return Deleted Objects.
  3. View → Tree → корневой DN → раскрываем CN=Deleted Objects.
  4. Находим нужный объект, правый клик → Modify.
  5. Attribute: isDeleted, Value: пустая строка, Operation: Delete.
  6. Attribute: distinguishedName, Value: исходный DN в OU, Operation: Replace.
  7. Enter для добавления в список, затем Run.

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

Реальный кейс: восстановление OU на 90 человек

В ноябре 2024 года к нам обратилась одна торговая компания из Восточного округа Москвы. У них новый сотрудник IT-отдела, который был на испытательном сроке всего неделю, чистил OU «Уволенные» и случайно нажал Delete на OU «Розничная сеть». Представляете? Это 90 пользователей, 7 групп доступа и 12 GPO-линков! Он сам обнаружил свою ошибку только через 4 часа, когда продавцы в филиалах начали звонить с криками «не могу зайти в 1С»!

К счастью, за полгода до этого мы уже успели включить клиенту корзину AD и настроить мониторинг. Я сразу подключился к сессии по удалёнке и снял дамп OU прямо из CN=Deleted Objects:

$ts = (Get-Date).AddHours(-5)
Get-ADObject -Filter "isDeleted -eq `$true -and whenChanged -gt '$ts'" `
  -IncludeDeletedObjects -Properties * |
  Export-Csv C:\Temp\deleted.csv -NoTypeInformation

В CSV — 97 записей (OU + группы + пользователи). Восстановил двумя скриптами: сначала OU, потом всё содержимое по lastKnownParent. Вся операция заняла 23 минуты, включая диагностику и контрольные проверки входа четырёх разных пользователей. Даунтайм ритейла — 4 часа 40 минут, стоимость работ — 12 000 руб., клиент сохранил выручку минимум в 350 000 руб. за день.

После этого неприятного инцидента мы внедрили для клиента две важные вещи: включили аудит удалений OU с мгновенным уведомлением в Telegram-бот и настроили еженедельный экспорт всей структуры AD в XML-бэкап на их корпоративный файл-сервер. С тех пор подобных историй у них, к счастью, больше не повторялось.

Лучшие практики, проверенные годами

# Защита OU от случайного удаления
Set-ADOrganizationalUnit -Identity "OU=Финансы,DC=corp,DC=example,DC=ru" `
  -ProtectedFromAccidentalDeletion $true

# Массово для всех OU
Get-ADOrganizationalUnit -Filter * |
  Set-ADOrganizationalUnit -ProtectedFromAccidentalDeletion $true

Настроим резервное копирование и восстановление Active Directory

У нас на практике корзина AD — базовый элемент аудита любого корпоративного домена. Включу, настрою мониторинг удалений, подготовлю процедуру быстрого восстановления, обучу вашу IT-команду. Работаю с доменами от 30 до 800 рабочих мест в Москве и области. Первичный аудит и рекомендации — бесплатно.

Телефон: +7 903 729-62-41
Telegram: @ITfresh_Boss
Семёнов Евгений Сергеевич, директор АйТи Фреш

FAQ — частые вопросы о корзине AD

Можно ли включить корзину AD задним числом?
Нет. Корзина начинает работать только с момента её включения. Объекты, удалённые ранее, попадают в tombstone-объекты без атрибутов и восстанавливаются только через authoritative restore из бэкапа.
Можно ли выключить корзину после включения?
Нет, это операция в одну сторону. Функция необратима, отключить её штатными средствами нельзя. Для офисов любого размера это не проблема: места в NTDS.dit занимает немного, а риск случайного удаления закрывается надёжно.
Сколько хранится удалённый объект в корзине?
По умолчанию 180 дней. После этого объект становится tombstone ещё на 180 дней, но уже без атрибутов и членства. Срок настраивается через msDS-DeletedObjectLifetime.
Восстанавливается ли членство в группах?
Да, при использовании корзины AD атрибуты memberOf и member полностью сохраняются и восстанавливаются вместе с объектом. В отличие от tombstone-восстановления через ldp.exe, где членство обнуляется.
Какой функциональный уровень домена нужен?
Windows Server 2008 R2 и выше и для леса, и для домена. Для современных сетей с DC на 2016/2019/2022 это не проблема.

Подпишитесь на рассылку ITfresh

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

Реквизиты оператора персональных данных

ООО «АЙТИ-ФРЕШ», ИНН 7719418495, КПП 771901001. Юридический адрес: 105523, г. Москва, Щёлковское шоссе, д. 92, корп. 7. Контакт: info@itfresh.ru, +7 903 729-62-41. Оператор обрабатывает e-mail подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.