Швидке відновлення випадково видалених об’єктів active directory
На щастя в нагоді певні знання Active Directory, зокрема уривчасті знання про якісь «об'єктах-надгробках» (Tombstone Objects).
Насправді в Active Directory вбудована непогана захист «від дурня», такого наприклад, як я. Це ті самі Tombstone-об'єкти. Видалення з бази AD відбувається не відразу, в цьому і є щастя. Для початку об'єкт і пов'язані з ним атрибути поміщається в прихований контейнер «Deleted Objects», набуваючи при цьому деякі відмітні ознаки «віддаленого об'єкта», а саме:
1. З'являється аттрибут isDeleted. що може приймати булеві значення True і False. Він сигналізує про те, що об'єкт позначений, як віддалений.
2. У значенні атрибута distinguishedName після імені об'єкта з'являється прапор ADEL.
3. З'являється додатковий атрибут Tombstone Lifetime. який веде відлік часу життя об'єкта-пам'ятника, після закінчення якого об'єкт видаляється назавжди.
Кожні 15 хвилин (за замовчуванням) по контейнеру Deleted Objects пробігає Складальник сміття (Garbage Collector або Executioner), який зчитує у знаходяться в контейнері об'єктів значення аттрибута Tombstone Lifetime, об'єкти, значення цього атрибута у яких досягло граничного значення, видаляються. І ось тепер назавжди. За замовчуванням об'єкти можуть зберігається у вигляді об'єктів-пам'яток протягом 60 днів (хоча Microsoft рекомендує збільшити це значення до 120 днів)
Значення аттрібутаTombstone Lifetime може бути змінено з використанням ADSIEdit. Перейдіть до cn = directory Service, cn = windowsNT, cn = services, cn = configuration, dc = company, dc = com (замінивши природно dc = company, dc = com на Ваші реальні дані). Клацніть правою кнопкою миші на контейнері CN = Directory Service і виберіть Properties. Знайдіть Tombstone Lifetime в списку атрибутів, натисніть кнопку Edit і введіть кількість днів, необхідне для зберігання вилучених об'єктів.
Отже, провідного програміста ми видалили. Що робити? Варіант з Authoritative Restore мені не підходив по ряду причин:
- Була потрібна перезавантаження контролера домену для входу в режим відновлення Active Directory (Active Directory Restore Mode)
- Я не був упевнений в актуальності, та й наявності бекапа в принципі.
- Часу було занадто мало
Було вирішено піти іншим шляхом:
Для відновлення віддаленого об'єкта в принципі достатньо видалити атрибут isDeleted і змінити значення distinguishedName.
Запустивши Ldp.exe. вибираємо з меню Connections команду Connect.

1. Якщо поточний користувач є членом групи Enterprise Admins, то використовуємо контекст поточного користувача.
2. У всіх інших випадках - вводимо облікові дані користувача що входить до групи Enterprise Admins.
Далле, Вам потрібно включити відображення скриторго каталогу Deleted Objects, для чого в меню Options вибираємо команду Controls.

У вікні, в полі Load Predefined з спадаючого списку вибираємо Return deleted objects.
Далі вибираємо в меню View пункт Tree. для відображення дерева контейнерів в лівій панелі.
У вікні Tree view в поле BaseDN вибираємо корінь лісу, в моєму випадку це DC = ad, DC = webzavod, DC = ru.
Двічі клацнувши на корені дерева отримуємо список Контенери, в якому шукаємо контейнер CN = Deleted Objects, DC = ad, DC = webzavod, DC = ru. природно замінивши мої дані своїми. Розкриваємо контейнер і знаходимо в ньому віддалений об'єкт, який необхідно відновити. У мене він називався приблизно так:
CN = Oleg Krylov ADEL: 41057e80-84fd-4c96-8e54-26886519b6e8, CN = Deleted Objects, DC = ad, DC = webzavod, DC = ru
Зверніть увагу на прапор ADEL. Він є :)
У правій панелі ми бачимо той самий злощасний аттрибут isDeleted: TRUE. Ось воно як вийшло то ...
Далі все відбувається дуже швидко:
1. Виділяємо об'єкт в лівій панелі.
2. Правим кліком викликаємо контекстне меню, вибираємо в ньому пункт Modify.
3. У розділі Edit Entry, в поле Attribute вводимо isDeleted. в панелі Operation вибираємо Delete. потім тиснемо Enter. В результаті в поле Entry List з'являється рядок [Delete] isDeleted:
4.Далі, не роблячи дій щодо застосування внесених змін міняємо distiguishedName. Для цього:
- У розділі Edit Entry, в поле Attribute вводимо ім'я аттрибута, тобто distiguishedName
- У розділі Edit Entry, в поле Values вводимо значення аттрибута lastKnownParent. яке беремо в правій панелі, в списку атрибутів об'єкта. У моєму випадку це OU = Webzavod, DC = ad, DC = webzavod, DC = ru
- На самому початку значення додаємо ім'я об'єкта, знову ж в моєму випадку CN = Oleg Krylov. не забувши поставити кому!
- В результаті отримуємо значення аттрибута CN = Oleg Krylov, OU = Webzavod, DC = ad, DC = webzavod, DC = ru
- У розділі Operation. вибираємо чекбокс - Replace. тиснемо кнопку Enter
5. У поле Entry List з'являється другий рядок, зі значенням: [Replace] distinguishedName: CN = Oleg Krylov, OU = Webzavod, DC = ad, DC = webzavod, DC = ru
6. Далі, переконавшись, що обрані прапори Synchronous і Extended натискаємо кнопку Run
Про успішний результат нам просигналізує запис в правій панелі вигляду:
*** Call Modify ...
ldap_modify_ext_s (ld, 'CN = Oleg KrylovADEL: 41057e80-84fd-4c96-8e54-26886519b6e8, CN = Deleted Objects, DC = ad, DC = webzavod, DC = ru', [2] attrs, SvrCtrls, ClntCtrls);
Modified «CN = Oleg KrylovADEL: 41057e80-84fd-4c96-8e54-26886519b6e8, CN = Deleted Objects, DC = ad, DC = webzavod, DC = ru».
Відкриваємо Active Directory Users and Computers, у відповідному OU (тому самому, звідки був видалений злощасний об'єкт) знаходимо його живим і здоровим, правда в трохи відключеному ссостояніі. При спробі включення отримуємо помилку виду:

Для включення потрібно змінити пароль.
Все, я врятований! Для того різання цього фокусу мені потрібно півтори хвилини. Єдина незручність - необхідність зміни пароля. Але думаю, в світлі можливих проблем з остаточною втратою користувача це дрібниці!
Величезну подяку хочу висловити Gary Olsen за пристойну статтю
Артему Синіцин за підтримку в перші хвилини шоку і всякі фрази підбадьорливого спрямування ( «Не сси, все нормально»)
І звичайно ж Степану Голосунову (див. Фото на початку), гідно переніс роль жертви, за розуміння.
Як бачите, не кожна «безвихідна» ситуація насправді безвихідна.