· 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 подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.