Active Directory — одна из самых важных служб для сетей Windows, любые сбои в ее работе сказываются на всех пользователях сети. При неполадках в Active Directory очень важно иметь отработанные сценарии аварийного восстановления. Одна из наиболее распространенных причин сбоя службы — случайное удаление объектов, поэтому предлагаю вам познакомиться с некоторыми способами восстановления удаленных объектов в Active Directory.
Итак, что делать, если вы случайно удалили из Active Directory нужного пользователя (компьютер, группу, контейнер и т.п. )?
Отвечу на вопрос, который сразу возникает в подобной ситуации — создать новый объект гораздо проще, чем пытаться восстановить старый, и в некоторых ситуация это допустимо. Но давайте представим, что произойдет при создании, скажем, нового пользователя взамен удаленного. Да, мы можем дать ему точно такое же имя, и он даже сможет зайти под ним в сеть, но и все! Попытавшись получить доступ к ресурсам, на которые у него раньше были права, он получит отказ.
А дело в том, что Active Directory различает объекты не по имени, а по специальному идентификатору — Security Identifier (SID). Это уникальный идентификатор безопасности, который присваивается объекту в момент его создания и остается с ним даже после удаления. А поскольку каждый SID уникален, то вновь созданный пользователь, вне зависимости от имени, получит свой SID и будет распознан системой как совершенно другой пользователь. При этом будет потеряна вся информация, которая была закреплена за старой учетной записью, и придется все делать заново — раздавать права, включать пользователя в группы, настраивать программы, и много других ″интересных″ моментов.
Поэтому, чтобы избежать проблем (да и просто для общего развития) стоит иметь представление о способах восстановления удаленных объектов в Active Directory.
Что происходит с объектом AD при удалении
Для начала разберемся с тем, что происходит после того как вы нажали Delete и объект исчез из оснастки управления.
При удалении объекта из каталога происходит следующее: сначала объект помечается как удаленный, для чего атрибуту isDeleted объекта присваивается значение true, затем большинство атрибутов из объекта удаляется, объект переименовывается и перемещается в специальный контейнер — Deleted Objects. Теперь он зовется объектом-захоронением и недоступен для обычных операций в AD.
Объект-захоронение невидим в оснастках управления MMC, а для большинства служебных программ его вообще не существует. Однако физически данные все еще здесь — просто они невидимы. Зачем же Active Directory хранит удаленные объекты в базе данных?
А вот зачем: будучи невидимым для остальных процессов, объект-захоронение все еще видим для процесса репликации. Чтобы удостовериться в том, что удаление выполнено полностью, на всех контроллерах домена, содержащих удаленный объект, AD реплицирует объект-захоронение на все контроллеры в домене. Другими словами, объект-захоронение используется для репликации удаления по всей Active Directory.
Естесственно, удаленные объекты не могут храниться в контейнере Deleted Objects вечно. С периодичностью раз в 12 часов контроллер домена производит сборку мусора. Сборщик мусора проверяет все объекты-захоронения и физически удаляет те, чей срок жизни больше, чем срок жизни объектов-захоронений.
Срок жизни объекта-захоронения определяется атрибутом tombstoneLifetime и по умолчанию составляет 180 дней (60 дней для лесов Windows 2000). Посмотреть текущее значение tombstoneLifetime и изменить его можно следующим способом.
Открываем редактор ADSIEdit и в качестве точки подключения (Connection Point) выбираем «Select or Type a Distinguished Name or Naming Context». В пустом поле вводим путь CN=Directory Service,CN=Windows NT, CN=Services, CN=Configuration, DC=contoso, DC=com (для домена contoso.com).
Нажимаем OK и в оснастке появляется новый контекст именования. Разворачиваем его и в открывшемся окне находим интересующий нас атрибут tombstoneLifetime. Как видите, он действительно равен 180 дням.
Получается что пока не истек срок жизни объекта-захоронения, удаленный объект физически находится в базе AD, и соответственно может быть поднят из могилы восстановлен.
Процедура восстановления
В качестве примера возьмем учетную запись пользователя Ivanov Vasiliy и удалим ее. Прощай Vasiliy 🙁
Для восстановления воспользуемся утилитой LDP. LDP — это служебная программа для работы с Active Directory, немного схожая с проводником Windows. В Windows Server 2008 она включена в состав операционной системы, в Server 2003 входит в средства поддержки (Support tools) и устанавливается отдельно, с установочного диска.
Для запуска LDP нажимаем Win+R и в строке выполнить вводим ldp. Затем идем в меню Connection, выбираем пункт Connect и в открывшемся окне вводим имя контроллера домена, к которому надо подключиться. Если вы запускаете LDP на контроллере домена, то можно просто ввести localhost.
Теперь необходимо пройти проверку подлинности. Открываем меню Connection, выбираем Bind (Привязка), вводим учетные данные и жмем OK. Для работы нам понадобятся учетные данные пользователя с правами администратора домена или предприятия (только они имеют право просматривать и восстанавливать объекты в контейнере Deleted Objects).
Контейнер Deleted objects надежно скрыт от посторонних глаз, и для того, чтобы его увидеть, необходимо включить элемент управления LDAP «Возврат удаленных объектов». Для этого открываем меню Options и выбираем пункт Controls, чтобы вывести диалог элементов управления. Открываем список Load Predefined, в нем выбираем пункт Return Deleted Objects (Вернуть удаленные объекты) и нажимаем кнопку Check in. Это добавит идентификатор объекта (OID) для элемента управления «Вернуть удаленные объекты» (1.2.840.113556.1.4.417) в список активных элементов управления. Нажимаем OK, чтобы сохранить настройки элемента управления.
Затем открываем меню View, выбираем режим просмотра Tree, в поле BaseDN выбираем DC=contoso,DC=com.
Заходим в корень, раскрываем контейнер Deleted Objects и видим перечень удалённых объектов. В этом перечне находим нужный нам объект-пользователя CN=Ivanov Vasily. Кликаем правой клавишей мыши на найденом объекте и в выпадающем меню выбираем пункт Modify. Кстати, будьте готовы к тому, что в Deleted Objects очень много объектов, что может затруднить поиск.
Для восстановления объекта надо провести две операции:
1) Удалить отметку об удалении — набираем в строке Attribute: isDeleted, в поле Operation выбираем Delete и нажимаем Enter;
2) Переместить из Deleted objects в исходный контейнер — набираем в поле Attribute: distignuishedName, в поле Values пишем: CN=Ivanov Vasily, OU=Managers, DC=contoso, DC=com (это исходный DN пользователя). Исходный контейнер пользователя можно посмотреть в правом окне, он записан в атрибуте lastKnownParent. В качестве операции выбираем Replace и опять нажимаем Enter.
Далее отмечаем оба пункта Synchronous и Extended и жмём кнопку Run.
Всё! Теперь объект пользователя полностью восстановлен, в чем можно убедиться, открыв консоль Active Directory Users and Computers.
Процедура восстанавления с помощью LDP достаточно проста, если разобраться 🙂 , но очень громоздка и неудобна. Попробуем немного упростить себе жизнь и используем для восстановления утилиту командной строкиAdRestore от компании Sysinternals. Эта программа не требует установки, достаточно скопировать исполняемый файл на диск компьютера и запустить его.
AdRestore предлагает достаточно удобный и простой интерфейс командной строки для восстановления объектов Active Directory. Хотя он не очень гибок, использовать его гораздо легче, чем LDP. При запуске без параметров AdRestore выдаст список всех объектов-захоронений в контейнере Deleted Objects дефолтного домена. Для поиска конкретного объекта в качестве параметра можно использовать имя (частично или полностью) объекта, например:
adrestore ivanov
В результате этой команды будут выведены все объекты-захоронения в контейнере CN=Deleted Objects, которые содержат строку ivanov в атрибуте CN или OU — программа использует поисковый фильтр LDAP cn=*ivanov* и ou=*ivanov*. Не самый гибкий способ поиска, но в большинстве ситуаций он работает.
Если нужно не только найти объект, но и восстановить его, необходимо вместе с именем объекта указать параметр –r , вот так:
adrestore -r ivanov
Эта команда предложит восстановить каждый подходящий объект-захоронение. И еще, AdRestore всегда восстанавливает объект в контейнер, указанный в атрибуте lastKnownParent объекта-захоронения, нет никакого способа указать другой контейнер.
Ну и для тех, кому не подходят первые два варианта, есть графическая утилита ADRestore.NET. Она абсолютно бесплатна, взять ее можно здесь. ADRestore.NET позволяет производить поиск объекта по нескольким параметрам, а также дает возможность выбрать определенный контроллер домена и авторизоваться под пользователем, отличным от текущего. Пользоваться программой очень просто. Нажимаем на кнопку Enumerate Tombsones, и нам выдается список удаленных объектов. Выбираем нужный объект и жмем Restore Object. Вот и все.
Атрибуты объекта
При удалении объекта и помещении его в контейнер Deleted Objects удаляется большая часть его атрибутов. Так у объекта пользователя сохраняются только идентификаторы SID и GUID, а также LastKnownParent (контейнер, в котором находился объект до удаления) и SAMAccountName (имя учетной записи SAM). Соответственно, при возвращении объекта к жизни любым из вышеописанных способов восстановятся только эти атрибуты, все остальное придется вводить заново.
Для наглядности возьмем восстановленную нами учетную запись и попробуем ее активировать. Система тут же выдаст нам ошибку и сообщит о том, что пароль не соответствует требованиям безопасности домена. На самом деле все проще, пароль был удален вместе с другими атрибутами и теперь его просто нет.
Путем несложных манипуляций некоторые атрибуты объектов можно заставить сохраняться при удалении. Сделать это можно, внеся изменения в схему Active Directory. Скажу сразу, атрибуты уже удаленных записей это не вернет.
Для внесения изменений воспользуемся редактором ADSIEdit. Открываем его и подключаемся к разделу Schema нашей Active Directory.
Для примера возьмем атрибут Description учетной записи пользователя.
Теперь ищем нужный нам атрибут. Схема содержит огромный список атрибутов, и чтобы найти свой, как минимум нужно знать, как он называется в схеме. Имейте в виду, что названия атрибутов, которые указаны в свойствах объекта Active Directory в схеме могут различаться.
Найдя атрибут, открываем его двойным щелчком мыши и заходим в свойства. Нас интересует параметр searchFlags, который отвечает за сохранение атрибута в объекте-захоронении. У каждого атрибута он свой, в нашем случае searchFlags вообще не задан, т.е. равен 0.
Для того, чтобы заданный атрибут не удалялся, необходимо у searchFlags включить третий бит, или другими словами, выставить третий бит равным 1. Поскольку searchFlags представлен в десятичном виде, то сначала переведем его в двоичный. Получится двоичное число 0000. Биты нумеруются справа-налево, начиная с нулевого бита. Находим третий бит (он будет четвертым по счету справа) и ставим его равным 1. Получаем двоичное число 1000. Переводим его обратно и получаем 8 в десятичной системе. Ставим 8 в значении searchFlags. Если все сделано правильно, то в значении параметра появится надпись «Сохранять при удалении» (PRESERVE_ON_DELETE).
Теперь даже при удалении и восстановлении учетной записи пользователя атрибут Description будет сохранен. Однако этот способ подходит не для всех атрибутов. Так например атрибуты, описывающие членство в группах Active Directory, подобным образом сохранить невозможно. Для решения этой проблемы в Windows Server 2008 R2 появился новый инструмент под названием Active Directory Recycle Bin, или корзина Active Directory. О ней я расскажу во второй части статьи…
А у меня не выходит, ошибка на пункте «…выбираем пункт Return Deleted Objects (Вернуть удаленные объекты) и нажимаем кнопку Check in.» — Usage error, please provide Object Identifier string.
Сервер свежесозданный, пользователь свежеудаленный, тестовое все.