Microsoft Entra Connect: ステージング サーバーとディザスター リカバリー
ステージング モードのサーバーでは、構成を変更した後、そのサーバーをアクティブにする前に変更内容をプレビューできます。 また、フル インポートおよび完全同期を実行して、変更を運用環境に加える前に、すべての変更が予定どおりに加えられていることを確認できます。
ステージング モード
ステージング モードは、次のシナリオを含むいくつかのシナリオに使用できます。
- 高可用性:
- 新しい構成の変更をテストおよびデプロイする。
- 新しいサーバーを導入し、古いサーバーの使用を中止する。
インストール時、サーバーを ステージング モードに設定することを選択できます。 この操作により、サーバーでインポートと同期がアクティブになりますが、エクスポートは一切実行されません。 ステージング モードのサーバーでは、インストール中にこれらの機能を選択した場合でも、パスワード同期またはパスワード ライトバックが実行されていません。 ステージング モードを無効にすると、サーバーはエクスポートを開始し、パスワード同期とパスワード ライトバックが有効になります。
Note
たとえば、Microsoft Entra Connect でパスワード ハッシュ同期機能が有効であるとします。 ステージング モードを有効にすると、サーバーはオンプレミス AD からのパスワード変更の同期を停止します。 ステージング モードを無効にすると、サーバーは停止されたところからパスワード変更の同期を再開します。 サーバーが一定時間ステージング モードになると、サーバーはその間に発生していたすべてのパスワードの変更を同期するため、時間がかかることがあります。
同期サービス マネージャーを使用して、引き続き強制的にエクスポートすることもできます。
ステージング モードのサーバーは Active Directory と Microsoft Entra ID から変更を受信し続け、障害発生時に別のサーバーの役割を迅速に引き継ぐことができます。 プライマリ サーバーに構成を変更する場合は、ステージング モードでサーバーに同じ変更を加える必要があります。
従来の同期テクノロジの知識を持つ管理者にとっては、サーバーが独自の SQL Database を持つ点で、ステージング モードは異なるテクノロジに思えることでしょう。 このアーキテクチャにより、ステージング モードのサーバーを別のデータ センターに配置できます。
サーバーの構成の確認
この方法を適用するには、次の手順に従います。
準備
- Microsoft Entra Connect をインストールし、[ステージング モード] を選択します。インストール ウィザードの最後のページで、[同期の開始] を選択解除します。 このモードにより、同期エンジンを手動で実行することができます。
- いったんサインオフし、サインインし直してから、[スタート] メニューの [Synchronization Service (同期サービス)] を選択します。
構成
プライマリ サーバーにカスタム変更を加え、構成をステージング サーバーと比較する場合は、Microsoft Entra Connect 構成ドキュメント を使用します。
インポートおよび同期
- [コネクタ] を選択します。種類が "Active Directory Domain Services" の 1 つ目のコネクタを選択します。 [実行] を選択し、[フル インポート] を選択し、[OK] を選択します。 この種類のすべてのコネクタに対して、これらの手順を繰り返します。
- 種類が Microsoft Entra ID (Microsoft) のコネクタを選択します。 [実行]、[フル インポート]、[OK] の順に選択します。
- [Connectors (コネクタ)] タブが選択されたままであることを確認します。 種類が Active Directory Domain Services の各コネクタに対し、[実行]、[差分同期]、[OK] の順に選択します。
- 種類が Microsoft Entra ID (Microsoft) のコネクタを選択します。 [実行] を選択し、[差分同期] を選択し、[OK] を選択します。
Microsoft Entra ID とオンプレミス AD へのエクスポートの変更をステージングしました (Exchange ハイブリッド展開を使用している場合)。 次の手順では、実際にディレクトリへのエクスポートを開始する前に、変更される内容を確認できます。
Verify (英語の可能性あり)
- コマンド プロンプトを起動し、
%ProgramFiles%\Microsoft Azure AD Sync\bin
に移動します。 - 次のコマンドを実行します。
csexport "Name of Connector" %temp%\export.xml /f:x
同期サービスにコネクタの名前があることを確認できます。 Microsoft Entra ID に "contoso.com – Microsoft Entra ID" に似た名前が付けられます。 - 次のコマンドを実行します。
CSExportAnalyzer %temp%\export.xml > %temp%\export.csv
%temp% に export.csv という名前のファイルが生成されます。このファイルは、Microsoft Excel で開くことができます。 このファイルには、エクスポートの対象となるすべての変更が含まれています。 - データまたは構成に必要な変更を加え、エクスポートされた変更が予期されるまで、インポートと同期と検証の手順をもう一度実行します。
export.csv ファイルを理解する
ファイルのほとんどの部分は、一目瞭然です。 内容の理解に役立つ省略形のいくつかを次に示します。
- OMODT - オブジェクトの変更の種類。 オブジェクト レベルでの操作が追加、更新、または削除のいずれかであるかを示します。
- AMODT - 属性の変更の種類。 属性レベルでの操作が追加、更新、または削除のいずれかであるかを示します。
共通識別子を取得する
export.csv ファイルには、エクスポートの対象となるすべての変更が含まれています。 各行はコネクタ スペースのオブジェクトの変更に対応しており、オブジェクトは DN 属性で識別されます。 DN 属性は、コネクタ スペースのオブジェクトに割り当てられている一意識別子です。 export.csv に分析対象となる行/変更が多数含まれていると、DN 属性だけに基づいて、変更が行われたオブジェクトを特定するのは難しい場合があります。 変更の分析プロセスを簡素化するには、csanalyzer.ps1
PowerShell スクリプトを使用します。 このスクリプトは、オブジェクトの共通識別子 (displayName、userPrincipalName など) を取得します。 このスクリプトを使用するには、次の手順に従います。
- セクション CSAnalyzer から
csanalyzer.ps1
という名前のファイルに PowerShell スクリプトをコピーします。 - PowerShell ウィンドウを開き、PowerShell スクリプトを作成したフォルダーを参照します。
.\csanalyzer.ps1 -xmltoimport %temp%\export.xml
を実行します。- processedusers1.csv という名前のファイルが生成されます。このファイルは、Microsoft Excel で開くことができます。 このファイルには、DN 属性から共通識別子 (displayName、userPrincipalName など) へのマッピングが示されています。 現時点では、エクスポートの対象となる実際の属性変更は含まれていません。
アクティブなサーバーの切り替え
Microsoft Entra Connect は、Active-Passive の高可用性セットアップで設定できます。 このセットアップでは、1 つのサーバーが同期された AD オブジェクトに対する変更を Microsoft Entra ID にアクティブにプッシュし、パッシブ サーバーは、これらの変更を引き継ぐ必要がある場合に備えてステージングします。
Note
アクティブ/アクティブ セットアップで Microsoft Entra Connect を設定することはできません。 アクティブ/パッシブである必要があります。 変更をアクティブに同期する Microsoft Entra Connect サーバーが 1 つのみであることを確認します。
ステージング モードで Microsoft Entra Connect 同期サーバーを設定する方法の詳細については、「ステージング モード」を参照してください。
Microsoft Entra Connect のバージョンのアップグレードや、同期サービスの正常性サービスが最新の情報を受信していないというアラートの受信など、いくつかの理由で同期サーバーのフェールオーバーを実行することが必要になる場合があります。 これらのイベントでは、次の手順に従って同期サーバーのフェールオーバーを試みることができます。
重要
ステージング サーバーをアクティブ モードに切り替えると、次の条件が満たされない場合、同期に重大な影響を与える可能性があります。 予防措置として、常に初期同期サイクルを実行し、保留中のエクスポートを確認してから、この操作を実行します。
前提条件
- 現在アクティブな Microsoft Entra Connect 同期サーバー 1 台
- Microsoft Entra Connect 同期サーバーの 1 つのステージング
- ステージング サーバーで同期スケジューラが有効になっており、最近 Microsoft Entra ID と同期されました
- 同期規則または同期スコープで更新が行われた場合は、最初の同期サイクルを実行します
- 誤削除を防止するために Microsoft Entra Connect 同期サーバーが構成されていることを確認します
- 保留中のエクスポートを確認し、重要な更新がないこと、およびこのような更新が予想されることを確認します
- Microsoft Entra Connect Health エージェントでサーバーを確認することで Microsoft Entra Connect Health ポータルが更新されているかどうかを確認します
- 現在のアクティブ サーバーをステージング モードに切り替えてから、ステージング サーバーをアクティブに切り替えます
現在アクティブな同期サーバーをステージング モードに変更する
このプロセスでは、常に 1 つの同期サーバーだけが変更を同期していることを確認する必要があります。 現在アクティブな同期サーバーに到達できる場合は、次の手順を実行してステージング モードに移動できます。 到達できない場合は、サーバーをシャットダウンするか、送信接続から分離することで、サーバーまたは VM が予期せずアクセスを回復しないようにします。
- 現在アクティブな Microsoft Entra Connect サーバーの場合は、Microsoft Entra Connect ウィザードを開き、[ステージング モードの構成] を選択し、[次へ] を選択します。
- ハイブリッド ID 管理者の資格情報を使用して Microsoft Entra ID にサインインする必要があります。
- ステージング モードのチェック ボックスをオンにし、[次へ] を選択します。
- Microsoft Entra Connect サーバーでインストール済みコンポーネントが確認され、その後、構成の変更が完了したときに同期プロセスを開始するかどうかを確認するプロンプトが表示されます。
サーバーはステージング モードであるため、Microsoft Entra ID への変更は書き込まれませんが、AD への変更はコネクタ スペースで保持され、あとで書き込めます。 ステージング モードでサーバーの同期プロセスをオンのままにしておくことをお勧めします。そのため、アクティブになるとすぐに引き継ぎ、スコープ内の Active Directory/Microsoft Entra オブジェクトの現在の状態に追いつくために大規模な同期を行う必要はありません。
同期プロセスの開始を選択し、[構成] を選択すると、Microsoft Entra Connect サーバーがステージング モードに構成されます。 完了すると、ステージング モードが有効になっていることを確認する画面が表示されます。 [終了] を選択して完了できます。
サーバーが正常にステージング モードになっていることを確認するには、Windows PowerShell を開き、次の各コマンドを使用して、"ADSync" モジュールを読み込み、ADSync スケジューラの構成を確認します。
Import-Module ADSync
Get-ADSyncScheduler
結果から、"StagingModeEnabled" 設定の値を確認します。 サーバーがステージング モードに正常に切り替えられた場合、この設定の値は次の例のように true
現在のステージング同期サーバーをアクティブ モードに変更する
この時点で、すべての Microsoft Entra Connect 同期サーバーはステージング モードであり、変更はエクスポートされていないはずです。 次は、ステージング同期サーバーをアクティブ モードに移行し、変更をアクティブに同期するようにします。
- 元々ステージング モードだった Microsoft Entra Connect サーバーに移動し、Microsoft Entra Connect ウィザードを開きます。
[ステージング モードの構成] を選択し、[次へ] を選択します。
ウィザードの下部にあるメッセージは、このサーバーがステージング モードであることを示しています。
- Microsoft Entra ID にサインインし、[ステージング モード] 画面に移動します。
ステージング モードのボックスをオフにし、[次へ] を選択します。
このページの警告に従って、他の Microsoft Entra Connect サーバーがアクティブに同期されていないことを確認することが重要です。
アクティブな Microsoft Entra Connect 同期サーバーは、常に 1 つだけであるべきです。
- 同期プロセスを開始するように求められたら、このボックスにチェックを入れ、[構成] を選択します。
- プロセスが完了すると、次の確認画面が表示され、[終了] を選択して完了できます。
- 同期サービス コンソールを開き、エクスポート ジョブが実行されているかどうかを確認すると、このプロセスが機能していることが分かります。
障害復旧
実装の設計には、同期サーバーを喪失するという障害発生時の対処方法を計画することが含まれます。 モデルにはさまざまなものがあり、どのモデルを使用するかは、次の要素を含むいくつかの要素に依存します。
- ダウンタイム中に Microsoft Entra ID のオブジェクトを変更できないことに関してどれだけ許容できますか?
- パスワード同期を使用する場合、オンプレミスでパスワードを変更する場合に備えて Microsoft Entra ID で古いパスワードを使用することが求められることについてユーザーの同意が得られますか?
- パスワード ライトバックなどのリアルタイムの操作に依存していますか?
これらの質問の回答と組織のポリシーに応じて、次の戦略のいずれかを実装することができます。
- 必要に応じて再構築する。
- 予備のスタンバイ サーバーを用意する (" ステージング モード" と呼ばれます)。
- 仮想マシンを使用する。
組み込みの SQL Express データベースを使用しない場合は、SQL 高可用性セクションも確認してください。
必要に応じて再構築する
実行可能な戦略は、必要に応じてサーバーの再構築を計画することです。 通常、同期エンジンのインストールと最初のインポートおよび同期操作は、数時間以内に完了します。 使用可能な予備のサーバーがない場合は、ドメイン コントローラーを一時的に使用して同期エンジンをホストできます。
オブジェクトに関する状態は同期エンジン サーバーには保存されないため、Active Directory と Microsoft Entra ID 内のデータからデータベースを再構築することができます。 sourceAnchor 属性は、オンプレミスとクラウドからのオブジェクトを結合するために使用されます。 オンプレミスとクラウドの既存のオブジェクトを使ってサーバーを再構築する場合、同期エンジンは、再インストール時にこれらのオブジェクトをもう一度まとめて適合させます。 ドキュメント化して保存する必要があることは、フィルター規則、同期規則など、サーバーに行った構成の変更です。 同期を開始する前に、これらのカスタム構成を再適用する必要があります。
予備のスタンバイ サーバーを用意する - ステージング モード
環境がより複雑な場合は、1 つまたは複数のスタンバイ サーバーを持つことをお勧めします。 インストール時、サーバーを ステージング モードに設定できます。
詳しくは、「ステージング モード」をご覧ください。
仮想マシンを使用する
一般的なサポートされている方法は、仮想マシンで同期エンジンを実行する方法です。 ホストに問題が発生した場合、同期エンジン サーバーを含むイメージを別のサーバーに移行できます。
SQL 高可用性
Microsoft Entra Connect に付属している SQL Server Express を使用しない場合は、SQL Server の高可用性も考慮する必要があります。 サポートされている高可用性ソリューションには、SQL クラスタリングおよび AOA (Always On 可用性グループ) が含まれます。 サポートされていないソリューションには、ミラーリングがあります。
SQL AOA のサポートが、Microsoft Entra Connect のバージョン 1.1.524.0 に追加されました。 Microsoft Entra Connect をインストールする前に SQL AOA を有効にする必要があります。 インストール中、指定された SQL インスタンスで SQL AOA が有効であるかどうかが Microsoft Entra Connect によって検出されます。 SQL AOA が有効である場合、Microsoft Entra Connect はさらに、SQL AOA が、同期レプリケーションまたは非同期レプリケーションを使用するように構成されているかどうかを調べます。 可用性グループ リスナーを設定する場合、RegisterAllProvidersIP プロパティを 0 に設定する必要があります。 Microsoft Entra Connect は現在、SQL Native Client を使用して SQL に接続していますが、SQL Native Client は、MultiSubNetFailover プロパティの使用をサポートしていません。
付録 CSAnalyzer
このスクリプトの使い方については、「確認」をご覧ください。
Param(
[Parameter(Mandatory=$true, HelpMessage="Must be a file generated using csexport 'Name of Connector' export.xml /f:x)")]
[string]$xmltoimport="%temp%\exportedStage1a.xml",
[Parameter(Mandatory=$false, HelpMessage="Maximum number of users per output file")][int]$batchsize=1000,
[Parameter(Mandatory=$false, HelpMessage="Show console output")][bool]$showOutput=$false
)
#LINQ isn't loaded automatically, so force it
[Reflection.Assembly]::Load("System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089") | Out-Null
[int]$count=1
[int]$outputfilecount=1
[array]$objOutputUsers=@()
#XML must be generated using "csexport "Name of Connector" export.xml /f:x"
write-host "Importing XML" -ForegroundColor Yellow
#XmlReader.Create won't properly resolve the file location,
#so expand and then resolve it
$resolvedXMLtoimport=Resolve-Path -Path ([Environment]::ExpandEnvironmentVariables($xmltoimport))
#use an XmlReader to deal with even large files
$result=$reader = [System.Xml.XmlReader]::Create($resolvedXMLtoimport)
$result=$reader.ReadToDescendant('cs-object')
if($result)
{
do
{
#create the object placeholder
#adding them up here means we can enforce consistency
$objOutputUser=New-Object psobject
Add-Member -InputObject $objOutputUser -MemberType NoteProperty -Name ID -Value ""
Add-Member -InputObject $objOutputUser -MemberType NoteProperty -Name Type -Value ""
Add-Member -inputobject $objOutputUser -MemberType NoteProperty -Name DN -Value ""
Add-Member -inputobject $objOutputUser -MemberType NoteProperty -Name operation -Value ""
Add-Member -inputobject $objOutputUser -MemberType NoteProperty -Name UPN -Value ""
Add-Member -inputobject $objOutputUser -MemberType NoteProperty -Name displayName -Value ""
Add-Member -inputobject $objOutputUser -MemberType NoteProperty -Name sourceAnchor -Value ""
Add-Member -inputobject $objOutputUser -MemberType NoteProperty -Name alias -Value ""
Add-Member -inputobject $objOutputUser -MemberType NoteProperty -Name primarySMTP -Value ""
Add-Member -inputobject $objOutputUser -MemberType NoteProperty -Name onPremisesSamAccountName -Value ""
Add-Member -inputobject $objOutputUser -MemberType NoteProperty -Name mail -Value ""
$user = [System.Xml.Linq.XElement]::ReadFrom($reader)
if ($showOutput) {Write-Host Found an exported object... -ForegroundColor Green}
#object id
$outID=$user.Attribute('id').Value
if ($showOutput) {Write-Host ID: $outID}
$objOutputUser.ID=$outID
#object type
$outType=$user.Attribute('object-type').Value
if ($showOutput) {Write-Host Type: $outType}
$objOutputUser.Type=$outType
#dn
$outDN= $user.Element('unapplied-export').Element('delta').Attribute('dn').Value
if ($showOutput) {Write-Host DN: $outDN}
$objOutputUser.DN=$outDN
#operation
$outOperation= $user.Element('unapplied-export').Element('delta').Attribute('operation').Value
if ($showOutput) {Write-Host Operation: $outOperation}
$objOutputUser.operation=$outOperation
#now that we have the basics, go get the details
foreach ($attr in $user.Element('unapplied-export-hologram').Element('entry').Elements("attr"))
{
$attrvalue=$attr.Attribute('name').Value
$internalvalue= $attr.Element('value').Value
switch ($attrvalue)
{
"userPrincipalName"
{
if ($showOutput) {Write-Host UPN: $internalvalue}
$objOutputUser.UPN=$internalvalue
}
"displayName"
{
if ($showOutput) {Write-Host displayName: $internalvalue}
$objOutputUser.displayName=$internalvalue
}
"sourceAnchor"
{
if ($showOutput) {Write-Host sourceAnchor: $internalvalue}
$objOutputUser.sourceAnchor=$internalvalue
}
"alias"
{
if ($showOutput) {Write-Host alias: $internalvalue}
$objOutputUser.alias=$internalvalue
}
"proxyAddresses"
{
if ($showOutput) {Write-Host primarySMTP: ($internalvalue -replace "SMTP:","")}
$objOutputUser.primarySMTP=$internalvalue -replace "SMTP:",""
}
}
}
$objOutputUsers += $objOutputUser
Write-Progress -activity "Processing ${xmltoimport} in batches of ${batchsize}" -status "Batch ${outputfilecount}: " -percentComplete (($objOutputUsers.Count / $batchsize) * 100)
#every so often, dump the processed users in case we blow up somewhere
if ($count % $batchsize -eq 0)
{
Write-Host Hit the maximum users processed without completion... -ForegroundColor Yellow
#export the collection of users as a CSV
Write-Host Writing processedusers${outputfilecount}.csv -ForegroundColor Yellow
$objOutputUsers | Export-Csv -path processedusers${outputfilecount}.csv -NoTypeInformation
#increment the output file counter
$outputfilecount+=1
#reset the collection and the user counter
$objOutputUsers = $null
$count=0
}
$count+=1
#need to bail out of the loop if no more users to process
if ($reader.NodeType -eq [System.Xml.XmlNodeType]::EndElement)
{
break
}
} while ($reader.Read)
#need to write out any users that didn't get picked up in a batch of 1000
#export the collection of users as CSV
Write-Host Writing processedusers${outputfilecount}.csv -ForegroundColor Yellow
$objOutputUsers | Export-Csv -path processedusers${outputfilecount}.csv -NoTypeInformation
}
else
{
Write-Host "Imported XML file is empty. No work to do." -ForegroundColor Red
}
次のステップ
概要トピック