共用方式為


Microsoft Entra Connect:預備伺服器和災害復原

利用預備模式中的伺服器,您可以在啟用伺服器之前變更組態並預覽變更。 它也可以讓您執行完整的匯入和完整的同步處理,以在生產環境中進行這些變更之前,確認所有變更皆如預期。

預備模式

預備模式可以用於許多案例,包括:

  • 高可用性。
  • 測試和部署新的組態變更。
  • 引進新的伺服器並解除委任舊伺服器。

您可以在安裝期間選取狀態為 預備模式的伺服器。 此動作會讓伺服器啟用匯入和同步處理,但不會執行任何匯出。 預備模式中的伺服器不會執行密碼同步或密碼回寫,即使您在安裝期間選取這些功能也一樣。 當您停用預備模式時,伺服器會開始匯出、啟用密碼同步處理及啟用密碼回寫。

注意

假設您有已啟用密碼雜湊同步處理功能的 Microsoft Entra Connect。 當您啟用暫存模式時,伺服器會停止從內部部署 AD 同步處理密碼變更。 當您停用暫存模式時,伺服器會從最後停止的位置繼續同步處理密碼變更。 如果伺服器在暫存模式中停止一段較長時間,伺服器可能需要一些時間才能將期間內發生的所有密碼變更進行同步處理。

您仍然可以使用 Synchronization Service Manager 來強制執行匯出。

預備模式中的伺服器會繼續從 Active Directory 和 Microsoft Entra ID 接收變更,並在發生故障時快速接管另一部伺服器的責任。 如果您對主伺服器進行組態變更,您有責任在預備模式中對伺服器進行相同的變更。

對於具備較舊同步處理技術知識的人員,預備模式是不同的,因為伺服器有它自己的 SQL 資料庫。 此架構可讓預備模式伺服器位於不同的資料中心。

驗證伺服器的組態

若要套用此方法,請遵循下列步驟:

  1. 準備
  2. Configuration
  3. 匯入和同步處理
  4. Verify
  5. 切換作用中的伺服器

準備

  1. 安裝Microsoft Entra Connect、選取 預備模式,然後在安裝精靈的最後一頁取消選取 啟動同步處理。 此模式可讓您手動執行同步處理引擎。 此螢幕擷取畫面顯示 [Microsoft Entra Connect] 對話方塊中的 [準備設定] 頁面。
  2. 登出/登入,並從 [開始] 功能表中選取 [同步處理服務]

組態

如果您對主伺服器進行自訂變更,並想要比較組態與預備伺服器,請使用 Microsoft Entra Connect 組態檔

匯入和同步處理

  1. 選取 [連接器],並選取第一個類型為 [Active Directory Domain Services] 的連接器。 選取 [執行]、選取 [完整匯入],然後選取 [確定]。 對這種類型的所有連接器執行下列動作。
  2. 選取類型為 Microsoft Entra ID (Microsoft) 的連接器。 選取 [執行]、[完整匯入],然後選取 [確定]。
  3. 確定仍然選取 [連接器] 索引標籤。 針對類型為 Active Directory Domain Services的每個連接器,選取 [執行],選取 [差異同步處理],然後選取 [確定]。
  4. 選取類型為 Microsoft Entra ID (Microsoft) 的連接器。 選取 [執行]、選取 [差異同步處理],然後選取 [確定]。

您已經配置了 Microsoft Entra ID 和內部部署 AD 的匯出變更(如果您使用的是 Exchange 混合部署)。 接下來的步驟可讓您在實際開始匯出至目錄之前,檢查將要變更的項目。

Verify

  1. 啟動 CMD 命令提示字元並移至 %ProgramFiles%\Microsoft Azure AD Sync\bin
  2. 執行:csexport "Name of Connector" %temp%\export.xml /f:x 連接器名稱可以在同步處理服務中找到。 其名稱類似使用於 Microsoft Entra ID 的「contoso.com」。
  3. 執行:CSExportAnalyzer %temp%\export.xml > %temp%\export.csv 您在 %temp% 中有名稱為 export.csv 的檔案,可在 Microsoft Excel 中加以檢查。 此檔案包含即將匯出的所有變更。
  4. 對數據或組態進行必要的變更,然後再次執行這些步驟:匯入和同步處理和驗證,直到預期導出的變更為止。

了解 export.csv 檔案

大部分的檔案都簡單易懂。 要了解內容所需的一些縮寫:

  • OMODT – 物件修改類型。 指出在物件層級的作業是否為新增、更新或刪除。
  • AMODT – 屬性修改類型。 指出在屬性層級的作業是否為新增、更新或刪除。

擷取通用識別碼

