Windows Server 2008 で "Adprep /rodcprep" コマンドを実行すると、エラー メッセージ "Adprep は、パーティション DC=DomainDnsZones,DC=Contoso,DC=com のレプリカに接続できませんでした" が表示される


現象


Windows Server 2008 で Adprep /rodcprep コマンドを実行すると、次のエラー メッセージが表示されます。
Adprep は、パーティション DC=DomainDnsZones,DC=Contoso,DC=com のレプリカに接続できませんでした。

Adprep は、パーティション DC=DomainDnsZones,DC=Contoso,DC=com に対する操作に失敗しました。スキップして、次のパーティションに進みます。



Adprep は、パーティション DC=ForestDnsZones,DC=Contoso,DC=com のレプリカに接続できませんでした。

Adprep で LDAP エラーが発生しました。エラー コード: 0x0。サーバーの拡張エラー コード: 0x0、サーバーのエラー メッセージ: (null)。



Adprep は、パーティション C=ForestDnsZones,DC=Contoso,DC=com に対する操作に失敗しました。スキップして、次のパーティションに進みます。

Adprep は終了しましたが、エラーがありました。一部のパーティションが更新されていません。

原因


この問題が発生するのは、Adprep /rodcprep コマンドが、フォレストの各アプリケーション パーティションのインフラストラクチャ マスターに接続しようとするときです。コマンドはこの処理を行い、読み取り専用ドメイン コントローラー (RODC) レプリケーションに必要なアクセス許可を設定します。次の条件のいずれかに該当する場合、Adprep /rodcprep コマンドは失敗します。
  • エラー メッセージで参照されているパーティション (複数の場合あり) が存在しない。
  • 参照されているパーティション (複数の場合あり) のインフラストラクチャ マスターが強制的に降格されているかオフラインである。

解決方法


パーティションが存在しない場合にこの問題を解決するには、Dsmgmt ツールの "remove nc" パラメーターを使用して、孤立したパーティションのメタデータ クリーンアップを実行します。詳細については、以下のマイクロソフト Web サイトを参照してください。

指定されているパーティションが存在する場合は、パーティションのオンラインであるインフラストラクチャの役割所有者を指定します。これを行うには、「詳細」に記載されているように、オブジェクト上の fSMORoleOwner 属性を手動で変更します。

詳細


次のサンプル スクリプトでは、指定された、ドメインでない名前付けコンテキスト (NDNC) のインフラストラクチャ オブジェクト上の fSMORoleOwner 属性がアクティブまたは接続可能なサーバーに変更されます。このサンプル内の NDNC は、DomainDnsZones,DC=contoso,DC=com NDNC 名前付けコンテキストです。スクリプトでは次のコマンドを使用します。
cscript fixfsmo.vbs DC=DomainDnsZones,DC=contoso,DC=com
-------fixfsmo.vbs------------------
const ADS_NAME_INITTYPE_GC = 3
const ADS_NAME_TYPE_1779 = 1
const ADS_NAME_TYPE_CANONICAL = 2

set inArgs = WScript.Arguments

if (inArgs.Count = 1) then
' コマンド ラインの引数は、使用する NDNC (DN 形式) であるとします。
NdncDN = inArgs(0)
Else
Wscript.StdOut.Write "usage:cscript fixfsmo.vbs NdncDN"
End if

if (NdncDN <> "") then

' NDNC の DN 形式を DNS ドット形式に変換します。
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

' この NDNC をホストし、オンラインであるドメイン コントローラーを検索します。
set objRootDSE = GetObject("LDAP://" & strDomainDNS & "/RootDSE")
strDnsHostName = objRootDSE.Get("dnsHostName")
strDsServiceName = objRootDSE.Get("dsServiceName")
Wscript.Echo "Using DC " & strDnsHostName

' 現在のインフラストラクチャ FSMO を取得します。
strInfraDN = "CN=Infrastructure," & NdncDN
set objInfra = GetObject("LDAP://" & strInfraDN)
Wscript.Echo "infra fsmo is " & objInfra.fsmoroleowner

' 現在の FSMO 所有者が削除されている場合、FSMO 所有者をこのドメイン コントローラーに設定します。

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

' FSMO 所有者をこのドメイン コントローラーに設定します。
objInfra.Put "fSMORoleOwner", strDsServiceName
objInfra.SetInfo

' FSMO 所有者をリード バックします。
set objInfra = GetObject("LDAP://" & strInfraDN)
Wscript.Echo "infra fsmo changed to:"& objInfra.fsmoroleowner

End if

End if
パーティションのインフラストラクチャ マスターを確認するには、対象の名前付けコンテキスト ルートの下にあるインフラストラクチャ オブジェクト上の fSMORoleOwner 属性を照会します。たとえば、DC=DomainDnsZones,DC=contoso,DC=com パーティションのインフラストラクチャ マスターを確認するには、CN=Infrastructure,DC=DomainDnsZones,DC=contoso,DC=com 名前付けコンテキスト ルート上の fSMORoleOwner 属性を照会します。同様に、DC=ForestDnsZones,DC=contoso,DC=com パーティションのインフラストラクチャ マスターを確認するには、CN=Infrastructure,DC=ForestDnsZones,DC=contoso,DC=com 名前付けコンテキスト ルート上の fSMORoleOwner 属性を照会します。



このような照会を実行するには、LDP ツール、Active Directory Service Interfaces (ADSI) 編集ツール、ldifde ツールなどのツールを使用することができます。たとえば、次のような照会では Idifde ツールを使用します。
ldifde -f Infra_DomainDNSZones.ldf -d "CN=Infrastructure,DC=DomainDnsZones,DC=contoso,DC=com" -l fSMORoleOwner
この照会により、DC=DomainDnsZones,DC=contoso,DC=com パーティションのインフラストラクチャ マスターの役割所有者が Infra_DomainDNSZones.ldf ファイルに返されます。

注:: フォレストに悪影響を及ぼすことなく、Adprep /rodcprep コマンドを複数回実行することができます。rodcprep コマンドの以前の実行で完了した処理は繰り返されません。

孤立した環境で rodcprep コマンドを実行しようとする場合、処理が成功するためには、各ドメインおよび各アプリケーション ディレクトリ パーティションのインフラストラクチャ マスターがその環境の内部で使用できる必要があります。