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, а потом удаляется совсем. То есть суммарно у вас год на восстановление до окончательной потери данных.
Предварительные требования
- Функциональный уровень леса и домена — Windows Server 2008 R2 и выше.
- Права Enterprise Admins (на корневой домен леса).
- Все контроллеры домена желательно актуальные, здоровая репликация.
- Бэкап всех DC перед включением — в случае чего восстановитесь на момент до.
Проверить функциональные уровни:
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 тот же. С точки зрения сервисов — как будто ничего не было.
Ключевые атрибуты удалённых объектов
| Атрибут | Значение |
|---|---|
| isDeleted | TRUE для удалённых объектов |
| lastKnownParent | DN родительской 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:
- Открываем ldp.exe от администратора, Connection → Connect → свой DC, Bind.
- Options → Controls → Load Predefined → Return Deleted Objects.
- View → Tree → корневой DN → раскрываем CN=Deleted Objects.
- Находим нужный объект, правый клик → Modify.
- Attribute: isDeleted, Value: пустая строка, Operation: Delete.
- Attribute: distinguishedName, Value: исходный DN в OU, Operation: Replace.
- 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-бэкап на корпоративный файл-сервер. Больше таких историй у них не было.
Лучшие практики, проверенные годами
- Включайте корзину AD на всех новых лесах сразу после поднятия функционального уровня.
- Делайте аудит удалений в Event Viewer (Event ID 5141 для OU, 4726/4743 для учёток).
- Ограничьте права Delete на корне домена и важных OU только доверенным сотрудникам.
- Защитите критичные OU чекбоксом «Protect object from accidental deletion» — удалить нельзя, пока не снимете флаг.
- Делайте еженедельный бэкап системного стейта DC: wbadmin start systemstatebackup.
- Держите документ с процедурой восстановления и прогоняйте её на тестовом стенде раз в полгода.
# Защита 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 это не проблема.