export.csv 檔案包含即將匯出的所有變更。 每一個資料列都與連接器空間中的物件變更對應,而物件則由 DN 屬性識別。 DN 屬性是指派給連接器空間中物件的唯一識別碼。 當 export.csv 中有許多資料列/變更需要分析時,您可能很難只根據 DN 屬性來判斷變更屬於哪個物件。 為了簡化分析變更的程序,請使用 csanalyzer.ps1 PowerShell 指令碼。 此指令碼會擷取物件的通用識別碼 (例如 displayName、userPrincipalName)。 若要使用指令碼:

  1. CSAnalyzer 區段將 PowerShell 指令碼複製到名為 csanalyzer.ps1 的檔案。
  2. 開啟 PowerShell 視窗,然後瀏覽至您建立 PowerShell 指令碼的資料夾。
  3. 執行:.\csanalyzer.ps1 -xmltoimport %temp%\export.xml
  4. 您現在已有一個可在 Microsoft Excel 中檢查的名為 processedusers1.csv 的檔案。 請注意,此檔案會提供 DN 屬性與通用識別碼 (例如 displayName 和 userPrincipalName) 的對應。 它目前不包含即將導出的實際屬性變更。

切換作用中的伺服器

Microsoft Entra Connect 可以在 Active-Passive 高可用性設定中設定。 在此設定中,一部伺服器會主動推送已同步的 AD 對象變更至 Microsoft Entra ID,而被動伺服器則會暫存這些變更,以防需要接管。

注意

您無法將 Microsoft Entra Connect 設定為「主動-主動」設定。 這必須是「主動-被動」設定。 請確定只有 1 部 Microsoft Entra Connect 伺服器會主動同步處理變更。

如需設定處於預備模式的 Microsoft Entra Connect Sync 伺服器的詳細資訊,請參閱 預備模式

基於數個原因,您可能需要執行同步伺服器的故障轉移,例如升級 Microsoft Entra Connect 版本,或收到同步服務健康情況服務未收到最新資訊的警示。 在這些事件中,您可以依照下列步驟嘗試同步伺服器的故障轉移。

重要

如果不符合下列條件,將預備伺服器切換至作用中模式可能會對同步處理造成嚴重影響。 在進行這項作業之前,請務必執行初始同步處理週期,並 驗證 擱置中的匯出。

必要條件

  • 一部目前處於主動模式的 Microsoft Entra Connect Sync 伺服器
  • 一部預備中的 Microsoft Entra Connect Sync 伺服器
  • 預備伺服器已啟用同步處理排程器,且最近已與 Microsoft Entra 識別碼同步
  • 如果同步處理規則或同步範圍內有任何更新,請執行初始同步處理週期
  • 確認您的 Microsoft Entra Connect Sync 伺服器已設定為 防止意外刪除
  • 驗證 擱置中的匯出,並確認沒有重大更新,且預期會有這類更新
  • 檢查 Microsoft Entra Connect Health 入口網站中的伺服器,以檢查 Microsoft Entra Connect Health 代理程式是否已更新
  • 將目前處於主動模式的伺服器切換至預備模式,再將預備伺服器切換為主動

將目前處於主動模式的同步伺服器變更為預備模式

我們必須確定在此程序中的任何時間點,都只有一個同步伺服器會同步變更。 如果目前使用中的同步伺服器可連線,您可以執行下列步驟,將它移至預備模式。 如果無法連線,請確保伺服器或 VM 不會意外地重新取得存取權,可以透過關閉伺服器或將它與外部連線隔離來達成。

  1. 針對目前使用中的 Microsoft Entra Connect 伺服器,開啟 [Microsoft Entra Connect 精靈],然後選取 [設定預備模式],然後選取 [下一步]:

此螢幕擷取畫面顯示 [主動模式 Microsoft Entra Connect] 對話方塊中醒目提示的 [預備模式]。

  1. 您必須使用混合式身分識別系統管理員認證登入Microsoft Entra ID:

此螢幕擷取畫面顯示 [主動模式 Microsoft Entra Connect] 對話方塊中的 [登入] 提示。

  1. 勾選預備模式的方塊,然後選取 [下一步]:

此螢幕擷取畫面顯示 [主動模式 Microsoft Entra Connect] 對話方塊中的 [預備模式] 組態。

  1. Microsoft Entra Connect 伺服器會檢查已安裝的元件,然後提示您是否要在組態變更完成時啟動同步處理程式:

此螢幕擷取畫面顯示 [主動模式 Microsoft Entra Connect] 對話方塊中的 [準備設定] 畫面。

由於伺服器處於預備模式,因此不會將變更寫入至 Microsoft Entra ID,但會在其連接器空間中保留 AD 的任何變更,準備好加以寫入。 建議在過渡模式中保持伺服器的同步過程開啟,這樣如果它轉為作用中狀態,將能夠迅速接手,不需要進行大規模同步以追上範圍內Active Directory/Microsoft Entra物件的當前狀態。

  1. 選取以啟動同步處理程式並選取 [設定] 之後,Microsoft Entra Connect 伺服器會設定為預備模式。 完成後,畫面會提示您確認已啟用預備模式。 您可以選取 [結束] 以完成。

  2. 您可以使用下列命令,藉由開啟 Windows PowerShell、載入「ADSync」模組並驗證 ADSync 排程器組態,以確認伺服器已成功處於預備模式:

