Восстановление DNS на Windows Server 2008 R2

Это технический пост, который нужен мне и таким же горемыкам…

Самое простое решение для админов, столкнувшихся с проблемами АД и ДНС – это переустановка. Время, потраченное на изучение темы, исправления ошибок, иногда во много (!!!) раз больше прямой переустановки. Хоть это и не спортивно.

  • Был 2003 сервер.
  • Поставил 2008.
  • Подготовил 2003 для переноса домена с помощью adprep с диска установочного 2008 сервера.
  • Перенес домен на 2008 сервер.
  • Начал убивать 2003. Вот тут жопа и случилась. Случайно (как-то) грохнул все учетки на основном КД 2008 сервере. Восстановил с помощью копии NTDS.
  • Убил и восстановил все так через жопу, что получил следующую картинку:
    • В диспетчере сервера невозможно подключиться к DNS с ошибкой “Отказано в доступе”.
    • К DNS по коммандной строке тоже невозможно подцепиться. dnscmd /info выдает error access denied.
    • DNS пытается загрузить зону из AD, но у него не получается…
  • Мои действия такие:
    • Проверил, что все файлы целые.
    • Сделал dcdiag. Нашел ошибку:  не пройдена проверка NCSecDesc  “Ошибка – NT AUTHORITY\КОНТРОЛЛЕРЫ ДОМЕНА ПРЕДПРИЯТИЯ не имеет”.
    • Проверил adprep и выяснил, что команда adprep /rodcprep выпадает с ошибками.
    • Выполнил скрипт с повышением прав:fix.vbs DC=ForestDnsZones,DC=kaz,DC=local
      fix.vbs DC=DomainDnsZones,DC=kaz,DC=localСодержание fix.vbs:const ADS_NAME_INITTYPE_GC = 3
      const ADS_NAME_TYPE_1779 = 1
      const ADS_NAME_TYPE_CANONICAL = 2set inArgs = WScript.Arguments

      if (inArgs.Count = 1) then
      ‘ Assume the command line argument is the NDNC (in DN form) to use.
      NdncDN = inArgs(0)
      Else
      Wscript.StdOut.Write “usage: cscript fixfsmo.vbs NdncDN”
      End if

      if (NdncDN <> “”) then

      ‘ Convert the DN form of the NDNC into DNS dotted form.
      Set objTranslator = CreateObject(“NameTranslate”)
      objTranslator.Init ADS_NAME_INITTYPE_GC, “”
      objTranslator.Set ADS_NAME_TYPE_1779, NdncDN
      strDomainDNS = objTranslator.Get(ADS_NAME_TYPE_CANONICAL)
      strDomainDNS = Left(strDomainDNS, len(strDomainDNS)-1)

      Wscript.Echo “DNS name: ” & strDomainDNS

      ‘ Find a domain controller that hosts this NDNC and that is online.
      set objRootDSE = GetObject(“LDAP://” & strDomainDNS & “/RootDSE”)
      strDnsHostName = objRootDSE.Get(“dnsHostName”)
      strDsServiceName = objRootDSE.Get(“dsServiceName”)
      Wscript.Echo “Using DC ” & strDnsHostName

      ‘ Get the current infrastructure fsmo.
      strInfraDN = “CN=Infrastructure,” & NdncDN
      set objInfra = GetObject(“LDAP://” & strInfraDN)
      Wscript.Echo “infra fsmo is ” & objInfra.fsmoroleowner

      ‘ If the current fsmo holder is deleted, set the fsmo holder to this domain controller.

      if (InStr(objInfra.fsmoroleowner, “\0ADEL:”) > 0) then

      ‘ Set the fsmo holder to this domain controller.
      objInfra.Put “fSMORoleOwner”,  strDsServiceName
      objInfra.SetInfo

      ‘ Read the fsmo holder back.
      set objInfra = GetObject(“LDAP://” & strInfraDN)
      Wscript.Echo “infra fsmo changed to:” & objInfra.fsmoroleowner

      End if
      End if

    • Сделал adprep /rodcprep на 2008 без ошибок.
    • Увидел, что сыпятся ошибки: Ошибка при динамической регистрации записи DNS “_ldap._tcp.Default-First-Site._sites. и аналогичными.
    • Удалил из AD все упоминания старого 2003 сервера.

На следующий день у одного сотрудника отваливается комп. То есть он не может зайти под своей учеткой. Говорит, что контроллер домена не найден. Захожу на этот комп локальным админом и вывожу его из домена. Пытаюсь обратно завести в домен, а он мне и говорит: Вход в систему не произведен: Имя пользователя и пароль не опознаны. То есть полный пиздец.

Логично начать проверять все с начала:

  • Все еще раз перезапустить.
  • Попробовать еще раз зайти.
  • Проверить службы АД.
  • Проверить служюы ДНС.

Мое мнение: ошибка в конфигуации самой АД, вызванная моими кривыми действиями по удалению старого сервера. Из-за неправильного функционирования AD не работает и DNS, который должен зоны грузить и т.п.
Итог. AD пишет в логах: 8430 Внутренняя ошибка службы каталогов. Внутренний идентификатор: 3200db0. Ахренительно да? DNS пишет, что настроен данные о зоне получать из AD, а так как AD не отвечает, то и DNS не работает (типо пшел нах). И тут случается чудо: https://social.technet.microsoft.com/Forums/windowsserver/ru-RU/da529df2-5c50-4cce-8fc3-074da589578d/domain-2008-r2-not-work?forum=winserverDS

Quick steps:
net stop kdc
klist purge
netdom resetpwd /server:<dcname> /userD:domain\Name /passwordD:*
net start kdc

После этого машину в домен удалось вернуть и пользователь сел честно работать… Но это еще не конец. Нужно сделать резервный контроллер домена с днс, чтобы больше на грабли не наступать. На виртуалке поднимаю 2008 сервер, ставлю днс и ад, делаю dcpromo, чтобы вкрутить новый контроллер домена в мой домен. После этого соглашаюсь перенести данные с основного контроллера на новый… Жду завершения рабочего дня, чтобы все перезагрузить и посмотреть на результат.

Блять. Почему нельзя сделать так, чтобы по описанию ошибки стало сразу понятно, что случилось???? Вот этот гребанный dnscmd – ну неужели нельзя было подробнее сделать описание ошибки error_access_denied ??????????/ Это же дохуя бы времени сэкономило! Или эти записи АД о том, что он не работает… бля – ну ты хоть напиши в каком ИМЕННО месте ты не можешь что-то загрузить. Хоть повод для размышлений будет.

Собственно, после перезагрузки все заебись заработало. АД без ошибок, днс без ошибок, виртуалка с ад и днс – полная репликация без ошибок.

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

w32tm /config /computer:K-3790.kazanova.local /manualpeerlist:0.pool.ntp.org /syncfromflags:manual /update
А затем net stop w32time и net start w32time

 Продолжение от 29.12.2014

Утром звонят пользователи, что не могут на сервер терминалов зайти… говорит что домен не доступен. Захожу на сервер, вижу что контроллеры домена не доступны. Делаю net share и вижу, что папок netlogon и sysvol нет в шаре. Иду читать статью: http://support.microsoft.com/kb/290762  Но фишка в том, что если делать как в этой статье, то при простом выставлении d2 в логе появляется warning: Служба репликации файлов столкнулась с проблемами при включении репликации с. Поэтому делаю так:
– остановил службы ntfrs на обеих контроллерах;
– на основном контроллере в реестре HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\NtFrs\Parameters\Backup/Restore\Process at Startup прописал d2, а на вспомогательном d4;
– запустил службу на основном и на вспомогательном;
– в оснастке Журналы Windows -> Служба репликации файлов увидел заветные коды событий – 13565 – начало восстановления, 13516 – успешное завершение восстановления;
– убедился, что клиенты могут зайти на сервер.

2 thoughts on “Восстановление DNS на Windows Server 2008 R2

  1. Pingback: NTDS (820) NTDSA: База данных C:WindowsNTDSntds.dit: индекс INDEX_00020078 таблицы datatable поврежден (0). | OG

  2. Alexey Kazantsev

    Приветствую, Николай!
    Спасибо, очень выручил.
    Но вот здесь – “на основном контроллере в реестре HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\NtFrs\Parameters\Backup/Restore\Process at Startup прописал d2, а на вспомогательном d4;” не следует ли на основном прописать d4, а на вспомогательном d2?

Comments are closed.