ある日の AD トラブルと修復

ある日、AD の認証が通らない人が一部いるらしいとの情報で全ドメインコントローラ(以下「DC」)のイベントログをなめていると、とある1台のDC(仮にここで「SV01」とでもする)がフリーズしていて

NTDS (400) NTDSA: データベース d:\WINDOWS\NTDS\ntds.dit (119999 => 76737、3997797) の B-Tree (ObjectID: 11、PgnoRoot: 38) から、誤ったページ リンク (エラー -338) が検出されました。

というログを発見。もうこの段階で嫌なオーラが漂っています。

再起動すると以下のエラーログで全然回復しないどころか、起動すら途中で諦めてしまう。

システム プロセス 'C:\WINDOWS\system32\lsass.exe' は、状態コード -1073741819 で突然終了しました。システムをシャットダウンし、再起動します。

アプリケーション ポップアップ: lsass.exe - システム エラー : 次のエラーのため、セキュリティ アカウント マネージャの初期化に失敗しました: ディレクトリ サービスを開始できません。 エラー状態: 0xc00002e1 [OK] をクリックしてシステムをシャットダウンし、再起動するときにディレクトリ サービスの復元モードを選択してください。

イベントID 1168
内部エラー: Active Directory でエラーが発生しました。

追加のデータ
エラー値 (10 進):
-1018
エラー値 (16 進):
fffffc06
内部 ID:
40749

で、Active Directory 復元モードならなんとか起動可能。(当然ドメインコントローラの機能は停止している)

MS の KB830574の記載ほぼそのままの状態だった。ただし。HotFixを持ってきてもすでに適用済みの環境とのことで実行できなかった。

MS の KB258062 に従ってntdsutil files infoを実行する

が、メインデータベースC:\WINDOWS\NTDS\ntds.ditがJETで開けないため何もできず。

こんな重要なDBにJETって…。

C:\Documents and Settings\administrator>ntdsutil files integrity
ntdsutil: files
file maintenance: integrity
データベース [Current] を開いています。*** エラー: DBInitializeJetDatabase が次
のエラーで失敗しました。[ Jet エラー -1018].

ソフト回復の実行中にエラーがありました
コマンドを実行しています: C:\WINDOWS\system32\esentutl.exe /g"d:\WINDOWS\NTDS\nt
ds.dit" /o

Initiating INTEGRITY mode...
        Database: d:\WINDOWS\NTDS\ntds.dit
  Temp. Database: TEMPINTEG5952.EDB

Checking database integrity.

The database is not up-to-date. This operation may find that
this database is corrupt because data from the log files has
yet to be placed in the database.

To ensure the database is up-to-date please use the 'Recovery' operation.


                     Scanning Status (% complete)

          0    10   20   30   40   50   60   70   80   90  100
          |----|----|----|----|----|----|----|----|----|----|
          ...................................................


Integrity check completed.
Database is CORRUPTED, the last full backup of this database was on 04/23/2010 0
2:07:20


Operation terminated with error -1206 (JET_errDatabaseCorrupted, Non database fi
le or corrupted db) after 4.390 seconds.


作り出された処理終了コード 0xfffffb4a(-1206)

余談だが、最初にイベントログで B-tree というのを見ただけでエンジンがJETだと見破った人がいた。恐るべし。

これで原因はデータベース ntds.dit の破損にあることは明らかになったが、仮にDBを修復してもおかしなレコードを切り飛ばして正常な状態に戻るかどうかは不明。

(技術的には the last full backup of this database was on 04/23/2010 02:07:20 とあるものから戻るのかどうかは気になるが…。本論から外れるので省略)

SV01と直接NTDSで接続を結んでいるほかの2つのドメインコントローラSV02,SV03にはエラーはなく、間接的に接続されている残りのSV04にもエラーはないので、一旦このSV01を強制降格させて、他のドメインコントローラのDBを複製する方針に決定した。



復旧手順

【正常系】 ActiveDirectory ユーザとコンピュータ のスナップインで domain controllers コンテナの中にあるSV01を削除する。dcpromoのウイザードを呼び出すかどうか聞かれるが、「永久にオフライン」を選択して強制削除。

ActiveDirectory サイトとサービス のスナップインで Sites\Default-first-site-name\servers\SV01 で、中のオブジェクトを階層の深い方から順番に削除する。

コンピュータアカウントの時と同じくdcpromoのウイザードを呼び出すかどうか聞かれるが、「永久にオフライン」を選択して強制削除する。

【異常系】

もちろん、アクディブディレクトリ修復モードでログインしているため dcpromo は AD をバインドしていないと使えないので、KB332199 の「ドメイン コントローラが通常モードで起動しない場合」以下に掲載されている方法を行う。

レジストリエディタで HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ProductOptions の ProductType が LanmanNT になっているのを ServerNT に変更して再起動する。

これで通常起動でログオンできるようになるので、Administrator / ディレクトリ サービス復元モードのパスワードでログオンする。

レジストリエディタを起動し、
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NTDS\Parameters
に Src Root Domain Srv があれば削除する。(今回は古いサーバSV00があったので削除)

この後、もとのドメインに復帰するので、念のためSIDを変更する。ドメインから脱退して、コンピュータ名を一時的に変更し、再起動。

そしてコンピュータ名を戻して再起動し、ドメイン参加してまた再起動。

だがしかしドメインユーザでログオン不可だった。

仕方がないのでローカルadministratorでログオンした状態で、サーバの役割管理から追加のドメインコントローラをインストール。レプリカには1時間程度要した。

最終的にイベントログで
「Active Directory データベースへの更新を妨げていた問題はすべて解決しました。 Active Directory データベースへの新しい更新は継続しています。Net Logon サービスは再実行されました。」
というメッセージが出て機能回復。この時点でサーバ本体にもドメインアカウントでログオンできるようになったことを確認してほっとした。

だがしかし、復帰させたサーバを global catalog にし忘れていたことが後日判明。いろんな意味でがっかり体験でした。

戻る