Import-Module ADSync
Get-ADSyncScheduler

從結果中,確認「StagingModeEnabled」設定的值。 如果伺服器已成功切換到預備模式,則此設定的值應該 True,如下列範例所示:

此螢幕擷取畫面顯示 [主動模式 Microsoft Entra Connect] 對話方塊中的 [同步處理服務] 控制台。

將目前處於預備模式的同步伺服器變更為主動模式

此時,我們所有的 Microsoft Entra Connect Sync 伺服器均應處於預備模式,且不會匯出變更。 現在,我們可以使預備同步伺服器進入主動模式,並主動同步變更。

  1. 現在前往原本處於預備模式的 Microsoft Entra Connect 伺服器,然後開啟 Microsoft Entra Connect 精靈。

選取 [設定預備模式],然後選取 [下一步]:

此螢幕擷取畫面顯示 [預備 Microsoft Entra Connect] 對話方塊中醒目提示的 [預備模式]。

精靈底部的訊息指出此伺服器處於預備模式。

  1. 登入 Microsoft Entra ID,然後前往 [預備模式] 畫面。

取消勾選暫存模式的方塊,然後選取 [下一步]。

此螢幕擷取畫面顯示 [使用中 Microsoft Entra Connect] 對話方塊中的 [預備模式] 組態。

根據此頁面上的警告,請務必確保沒有其他 Microsoft Entra Connect 伺服器正在進行同步作業。

任何時刻應該只有一部處於主動模式的 Microsoft Entra Connect Sync 伺服器。

  1. 當系統提示您啟動同步處理程式時,請勾選此方塊,然後選取 [設定]:

此螢幕擷取畫面顯示 [預備 Microsoft Entra Connect] 對話方塊中的 [準備設定] 畫面。

  1. 完成此程序之後,您應該會看到下列確認畫面,您可以在其中選取 [結束] 完成:

此螢幕擷取畫面顯示 [預備 Microsoft Entra Connect] 對話方塊中的 [確認] 畫面。

  1. 您可以開啟同步服務控制台,並檢查匯出作業是否正在執行,以確認此程式是否正常運作:

此螢幕擷取畫面顯示 [預備 Microsoft Entra Connect] 對話方塊中的 [同步服務] 控制台。

災害復原

實作設計的一部分是規劃發生災害而失去同步伺服器的情況時該怎麼做。 有不同的模型可供使用,要使用哪一個模組取決於許多因素,包括:

  • 您對停機期間無法變更 Microsoft Entra ID 中物件的容忍度如何?
  • 如果您使用密碼同步化,使用者是否接受他們在內部部署變更時必須在 Microsoft Entra ID 中使用舊密碼?
  • 您是否對即時作業有相依性,例如密碼回寫?

根據這些問題的解答和組織的原則,可實作下列其中一個策略:

  • 必要時重建。
  • 具有備用的待命伺服器,稱為「預備模式」
  • 使用虛擬機器。

如果您未使用內建的 SQL Express 資料庫,則也應該檢閱 SQL 高可用性 一節。

必要時重建

必要時規劃伺服器重建為可行的策略。 安裝同步處理引擎並執行初始匯入和同步處理,通常可以在幾個小時內完成。 如果沒有可用的備用伺服器,可以暫時使用域控制器來裝載同步處理引擎。

同步處理引擎伺服器不會儲存物件的任何狀態,因此可以從 Active Directory 中的數據重建資料庫,並Microsoft Entra ID。 sourceAnchor 屬性可用來聯結來自內部部署和雲端的物件。 如果您使用現有的內部部署與雲端物件重建伺服器,則同步處理引擎會在重新安裝時一起比對這些物件。 您需要記錄和儲存的項目是對伺服器進行的組態變更,例如篩選和同步處理規則。 這些自訂設定必須在您開始同步處理之前重新套用。

具有備用的待命伺服器 - 預備模式

如果您有更複雜的環境,則建議使用一或多個待命伺服器。 您可以在安裝期間啟用狀態為「預備模式」 的伺服器。

如需詳細資訊,請參閱預備模式

使用虛擬機器

一般和受支援的方法是在虛擬機器中執行同步處理引擎。 如果主機有問題,可將內含同步處理引擎伺服器的映像移轉到另一部伺服器。

SQL 高可用性

如果您未使用 Microsoft Entra Connect 隨附的 SQL Server Express,也應該考慮 SQL Server 的高可用性。 支援的高可用性解決方案包含 SQL 叢集和 AOA (「永遠開啟」可用性群組)。 不支援的解決方案包括鏡像。

SQL AOA 的支援已新增至 1.1.524.0 版的 Microsoft Entra Connect。 您必須先啟用 SQL AOA,才能安裝 Microsoft Entra Connect。 在安裝期間,Microsoft Entra Connect 會偵測是否已針對 SQL AOA 啟用所提供的 SQL 執行個體。 如果已啟用 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
}

下一步

概觀主題