使用 Azure PowerShell 來備份和還原 Azure VM

本文說明如何使用 PowerShell Cmdlet,在 Azure 備份 復原服務保存庫中備份和還原 Azure VM。

Azure 備份提供獨立且隔離的備份,以防止 VM 上意外的資料毀損。 備份會儲存於復原服務保存庫中,其具有內建的復原點管理功能。 設定及擴縮很簡單,備份已最佳化,而且您可以視需要輕鬆地還原。

在備份 (或保護) 虛擬機器之前,您必須完成必要條件來備妥保護 VM 的環境。

在您開始使用 Intune 之前

  • 深入了解復原服務保存庫。
  • 檢閱 Azure VM 的備份架構,深入了解備份流程,並檢閱支援、限制和必要條件。
  • 檢閱復原服務的 PowerShell 物件階層。

復原服務物件階層

下圖摘要說明物件階層。

Disgram shows the Recovery Services object hierarchy.

檢閱 Azure 程式庫中的 Az.RecoveryServices Cmdlet 參考

設定並註冊

注意

建議您使用 Azure Az PowerShell 模組來與 Azure 互動。 請參閱安裝 Azure PowerShell 以開始使用。 若要了解如何移轉至 Az PowerShell 模組,請參閱將 Azure PowerShell 從 AzureRM 移轉至 Az

若要開始:

  1. 下載最新版的 PowerShell

  2. 輸入下列命令,以找到可用的 Azure 備份 PowerShell Cmdlet:

    Get-Command *azrecoveryservices*
    

    將顯示 Azure備份、Azure Site Recovery 與復原服務保存庫的別名與 Cmdlet。 下圖是您將看到的範例。 這並非 Cmdlet 的完整清單。

    Screenshot shows the list of Recovery Services.

  3. 使用 Connect-AzAccount 登入您的 Azure 帳戶。 此 Cmdlet 會開啟網頁,提示您輸入帳戶認證:

    • 或者,您可以使用 -Credential 參數,以參數形式將您的帳戶認證加入 Connect-AzAccount Cmdlet。
    • 如果您是代表租用戶工作的 CSP 合作夥伴,請使用其租用戶識別碼或租用戶主要網域名稱,將客戶指定為租用戶。 例如:Connect-AzAccount -Tenant "fabrikam.com"
  4. 由於一個帳戶可以有多個訂用帳戶,因此您必須將要使用的訂用帳戶與帳戶建立關聯:

    Select-AzSubscription -SubscriptionName $SubscriptionName
    
  5. 若您是第一次使用 Azure 備份,則必須使用 Register-AzResourceProvider Cmdlet,透過您的訂用帳戶註冊 Azure 復原服務提供者。

    Register-AzResourceProvider -ProviderNamespace "Microsoft.RecoveryServices"
    
  6. 您可以使用下列命令,確認提供者已成功註冊:

    Get-AzResourceProvider -ProviderNamespace "Microsoft.RecoveryServices"
    

    在命令輸出中,RegistrationState 應該變更為 Registered。 如果不是,只要再次執行 Register-AzResourceProvider Cmdlet 即可。

建立復原服務保存庫

下列步驟將引導您完成建立復原服務保存庫。 復原服務保存庫不同於備份保存庫。

  1. 復原服務保存庫是一項 Resource Manager 資源,因此您必須將它放在資源群組內。 您可以使用現有的資源群組,或使用 New-AzResourceGroup Cmdlet 建立資源群組。 建立資源群組時,請指定資源群組的名稱與位置。

    New-AzResourceGroup -Name "test-rg" -Location "West US"
    
  2. 使用 New-AzRecoveryServicesVault Cmdlet 來建立復原服務保存庫。 請務必為保存庫指定與用於資源群組相同的位置。

    New-AzRecoveryServicesVault -Name "testvault" -ResourceGroupName "test-rg" -Location "West US"
    
  3. 指定要使用的儲存空間備援類型。 您可以使用本地備援儲存體 (LRS)異地備援儲存體 (GRS)區域備援儲存體 (ZRS)。 下列範例顯示 testvault-BackupStorageRedundancy 選項設定為 GeoRedundant 的情形。

    $vault1 = Get-AzRecoveryServicesVault -Name "testvault"
    Set-AzRecoveryServicesBackupProperty  -Vault $vault1 -BackupStorageRedundancy GeoRedundant
    

    提示

    許多 Azure 備份 Cmdlet 都需要將復原服務保存庫物件當做輸入。 基於這個理由,將備份復原服務保存庫物件儲存在變數中會是方便的做法。

在訂用帳戶中檢視保存庫

若要檢視訂用帳戶中的所有保存庫,請使用 Get-AzRecoveryServicesVault

Get-AzRecoveryServicesVault

輸出會類似下列的範例,請注意,會提供相關聯的 ResourceGroupName 與位置。

Name              : Contoso-vault
ID                : /subscriptions/1234
Type              : Microsoft.RecoveryServices/vaults
Location          : WestUS
ResourceGroupName : Contoso-docs-rg
SubscriptionId    : 1234-567f-8910-abc
Properties        : Microsoft.Azure.Commands.RecoveryServices.ARSVaultProperties

備份 Azure VM

使用復原服務保存庫來保護您的虛擬機器。 在您套用保護之前,請設定保存庫內容 (保存庫中所保護的資料類型),並確認保護原則。 保護原則是備份工作何時執行,以及每個備份快照之保留時間長度的排程。

設定保存庫內容

在 VM 上啟用保護之前,請使用 Set-AzRecoveryServicesVaultContext 來設定保存庫內容。 保存庫內容設定之後就會套用至所有後續的 Cmdlet。 下列範例會設定保存庫 testvault 的保存庫內容。

Get-AzRecoveryServicesVault -Name "testvault" -ResourceGroupName "Contoso-docs-rg" | Set-AzRecoveryServicesVaultContext

擷取保存庫識別碼

我們計畫根據 Azure PowerShell 指導方針來淘汰保存庫內容設定。 您可以改為儲存或擷取保存庫識別碼,並將其傳遞至相關命令。 如果您尚未設定保存庫內容,或您想要指定要針對特定保存庫執行的命令,請將保存庫識別碼以 "-vaultID" 格式傳遞給所有相關的命令,如下所示:

$targetVault = Get-AzRecoveryServicesVault -ResourceGroupName "Contoso-docs-rg" -Name "testvault"
$targetVault.ID

Or

$targetVaultID = Get-AzRecoveryServicesVault -ResourceGroupName "Contoso-docs-rg" -Name "testvault" | select -ExpandProperty ID

修改儲存體複寫設定

使用 Set-AzRecoveryServicesBackupProperty 命令將保存庫的儲存體複寫設定設定為 LRS/GRS

Set-AzRecoveryServicesBackupProperty -Vault $targetVault -BackupStorageRedundancy GeoRedundant/LocallyRedundant

注意

只有當保存庫中沒有受保護的備份項目時,才可以修改儲存體備援。

建立保護原則

當您建立復原服務保存庫時,它會隨附預設的保護和保留原則。 預設保護原則會在每天的指定時間觸發備份作業。 預設保留原則會將每日復原點保留 30 天。 您可以使用預設原則來快速地保護 VM,並在之後編輯原則的各種詳細資料。

使用 Get-AzRecoveryServicesBackupProtectionPolicy 來檢視保存庫中可用的保護原則。 您可以使用此 Cmdlet 來取得特定的原則,或檢視與工作負載類型相關聯的原則。 下列範例會取得工作負載類型 AzureVM 的原則。

Get-AzRecoveryServicesBackupProtectionPolicy -WorkloadType "AzureVM" -VaultId $targetVault.ID

輸出類似於下列範例:

Name                 WorkloadType       BackupManagementType BackupTime                DaysOfWeek
----                 ------------       -------------------- ----------                ----------
DefaultPolicy        AzureVM            AzureVM              4/14/2016 5:00:00 PM

注意

PowerShell 中 BackupTime 欄位的時區是 UTC。 不過,當備份時間顯示在 Azure 入口網站中時,系統會根據您的當地時區調整時間。

備份保護原則至少與一個保留原則相關聯。 保護原則會定義復原點在被刪除之前要保留多久。

根據預設,開始時間會定義於排程原則物件中。 使用下列範例,將開始時間變更為所需的開始時間。 所需的開始時間也應採用 UTC 格式。 下列範例假設每日備份所需的開始時間為上午 01:00 UTC。

$schPol = Get-AzRecoveryServicesBackupSchedulePolicyObject -WorkloadType "AzureVM"
$UtcTime = Get-Date -Date "2019-03-20 01:00:00Z"
$UtcTime = $UtcTime.ToUniversalTime()
$schpol.ScheduleRunTimes[0] = $UtcTime

重要

您只需以 30 分鐘的倍數提供開始時間。 在上述範例此時間僅能為 "01:00:00" 或 "02:30:00"。 開始時間不能是 "01:15:00"

下列範例會將排程原則和保留原則儲存在變數中。 這個範例在建立保護原則 NewPolicy 時會使用這些變數來定義參數。

$retPol = Get-AzRecoveryServicesBackupRetentionPolicyObject -WorkloadType "AzureVM"
New-AzRecoveryServicesBackupProtectionPolicy -Name "NewPolicy" -WorkloadType "AzureVM" -RetentionPolicy $retPol -SchedulePolicy $schPol -VaultId $targetVault.ID

輸出類似於下列範例:

Name                 WorkloadType       BackupManagementType BackupTime                DaysOfWeek
----                 ------------       -------------------- ----------                ----------
NewPolicy           AzureVM            AzureVM              4/24/2016 1:30:00 AM

啟用保護。

在定義保護原則之後,您仍然必須對項目啟用此原則。 使用 Enable-AzRecoveryServicesBackupProtection 來啟用保護。 啟用保護需要兩個物件:項目和原則。 一旦原則與保存庫相關聯,備份工作流程將依照原則排程定義的時間觸發。

重要

使用 PowerShell 同時啟用多個 VM 的備份時,請確定單一原則不會有超過 100 部相關聯的 VM。 這是建議的最佳做法。 目前,如果有超過 100 部 VM,但已規劃在未來新增檢查,則 PowerShell 用戶端不會明確封鎖。

下列範例會使用原則 NewPolicy 來對項目 V2VM 啟用保護。 這些範例根據 VM 是否加密以及加密的類型而有所不同。

非加密 Resource Manager VM 上啟用保護:

$pol = Get-AzRecoveryServicesBackupProtectionPolicy -Name "NewPolicy" -VaultId $targetVault.ID
Enable-AzRecoveryServicesBackupProtection -Policy $pol -Name "V2VM" -ResourceGroupName "RGName1" -VaultId $targetVault.ID

若要在加密的 VM 上 (使用 BEK 與 KEK 加密) 啟用保護,您必須提供權限讓 Azure 備份服務讀取金鑰保存庫中的金鑰與祕密。

Set-AzKeyVaultAccessPolicy -VaultName "KeyVaultName" -ResourceGroupName "RGNameOfKeyVault" -PermissionsToKeys backup,get,list -PermissionsToSecrets get,list -ServicePrincipalName 262044b1-e2ce-469f-a196-69ab7ada62d3
$pol = Get-AzRecoveryServicesBackupProtectionPolicy -Name "NewPolicy" -VaultId $targetVault.ID
Enable-AzRecoveryServicesBackupProtection -Policy $pol -Name "V2VM" -ResourceGroupName "RGName1" -VaultId $targetVault.ID

若要在加密的 VM 上 (只使用 BEK 加密) 啟用保護,您必須提供權限讓 Azure 備份服務讀取金鑰保存庫中的密碼。

Set-AzKeyVaultAccessPolicy -VaultName "KeyVaultName" -ResourceGroupName "RGNameOfKeyVault" -PermissionsToSecrets backup,get,list -ServicePrincipalName 262044b1-e2ce-469f-a196-69ab7ada62d3
$pol = Get-AzRecoveryServicesBackupProtectionPolicy -Name "NewPolicy" -VaultId $targetVault.ID
Enable-AzRecoveryServicesBackupProtection -Policy $pol -Name "V2VM" -ResourceGroupName "RGName1" -VaultId $targetVault.ID

注意

如果您是使用 Azure Government 雲端,則請在 Set-AzKeyVaultAccessPolicy Cmdlet 的參數 ServicePrincipalName 中,使用值 ff281ffe-705c-4f53-9f37-a40e6f2c68f3

如果您想要在提及的這些案例中選擇性備份部分磁碟,並排除其他磁碟,您可以僅針對如此處所記載的相關磁碟,進行設定保護和備份。

監視備份工作

您不必透過 Azure 入口網站就可以監視長時間執行的作業,例如備份作業。 若要取得進行中作業的狀態,請使用 Get-AzRecoveryservicesBackupJob Cmdlet。 此 Cmdlet 會取得特定保存庫 (在保存庫內容中指定) 的備份作業。 下列範例會以陣列形式取得進行中作業的狀態,並將狀態儲存在 $joblist 變數中。

$joblist = Get-AzRecoveryservicesBackupJob –Status "InProgress" -VaultId $targetVault.ID
$joblist[0]

輸出類似於下列範例:

WorkloadName     Operation            Status               StartTime                 EndTime                   JobID
------------     ---------            ------               ---------                 -------                   ----------
V2VM             Backup               InProgress            4/23/2016                5:00:30 PM                cf4b3ef5-2fac-4c8e-a215-d2eba4124f27

完成時無需輪詢這些作業 (此為非必要的額外程式碼),只需改為使用 Wait-AzRecoveryServicesBackupJob Cmdlet 即可。 此 Cmdlet 會暫停執行,直到工作完成,或達到指定的逾時值為止。

Wait-AzRecoveryServicesBackupJob -Job $joblist[0] -Timeout 43200 -VaultId $targetVault.ID

管理 Azure VM 備份

修改保護原則

若要修改保護原則,請使用 Set-AzRecoveryServicesBackupProtectionPolicy 修改 SchedulePolicy 或 RetentionPolicy 物件。

修改已排程時間

當您建立保護原則時,預設會指派開始時間。 下列範例會展示如何修改保護原則的開始時間。

$SchPol = Get-AzRecoveryServicesBackupSchedulePolicyObject -WorkloadType "AzureVM"
$UtcTime = Get-Date -Date "2019-03-20 01:00:00Z" (This is the time that you want to start the backup)
$UtcTime = $UtcTime.ToUniversalTime()
$SchPol.ScheduleRunTimes[0] = $UtcTime
$pol = Get-AzRecoveryServicesBackupProtectionPolicy -Name "NewPolicy" -VaultId $targetVault.ID
Set-AzRecoveryServicesBackupProtectionPolicy -Policy $pol  -SchedulePolicy $SchPol -VaultId $targetVault.ID

修改保留期

下列範例會將復原點保留變更為 365 天。

$retPol = Get-AzRecoveryServicesBackupRetentionPolicyObject -WorkloadType "AzureVM"
$retPol.DailySchedule.DurationCountInDays = 365
$pol = Get-AzRecoveryServicesBackupProtectionPolicy -Name "NewPolicy" -VaultId $targetVault.ID
Set-AzRecoveryServicesBackupProtectionPolicy -Policy $pol  -RetentionPolicy $RetPol -VaultId $targetVault.ID

設定立即還原快照集保留期

注意

自 Azure PowerShell 1.6.0 版起,可以使用 PowerShell 在原則中更新立即還原快照集保留期間

$bkpPol = Get-AzRecoveryServicesBackupProtectionPolicy -WorkloadType "AzureVM" -VaultId $targetVault.ID
$bkpPol.SnapshotRetentionInDays=7
Set-AzRecoveryServicesBackupProtectionPolicy -policy $bkpPol -VaultId $targetVault.ID

預設值為 2。 您可以設定的最小值為 1,最大值為 5。 針對每週備份原則,期限設定為 5,而且無法變更。

在快照集保留期間建立 Azure 備份的資源群組

注意

從 Azure PowerShell 版本 3.7.0 開始,即可建立和編輯建立的資源群組,以便儲存儲存即時的快照集。

若要深入了解資源群組的建立規則和其他相關詳細資料,請參閱虛擬機器的 Azure 備份資源群組文件。

$bkpPol = Get-AzureRmRecoveryServicesBackupProtectionPolicy -name "DefaultPolicyForVMs"
$bkpPol.AzureBackupRGName="Contosto_"
$bkpPol.AzureBackupRGNameSuffix="ForVMs"
Set-AzureRmRecoveryServicesBackupProtectionPolicy -policy $bkpPol

排除受保護 VM 的磁碟

Azure VM 備份提供功能,可選擇性地排除或包含磁碟,在這些案例中十分實用。 如果 Azure VM 備份已在保護虛擬機器,且所有的磁碟均已進行備份,您可依此處所述步驟,修改保護以選擇性包含或排除磁碟。

觸發備份

使用 Backup-AzRecoveryServicesBackupItem 來觸發備份作業。 如果是初始備份,則會是完整備份。 後續的備份會採用增量複本。 下列範例會將 VM 備份保留 60 天。

$namedContainer = Get-AzRecoveryServicesBackupContainer -ContainerType "AzureVM" -Status "Registered" -FriendlyName "V2VM" -VaultId $targetVault.ID
$item = Get-AzRecoveryServicesBackupItem -Container $namedContainer -WorkloadType "AzureVM" -VaultId $targetVault.ID
$endDate = (Get-Date).AddDays(60).ToUniversalTime()
$job = Backup-AzRecoveryServicesBackupItem -Item $item -VaultId $targetVault.ID -ExpiryDateTimeUTC $endDate

輸出類似於下列範例:

WorkloadName     Operation            Status               StartTime                 EndTime                   JobID
------------     ---------            ------               ---------                 -------                   ----------
V2VM              Backup              InProgress          4/23/2016                  5:00:30 PM                cf4b3ef5-2fac-4c8e-a215-d2eba4124f27

注意

PowerShell 中 StartTime 和 EndTime 欄位的時區是 UTC。 不過,當時間顯示在 Azure 入口網站中時,系統會根據您的當地時區調整時間。

變更備份項目的原則

您可以修改現有的原則,或將備份項目的原則從 Policy1 變更為 Policy2。 若要針對備份的項目切換原則,請擷取相關原則和備份項目,並使用 Enable-AzRecoveryServices 命令搭配備份項目作為參數。

$TargetPol1 = Get-AzRecoveryServicesBackupProtectionPolicy -Name <PolicyName> -VaultId $targetVault.ID
$anotherBkpItem = Get-AzRecoveryServicesBackupItem -WorkloadType AzureVM -BackupManagementType AzureVM -Name "<BackupItemName>" -VaultId $targetVault.ID
Enable-AzRecoveryServicesBackupProtection -Item $anotherBkpItem -Policy $TargetPol1 -VaultId $targetVault.ID

此命令會等到設定備份完成,並傳回下列輸出。

WorkloadName     Operation            Status               StartTime                 EndTime                   JobID
------------     ---------            ------               ---------                 -------                   -----
TestVM           ConfigureBackup      Completed            3/18/2019 8:00:21 PM      3/18/2019 8:02:16 PM      654e8aa2-4096-402b-b5a9-e5e71a496c4e

停止保護

保留資料

如果想要停止保護,您可以使用 Disable-AzRecoveryServicesBackupProtection PowerShell Cmdlet。 這將停止排程的備份,但直到現在為止備份的資料會永久保留。

$bkpItem = Get-AzRecoveryServicesBackupItem -BackupManagementType AzureVM -WorkloadType AzureVM -Name "<backup item name>" -VaultId $targetVault.ID
Disable-AzRecoveryServicesBackupProtection -Item $bkpItem -VaultId $targetVault.ID

繼續備份

如果保護已停止,且備份資料均已保留,則您可以再次繼續保護。 您必須針對已更新的保護指派原則。 Cmdlet 與備份項目的變更原則相同。

$TargetPol1 = Get-AzRecoveryServicesBackupProtectionPolicy -Name <PolicyName> -VaultId $targetVault.ID
$anotherBkpItem = Get-AzRecoveryServicesBackupItem -WorkloadType AzureVM -BackupManagementType AzureVM -Name "<BackupItemName>" -VaultId $targetVault.ID
Enable-AzRecoveryServicesBackupProtection -Item $anotherBkpItem -Policy $TargetPol1 -VaultId $targetVault.ID

刪除備份資料

若要完整移除保存庫中儲存的備份資料,只需將 '-RemoveRecoveryPoints' 旗標新增/切換至 保護命令

Disable-AzRecoveryServicesBackupProtection -Item $bkpItem -VaultId $targetVault.ID -RemoveRecoveryPoints

還原 Azure VM

使用 Azure 入口網站還原 VM 和使用 PowerShell 還原 VM 之間有一個重要差異。 使用 PowerShell 時,建立磁碟和復原點組態資訊之後,還原作業即完成。 還原作業不會建立虛擬機器。 若要從磁碟建立虛擬機器,請參閱從還原的磁碟建立 VM一節。 如果您不想還原整個 VM,但想要從 Azure VM 備份還原或復原幾個檔案,請參閱檔案復原一節。

提示

還原作業不會建立虛擬機器。

下圖顯示從 RecoveryServicesVault 向下到 BackupRecoveryPoint 的物件階層。

Screenshot shows the BackupContainer listed by Recovery Services object hierarchy.

若要還原備份資料,請識別已備份的項目和保存時間點資料的復原點。 使用 Restore-AzRecoveryServicesBackupItem 將資料從保存庫還原到您的帳戶。

還原 Azure VM 的基本步驟如下︰

  • 選取 VM。
  • 選擇復原點。
  • 還原磁碟。
  • 從預存的磁碟建立 VM。

現在,您也可以使用 PowerShell 將備份內容直接還原至 VM (原始/新的),而不需分別執行上述步驟。 如需詳細資訊,請參閱使用 PowerShell 將資料還原至虛擬機器

(在還原檔案時) 選取 VM

若要取得可識別正確備份項目的 PowerShell 物件,請從保存庫中的容器開始,向下深入物件階層。 若要選取代表 VM 的容器,請使用 Get-AzRecoveryServicesBackupContainer Cmdlet,並透過管道將期傳送到 Get-AzRecoveryServicesBackupItem Cmdlet。

$namedContainer = Get-AzRecoveryServicesBackupContainer  -ContainerType "AzureVM" -Status "Registered" -FriendlyName "V2VM" -VaultId $targetVault.ID
$backupitem = Get-AzRecoveryServicesBackupItem -Container $namedContainer  -WorkloadType "AzureVM" -VaultId $targetVault.ID

(在還原檔案時) 選擇復原點

使用 Get-AzRecoveryServicesBackupRecoveryPoint Cmdlet 來列出備份項目的所有復原點。 接下來選擇要還原的復原點。 如果您不確定要使用哪一個復原點,在清單中選擇最近的 RecoveryPointType = AppConsistent 點是好的做法。

在下列指令碼中,變數 $rp 是選取的備份項目在過去七天的復原點陣列。 陣列是以相反時間順序排序,最新復原點位於索引 0。 使用標準 PowerShell 陣列索引來挑選復原點。 在範例中,$rp[0] 會選取最新的復原點。

$startDate = (Get-Date).AddDays(-7)
$endDate = Get-Date
$rp = Get-AzRecoveryServicesBackupRecoveryPoint -Item $backupitem -StartDate $startdate.ToUniversalTime() -EndDate $enddate.ToUniversalTime() -VaultId $targetVault.ID
$rp[0]

輸出類似於下列範例:

RecoveryPointAdditionalInfo :
SourceVMStorageType         : NormalStorage
Name                        : 15260861925810
ItemName                    : VM;iaasvmcontainer;RGName1;V2VM
RecoveryPointId             : /subscriptions/XX/resourceGroups/ RGName1/providers/Microsoft.RecoveryServices/vaults/testvault/backupFabrics/Azure/protectionContainers/IaasVMContainer;iaasvmcontainer;RGName1;V2VM/protectedItems/VM;iaasvmcontainer; RGName1;V2VM/recoveryPoints/15260861925810
RecoveryPointType           : AppConsistent
RecoveryPointTime           : 4/23/2016 5:02:04 PM
WorkloadType                : AzureVM
ContainerName               : IaasVMContainer;iaasvmcontainer; RGName1;V2VM
ContainerType               : AzureVM
BackupManagementType        : AzureVM

還原磁碟

使用 Restore-AzRecoveryServicesBackupItem Cmdlet 將備份項目的資料和設定還原至復原點。 在您識別復原點之後,請使用它作為 -RecoveryPoint 參數的值。 在上述範例中,$rp[0] 是要使用的復原點。 在接下來的範例程式碼中,$rp[0] 是要用來還原磁碟的復原點。

還原磁碟和設定資訊:

$restorejob = Restore-AzRecoveryServicesBackupItem -RecoveryPoint $rp[0] -StorageAccountName "DestAccount" -StorageAccountResourceGroupName "DestRG" -VaultId $targetVault.ID
$restorejob

還原受控磁碟

注意

如果備份的 VM 含有受控磁碟,而您想要將其還原成受控磁碟,我們從 Azure PowerShell RM 模組 v 6.7.0 開始便已導入該功能 。

請提供額外的參數 TargetResourceGroupName以指定將作為受控磁碟還原目的地的 RG。

重要

強烈建議使用 TargetResourceGroupName 參數來還原受控磁碟,因為這會導致效能顯著改善。 如果未指定此參數,則您無法從立即還原功能獲益,而且還原作業將會比較慢。 如果目的是要將受控的磁碟作為非受控磁碟還原,請勿提供此參數,並透過提供 -RestoreAsUnmanagedDisks 參數來清除意圖。 從 Azure PowerShell 3.7.0 版後即可使用 -RestoreAsUnmanagedDisks 參數。 在未來的版本中,必須提供上述參數中的其中一個,才能進行正確的還原體驗。

$restorejob = Restore-AzRecoveryServicesBackupItem -RecoveryPoint $rp[0] -StorageAccountName "DestAccount" -StorageAccountResourceGroupName "DestRG" -TargetResourceGroupName "DestRGforManagedDisks" -VaultId $targetVault.ID

VMConfig.JSON 檔案將會還原至儲存體帳戶,而受控磁碟則會還原至指定的目標 RG。

輸出類似於下列範例:

WorkloadName     Operation          Status               StartTime                 EndTime            JobID
------------     ---------          ------               ---------                 -------          ----------
V2VM              Restore           InProgress           4/23/2016 5:00:30 PM                        cf4b3ef5-2fac-4c8e-a215-d2eba4124f27

使用 Wait-AzRecoveryServicesBackupJob Cmdlet 來等候還原作業完成。

Wait-AzRecoveryServicesBackupJob -Job $restorejob -Timeout 43200

完成還原作業之後,您可以使用 Get-AzRecoveryServicesBackupJobDetail Cmdlet 來取得還原作業的詳細資料。 JobDetails 屬性具有重建 VM 所需的資訊。

$restorejob = Get-AzRecoveryServicesBackupJob -Job $restorejob -VaultId $targetVault.ID
$details = Get-AzRecoveryServicesBackupJobDetail -Job $restorejob -VaultId $targetVault.ID

使用受控識別來還原磁碟

Azure 備份也可以讓您在還原作業期間,使用受控識別 (MSI) 來存取必須將磁碟還原至其中的儲存體帳戶。 此選項目前僅支援受控磁碟還原。

如果您想要使用保存庫的系統指派受控識別來復原磁碟,請將額外的旗標 -UseSystemAssignedIdentit 傳遞至 Restore-AzRecoveryServicesBackupItem 命令。 如果您想要使用使用者指派的受控識別,請以保存庫受控識別的 Azure Resource Manager 作為參數的值,傳遞 -UserAssignedIdentityId 參數。 請參閱這篇文章,以了解如何為您的保存庫啟用受控識別。

還原選擇性磁碟

使用者可以選擇性地還原數個磁片,而不是整個備份集。 如此處所述的方式,提供所需磁碟的 LUN 作為參數,僅針對該磁碟進行還原,而不是還原整個備份集。

重要

必須選擇性備份磁碟,才可選擇性還原磁碟。 詳細資料請參見此處

還原磁碟之後,請繼續下一節來建立 VM。

將磁碟還原至次要地區

如果在您用來保護 VM 的保存庫上已啟用跨區域還原,則會將備份資料複寫到次要地區。 您可以使用備份資料來執行還原。 請執行下列步驟,以在次要地區中觸發還原:

  1. 擷取您的 VM 受保護的保存庫識別碼

  2. 選取正確的備份項目以進行還原

  3. 在您想要用於執行還原的次要地區中選取適當的復原點。

    若要完成此步驟,請執行下列命令:

    $rp=Get-AzRecoveryServicesBackupRecoveryPoint -UseSecondaryRegion -Item $backupitem -VaultId $targetVault.ID
    $rp=$rp[0]
    
  4. -RestoreToSecondaryRegion 參數與 Restore-AzRecoveryServicesBackupItem Cmdlet 搭配執行,在次要地區中觸發還原。

    若要完成此步驟,請執行下列命令:

    $restorejob = Restore-AzRecoveryServicesBackupItem -RecoveryPoint $rp[0] -StorageAccountName "DestAccount" -StorageAccountResourceGroupName "DestRG" -TargetResourceGroupName "DestRGforManagedDisks" -VaultId $targetVault.ID -VaultLocation $targetVault.Location -RestoreToSecondaryRegion -RestoreOnlyOSDisk
    

    輸出將類似下列範例:

    WorkloadName     Operation             Status              StartTime                 EndTime          JobID
    ------------     ---------             ------              ---------                 -------          ----------
    V2VM             CrossRegionRestore   InProgress           4/23/2016 5:00:30 PM                       cf4b3ef5-2fac-4c8e-a215-d2eba4124f27
    
  5. -UseSecondaryRegion 參數與 Get-AzRecoveryServicesBackupJob Cmdlet 搭配執行,以監視還原作業。

    若要完成此步驟,請執行下列命令:

    Get-AzRecoveryServicesBackupJob -From (Get-Date).AddDays(-7).ToUniversalTime() -To (Get-Date).ToUniversalTime() -UseSecondaryRegion -VaultId $targetVault.ID
    

    輸出將類似下列範例:

    WorkloadName     Operation            Status               StartTime                 EndTime                   JobID
    ------------     ---------            ------               ---------                 -------                   -----
    V2VM             CrossRegionRestore   InProgress           2/8/2021 4:24:57 PM                                 2d071b07-8f7c-4368-bc39-98c7fb2983f7
    

跨區域還原

您能在任何位於相同區域的可用性區域中,還原 Azure 區域固定 VM

若要將 VM 還原到另一個區域,請在 Restore-AzRecoveryServicesBackupItem Cmdlet 中指定 TargetZoneNumber 參數。

$restorejob = Restore-AzRecoveryServicesBackupItem -RecoveryPoint $rp[0] -StorageAccountName "DestAccount" -StorageAccountResourceGroupName "DestRG" -VaultId $targetVault.ID -TargetZoneNumber 3

輸出將類似下列範例:

WorkloadName     Operation            Status               StartTime                 EndTime                   JobID
------------     ---------            ------               ---------                 -------                   -----
zonevmeus2       Restore              InProgress           1/3/2022 10:27:20 AM                                b2298...

只有下列情況才支援跨區域還原:

  • 來源 VM 已固定區域且未加密。
  • 復原點只存在於保存庫層中。 僅有快照集,或有快照集和保存庫層的情況不受支援。
  • 復原選項為建立新的 VM 或還原磁碟。 取代磁碟選項取代了來源資料;因此可用性區域選項不再適用。
  • 當保存庫的儲存體備援為區域備援儲存體 (ZRS) 時,於相同的區域中建立 VM/磁碟。 請注意,如果保存庫的儲存體備援為異地備援儲存體 (GRS),則區域還原將無法運作,即使來源 VM 已固定在區域中也一樣。
  • 若已啟用保存庫的儲存體備援以進行跨區域還原,且配對的區域支援區域,則在配對的區域中建立 VM/磁碟。

取代 Azure VM 中的磁碟

若要取代磁碟和設定資訊,請執行下列步驟:

從還原的磁碟建立 VM

在您還原磁碟之後,使用下列步驟從磁碟建立及設定虛擬機器。

注意

  1. 需要 AzureAz 模組 3.0.0 或更高版本。
  2. 若要從預存的磁碟建立加密的 VM,您的 Azure 角色必須具備可執行 Microsoft.KeyVault/vaults/deploy/action 動作的權限。 如果您的角色沒有此權限,請使用此動作來建立自訂角色。 如需詳細資訊,請參閱 Azure 自訂角色
  3. 還原磁碟之後,現在即可取得部署範本,您可以直接用來建立新的虛擬機器。 您無需其他的 PowerShell Cmdlet 即可建立加密/解密的受控/非受控虛擬機器。

使用部署範本建立 VM

結果工作詳細資料提供可查詢和部署的範本 URI。

   $properties = $details.properties
   $storageAccountName = $properties["Target Storage Account Name"]
   $containerName = $properties["Config Blob Container Name"]
   $templateBlobURI = $properties["Template Blob Uri"]

此範本位於客戶的儲存體帳戶和指定的容器下,因此無法直接存取。 我們需要完整的 URL (以及暫時的 SAS 權杖),才能存取此範本。

  1. 先從 templateBlobURI 中擷取範本名稱。 格式如下所述。 您可以使用 PowerShell 中的分割作業,從這個 URL 中擷取最終的範本名稱。

    https://<storageAccountName.blob.core.windows.net>/<containerName>/<templateName>
    
  2. 接著即可產生完整的 URL,如此處所述。

    Set-AzCurrentStorageAccount -Name $storageAccountName -ResourceGroupName <StorageAccount RG name>
    $templateBlobFullURI = New-AzStorageBlobSASToken -Container $containerName -Blob <templateName> -Permission r -FullUri
    
  3. 部署範本以建立新的虛擬機器,如此處所述。

    New-AzResourceGroupDeployment -Name ExampleDeployment -ResourceGroupName ExampleResourceGroup -TemplateUri $templateBlobFullURI
    

使用設定檔建立 VM

下節列出使用 VMConfig 檔案建立虛擬機器所需的步驟。

注意

強烈建議使用以上詳述的部署範本來建立虛擬機器。 本節 (1-6 點) 很快就會淘汰。

  1. 查詢工作詳細資料的已還原磁碟內容。

    $properties = $details.properties
    $storageAccountName = $properties["Target Storage Account Name"]
    $containerName = $properties["Config Blob Container Name"]
    $configBlobName = $properties["Config Blob Name"]
    
  2. 設定 Azure 儲存體內容,並還原為 JSON 組態檔。

    Set-AzCurrentStorageAccount -Name $storageaccountname -ResourceGroupName "testvault"
    $destination_path = "C:\vmconfig.json"
    Get-AzStorageBlobContent -Container $containerName -Blob $configBlobName -Destination $destination_path
    $obj = ((Get-Content -Path $destination_path -Raw -Encoding Unicode)).TrimEnd([char]0x00) | ConvertFrom-Json
    
  3. 使用 JSON 組態檔來建立 VM 組態。

    $vm = New-AzVMConfig -VMSize $obj.'properties.hardwareProfile'.vmSize -VMName "testrestore"
    
  4. 連接作業系統磁碟與資料磁碟。 此步驟提供各種受控和已加密 VM 設定的範例。 使用適合您的 VM 設定的範例。

    • 非受控與未加密的 VM - 如果是非受控、未加密的 VM,請使用下列範例。
        Set-AzVMOSDisk -VM $vm -Name "osdisk" -VhdUri $obj.'properties.StorageProfile'.osDisk.vhd.Uri -CreateOption "Attach"
        $vm.StorageProfile.OsDisk.OsType = $obj.'properties.StorageProfile'.OsDisk.OsType
        foreach($dd in $obj.'properties.StorageProfile'.DataDisks)
        {
            $vm = Add-AzVMDataDisk -VM $vm -Name "datadisk1" -VhdUri $dd.vhd.Uri -DiskSizeInGB 127 -Lun $dd.Lun -CreateOption "Attach"
        }
    
    • 含 Microsoft Entra ID 的非受控已加密 VM (僅限 BEK) - 對於含 Microsoft Entra ID 的非受控已加密 VM (僅限使用 BEK 加密),您需要先將密碼還原至金鑰保存庫,才可以連結磁碟。 如需詳細資訊,請參閱從 Azure 備份復原點還原已加密的虛擬機器。 下列範例示範如何將 OS 和資料磁碟連結至已加密的 VM。 設定 OS 磁碟時,請務必提及相關的 OS 類型。
        $dekUrl = "https://ContosoKeyVault.vault.azure.net:443/secrets/ContosoSecret007/xx000000xx0849999f3xx30000003163"
        $dekUrl = "/subscriptions/abcdedf007-4xyz-1a2b-0000-12a2b345675c/resourceGroups/ContosoRG108/providers/Microsoft.KeyVault/vaults/ContosoKeyVault"
        Set-AzVMOSDisk -VM $vm -Name "osdisk" -VhdUri $obj.'properties.storageProfile'.osDisk.vhd.uri -DiskEncryptionKeyUrl $dekUrl -DiskEncryptionKeyVaultId $keyVaultId -CreateOption "Attach" -Windows/Linux
        $vm.StorageProfile.OsDisk.OsType = $obj.'properties.storageProfile'.osDisk.osType
        foreach($dd in $obj.'properties.storageProfile'.dataDisks)
        {
        $vm = Add-AzVMDataDisk -VM $vm -Name "datadisk1" -VhdUri $dd.vhd.Uri -DiskSizeInGB 127 -Lun $dd.Lun -CreateOption "Attach"
        }
    
    • 含 Microsoft Entra ID 的非受控已加密 VM (BEK 和 KEK) - 對於含 Microsoft Entra ID 的非受控已加密 VM (使用 BEK 和 KEK 加密),您需要先將金鑰與密碼還原到金鑰保存庫,才可以連結磁碟。 如需詳細資訊,請參閱從 Azure 備份復原點還原已加密的虛擬機器。 下列範例示範如何將 OS 和資料磁碟連結至已加密的 VM。
        $dekUrl = "https://ContosoKeyVault.vault.azure.net:443/secrets/ContosoSecret007/xx000000xx0849999f3xx30000003163"
        $kekUrl = "https://ContosoKeyVault.vault.azure.net:443/keys/ContosoKey007/x9xxx00000x0000x9b9949999xx0x006"
        $keyVaultId = "/subscriptions/abcdedf007-4xyz-1a2b-0000-12a2b345675c/resourceGroups/ContosoRG108/providers/Microsoft.KeyVault/vaults/ContosoKeyVault"
        Set-AzVMOSDisk -VM $vm -Name "osdisk" -VhdUri $obj.'properties.storageProfile'.osDisk.vhd.uri -DiskEncryptionKeyUrl $dekUrl -DiskEncryptionKeyVaultId $keyVaultId -KeyEncryptionKeyUrl $kekUrl -KeyEncryptionKeyVaultId $keyVaultId -CreateOption "Attach" -Windows
        $vm.StorageProfile.OsDisk.OsType = $obj.'properties.storageProfile'.osDisk.osType
        foreach($dd in $obj.'properties.storageProfile'.dataDisks)
        {
        $vm = Add-AzVMDataDisk -VM $vm -Name "datadisk1" -VhdUri $dd.vhd.Uri -DiskSizeInGB 127 -Lun $dd.Lun -CreateOption "Attach"
        }
    
    • 不含 Microsoft Entra ID 的非受控已加密 VM (僅限 BEK) - 對於不含 Microsoft Entra ID 的非受控已加密 VM (僅限使用 BEK 加密),如果無法使用來源 keyVault/密碼,會使用從 Azure 備份復原點還原未加密的虛擬機器中的程序,將密碼還原至金鑰保存庫。 然後執行下列指令碼,對於還原的 OS blob 設定加密詳細資料 (資料 blob 無需此步驟)。 可以從還原的 keyVault 擷取 $dekurl。

    只有在沒有來源 keyVault/密碼可用時,才需要執行下列指令碼。

        $dekUrl = "https://ContosoKeyVault.vault.azure.net/secrets/ContosoSecret007/xx000000xx0849999f3xx30000003163"
        $keyVaultId = "/subscriptions/abcdedf007-4xyz-1a2b-0000-12a2b345675c/resourceGroups/ContosoRG108/providers/Microsoft.KeyVault/vaults/ContosoKeyVault"
        $encSetting = "{""encryptionEnabled"":true,""encryptionSettings"":[{""diskEncryptionKey"":{""sourceVault"":{""id"":""$keyVaultId""},""secretUrl"":""$dekUrl""}}]}"
        $osBlobName = $obj.'properties.StorageProfile'.osDisk.name + ".vhd"
        $osBlob = Get-AzStorageBlob -Container $containerName -Blob $osBlobName
        $osBlob.ICloudBlob.Metadata["DiskEncryptionSettings"] = $encSetting
        $osBlob.ICloudBlob.SetMetadata()
    

    密碼可用,而且也對於 OS Blob 設定加密詳細資料後,可使用下列指令碼附加磁碟。

    如果來源 keyVault/密碼可供使用,則無法執行上述指令碼。

        Set-AzVMOSDisk -VM $vm -Name "osdisk" -VhdUri $obj.'properties.StorageProfile'.osDisk.vhd.Uri -CreateOption "Attach"
        $vm.StorageProfile.OsDisk.OsType = $obj.'properties.StorageProfile'.OsDisk.OsType
        foreach($dd in $obj.'properties.StorageProfile'.DataDisks)
        {
        $vm = Add-AzVMDataDisk -VM $vm -Name "datadisk1" -VhdUri $dd.vhd.Uri -DiskSizeInGB 127 -Lun $dd.Lun -CreateOption "Attach"
        }
    
    • 不含 Microsoft Entra ID 的非受控已加密 VM (BEK 和 KEK) - 對於不含 Microsoft Entra ID 的非受控已加密 VM (僅限使用 BEK 和 KEK 加密),如果 無法使用來源 keyVault/金鑰/密碼,會使用從 Azure 備份復原點還原未加密的虛擬機器中的程序,將金鑰和密碼還原至金鑰保存庫。 然後執行下列指令碼,對於還原的 OS blob 設定加密詳細資料 (資料 blob 無需此步驟)。 可以從還原的 keyVault 擷取 $dekurl 和 $kekurl。

    只有在沒有來源 keyVault/金鑰/密碼可用時,才需要執行下列指令碼。

        $dekUrl = "https://ContosoKeyVault.vault.azure.net/secrets/ContosoSecret007/xx000000xx0849999f3xx30000003163"
        $kekUrl = "https://ContosoKeyVault.vault.azure.net/keys/ContosoKey007/x9xxx00000x0000x9b9949999xx0x006"
        $keyVaultId = "/subscriptions/abcdedf007-4xyz-1a2b-0000-12a2b345675c/resourceGroups/ContosoRG108/providers/Microsoft.KeyVault/vaults/ContosoKeyVault"
        $encSetting = "{""encryptionEnabled"":true,""encryptionSettings"":[{""diskEncryptionKey"":{""sourceVault"":{""id"":""$keyVaultId""},""secretUrl"":""$dekUrl""},""keyEncryptionKey"":{""sourceVault"":{""id"":""$keyVaultId""},""keyUrl"":""$kekUrl""}}]}"
        $osBlobName = $obj.'properties.StorageProfile'.osDisk.name + ".vhd"
        $osBlob = Get-AzStorageBlob -Container $containerName -Blob $osBlobName
        $osBlob.ICloudBlob.Metadata["DiskEncryptionSettings"] = $encSetting
        $osBlob.ICloudBlob.SetMetadata()
    

    金鑰/密碼可用,而且對於 OS Blob 設定加密詳細資料後,可使用下列指令碼附加磁碟。

    如果來源 keyVault/金鑰/密碼可供使用,則無法執行上述指令碼。

        Set-AzVMOSDisk -VM $vm -Name "osdisk" -VhdUri $obj.'properties.StorageProfile'.osDisk.vhd.Uri -CreateOption "Attach"
        $vm.StorageProfile.OsDisk.OsType = $obj.'properties.StorageProfile'.OsDisk.OsType
        foreach($dd in $obj.'properties.StorageProfile'.DataDisks)
        {
        $vm = Add-AzVMDataDisk -VM $vm -Name "datadisk1" -VhdUri $dd.vhd.Uri -DiskSizeInGB 127 -Lun $dd.Lun -CreateOption "Attach"
        }
    
    • 受控與未加密的 VM - 針對受控、未加密的 VM,請連結已還原的受控磁碟。 如需深入的資訊,請參閱使用 PowerShell 將資料磁碟連結至 Windows VM

    • 含 Microsoft Entra ID 的受控已加密 VM (僅限 BEK) - 對於含 Microsoft Entra ID 的受控已加密的 VM (僅限使用 BEK 加密),請連結已還原的受控磁碟。 如需深入的資訊,請參閱使用 PowerShell 將資料磁碟連結至 Windows VM

    • 含 Microsoft Entra ID 的受控已加密 VM (BEK 和 KEK=) - 對於含 Microsoft Entra ID 的受控已加密的 VM (使用 BEK 和 KEK 加密),請連結已還原的受控磁碟。 如需深入的資訊,請參閱使用 PowerShell 將資料磁碟連結至 Windows VM

    • 不含 Microsoft Entra ID 的受控已加密 VM (僅限 BEK) - 對於不含 Microsoft Entra ID 的受控已加密 VM (僅限使用 BEK 加密),如果無法使用來源 keyVault/密碼,會使用從 Azure 備份復原點還原未加密的虛擬機器中的程序,將密碼還原至金鑰保存庫。 然後執行下列指令碼,對於還原的 OS 磁碟設定加密詳細資料 (資料磁碟不需要此步驟)。 可以從還原的 keyVault 擷取 $dekurl。

    只有在沒有來源 keyVault/密碼可用時,才需要執行下列指令碼。

    $dekUrl = "https://ContosoKeyVault.vault.azure.net/secrets/ContosoSecret007/xx000000xx0849999f3xx30000003163"
    $keyVaultId = "/subscriptions/abcdedf007-4xyz-1a2b-0000-12a2b345675c/resourceGroups/ContosoRG108/providers/Microsoft.KeyVault/vaults/ContosoKeyVault"
    $diskupdateconfig = New-AzDiskUpdateConfig -EncryptionSettingsEnabled $true
    $encryptionSettingsElement = New-Object Microsoft.Azure.Management.Compute.Models.EncryptionSettingsElement
    $encryptionSettingsElement.DiskEncryptionKey = New-Object Microsoft.Azure.Management.Compute.Models.KeyVaultAndSecretReference
    $encryptionSettingsElement.DiskEncryptionKey.SourceVault = New-Object Microsoft.Azure.Management.Compute.Models.SourceVault
    $encryptionSettingsElement.DiskEncryptionKey.SourceVault.Id = $keyVaultId
    $encryptionSettingsElement.DiskEncryptionKey.SecretUrl = $dekUrl
    $diskupdateconfig.EncryptionSettingsCollection.EncryptionSettings = New-Object System.Collections.Generic.List[Microsoft.Azure.Management.Compute.Models.EncryptionSettingsElement]
    $diskupdateconfig.EncryptionSettingsCollection.EncryptionSettings.Add($encryptionSettingsElement)
    $diskupdateconfig.EncryptionSettingsCollection.EncryptionSettingsVersion = "1.1"
    Update-AzDisk -ResourceGroupName "testvault" -DiskName $obj.'properties.StorageProfile'.osDisk.name -DiskUpdate $diskupdateconfig
    

    有密碼可用,而且也對於 OS 磁碟設定加密詳細資料後,若要附加已還原的受控磁碟,請參閱使用 PowerShell 將資料磁碟連結至 Windows VM

    • 不含 Microsoft Entra ID 的受控已加密 VM (BEK 和 KEK) - 對於不含 Microsoft Entra ID 的受控已加密 VM (僅限使用 BEK 和 KEK 加密),如果 無法使用來源 keyVault/金鑰/密碼,會使用從 Azure 備份復原點還原未加密的虛擬機器中的程序,將金鑰和密碼還原至金鑰保存庫。 然後執行下列指令碼,對於還原的 OS 磁碟設定加密詳細資料 (資料磁碟不需要此步驟)。 可以從還原的 keyVault 擷取 $dekurl 和 $kekurl。

    只有在沒有來源 keyVault/金鑰/密碼可用時,才需要執行下列指令碼。

    $dekUrl = "https://ContosoKeyVault.vault.azure.net/secrets/ContosoSecret007/xx000000xx0849999f3xx30000003163"
    $kekUrl = "https://ContosoKeyVault.vault.azure.net/keys/ContosoKey007/x9xxx00000x0000x9b9949999xx0x006"
    $keyVaultId = "/subscriptions/abcdedf007-4xyz-1a2b-0000-12a2b345675c/resourceGroups/ContosoRG108/providers/Microsoft.KeyVault/vaults/ContosoKeyVault"
    $diskupdateconfig = New-AzDiskUpdateConfig -EncryptionSettingsEnabled $true
    $encryptionSettingsElement = New-Object Microsoft.Azure.Management.Compute.Models.EncryptionSettingsElement
    $encryptionSettingsElement.DiskEncryptionKey = New-Object Microsoft.Azure.Management.Compute.Models.KeyVaultAndSecretReference
    $encryptionSettingsElement.DiskEncryptionKey.SourceVault = New-Object Microsoft.Azure.Management.Compute.Models.SourceVault
    $encryptionSettingsElement.DiskEncryptionKey.SourceVault.Id = $keyVaultId
    $encryptionSettingsElement.DiskEncryptionKey.SecretUrl = $dekUrl
    $encryptionSettingsElement.KeyEncryptionKey = New-Object Microsoft.Azure.Management.Compute.Models.KeyVaultAndKeyReference
    $encryptionSettingsElement.KeyEncryptionKey.SourceVault = New-Object Microsoft.Azure.Management.Compute.Models.SourceVault
    $encryptionSettingsElement.KeyEncryptionKey.SourceVault.Id = $keyVaultId
    $encryptionSettingsElement.KeyEncryptionKey.KeyUrl = $kekUrl
    $diskupdateconfig.EncryptionSettingsCollection.EncryptionSettings = New-Object System.Collections.Generic.List[Microsoft.Azure.Management.Compute.Models.EncryptionSettingsElement]
    $diskupdateconfig.EncryptionSettingsCollection.EncryptionSettings.Add($encryptionSettingsElement)
    $diskupdateconfig.EncryptionSettingsCollection.EncryptionSettingsVersion = "1.1"
    Update-AzDisk -ResourceGroupName "testvault" -DiskName $obj.'properties.StorageProfile'.osDisk.name -DiskUpdate $diskupdateconfig
    

    有金鑰/密碼可用,而且對於 OS 磁碟設定加密詳細資料後,若要附加已還原的受控磁碟,請參閱使用 PowerShell 將資料磁碟連結至 Windows VM

  5. 設定網路設定。

    $nicName="p1234"
    $pip = New-AzPublicIpAddress -Name $nicName -ResourceGroupName "test" -Location "WestUS" -AllocationMethod Dynamic
    $virtualNetwork = New-AzVirtualNetwork -ResourceGroupName "test" -Location "WestUS" -Name "testvNET" -AddressPrefix 10.0.0.0/16
    $virtualNetwork | Set-AzVirtualNetwork
    $vnet = Get-AzVirtualNetwork -Name "testvNET" -ResourceGroupName "test"
    $subnetindex=0
    $nic = New-AzNetworkInterface -Name $nicName -ResourceGroupName "test" -Location "WestUS" -SubnetId $vnet.Subnets[$subnetindex].Id -PublicIpAddressId $pip.Id
    $vm=Add-AzVMNetworkInterface -VM $vm -Id $nic.Id
    
  6. 建立虛擬機器。

    New-AzVM -ResourceGroupName "test" -Location "WestUS" -VM $vm
    
  7. 推送 ADE 擴充功能。 如果未推送 ADE 擴充功能,則資料磁片會標示為未加密,因此必須執行下列步驟:

    • 對於含 Microsoft Entra ID 的 VM - 使用下列命令,以手動方式啟用資料磁碟的加密

      僅限 BEK

      Set-AzVMDiskEncryptionExtension -ResourceGroupName $RG -VMName $vm.Name -AadClientID $aadClientID -AadClientSecret $aadClientSecret -DiskEncryptionKeyVaultUrl $dekUrl -DiskEncryptionKeyVaultId $keyVaultId -VolumeType Data
      

      BEK 和 KEK

      Set-AzVMDiskEncryptionExtension -ResourceGroupName $RG -VMName $vm.Name -AadClientID $aadClientID -AadClientSecret $aadClientSecret -DiskEncryptionKeyVaultUrl $dekUrl -DiskEncryptionKeyVaultId $keyVaultId  -KeyEncryptionKeyUrl $kekUrl -KeyEncryptionKeyVaultId $keyVaultId -VolumeType Data
      
    • 對於不含 Microsoft Entra ID 的 VM - 使用下列命令,以手動方式啟用資料磁碟的加密。

      如果在執行命令期間需要 AADClientID,則需要更新您的 Azure PowerShell。

      僅限 BEK

      Set-AzVMDiskEncryptionExtension -ResourceGroupName $RG -VMName $vm.Name -DiskEncryptionKeyVaultUrl $dekUrl -DiskEncryptionKeyVaultId $keyVaultId -SkipVmBackup -VolumeType "All"
      

      BEK 和 KEK

      Set-AzVMDiskEncryptionExtension -ResourceGroupName $RG -VMName $vm.Name -DiskEncryptionKeyVaultUrl $dekUrl -DiskEncryptionKeyVaultId $keyVaultId -KeyEncryptionKeyUrl $kekUrl -KeyEncryptionKeyVaultId $keyVaultId -SkipVmBackup -VolumeType "All"
      

注意

請在部分的加密 VM 還原磁碟處理時,務必手動刪除 JASON 檔案。

從 Azure VM 備份還原檔案

除了還原磁碟,您也可以從 Azure VM 備份還原個別檔案。 還原檔案功能提供復原點中所有檔案的存取權。 透過檔案總管管理檔案,就像一般的檔案一樣。

從 Azure VM 備份還原檔案的基本步驟如下:

  • 選取 VM
  • 選擇復原點
  • 掛接復原點的磁碟
  • 複製所需的檔案
  • 卸載磁碟

(在還原 VM 時) 選取 VM

若要取得可識別正確備份項目的 PowerShell 物件,請從保存庫中的容器開始,向下深入物件階層。 若要選取代表 VM 的容器,請使用 Get-AzRecoveryServicesBackupContainer Cmdlet,並透過管道將期傳送到 Get-AzRecoveryServicesBackupItem Cmdlet。

$namedContainer = Get-AzRecoveryServicesBackupContainer  -ContainerType "AzureVM" -Status "Registered" -FriendlyName "V2VM" -VaultId $targetVault.ID
$backupitem = Get-AzRecoveryServicesBackupItem -Container $namedContainer  -WorkloadType "AzureVM" -VaultId $targetVault.ID

(在還原 VM 時) 選擇復原點

使用 Get-AzRecoveryServicesBackupRecoveryPoint Cmdlet 來列出備份項目的所有復原點。 接下來選擇要還原的復原點。 如果您不確定要使用哪一個復原點,在清單中選擇最近的 RecoveryPointType = AppConsistent 點是好的做法。

在下列指令碼中,變數 $rp 是選取的備份項目在過去七天的復原點陣列。 陣列是以相反時間順序排序,最新復原點位於索引 0。 使用標準 PowerShell 陣列索引來挑選復原點。 在範例中,$rp[0] 會選取最新的復原點。

$startDate = (Get-Date).AddDays(-7)
$endDate = Get-Date
$rp = Get-AzRecoveryServicesBackupRecoveryPoint -Item $backupitem -StartDate $startdate.ToUniversalTime() -EndDate $enddate.ToUniversalTime() -VaultId $targetVault.ID
$rp[0]

輸出類似於下列範例:

RecoveryPointAdditionalInfo :
SourceVMStorageType         : NormalStorage
Name                        : 15260861925810
ItemName                    : VM;iaasvmcontainer;RGName1;V2VM
RecoveryPointId             : /subscriptions/XX/resourceGroups/ RGName1/providers/Microsoft.RecoveryServices/vaults/testvault/backupFabrics/Azure/protectionContainers/IaasVMContainer;iaasvmcontainer;RGName1;V2VM/protectedItems/VM;iaasvmcontainer; RGName1;V2VM/recoveryPoints/15260861925810
RecoveryPointType           : AppConsistent
RecoveryPointTime           : 4/23/2016 5:02:04 PM
WorkloadType                : AzureVM
ContainerName               : IaasVMContainer;iaasvmcontainer; RGName1;V2VM
ContainerType               : AzureVM
BackupManagementType        : AzureVM

掛接復原點的磁碟

使用 Get-AzRecoveryServicesBackupRPMountScript Cmdlet 以取得指令碼,掛接復原點的所有磁碟。

注意

磁碟會以 iSCSI 連接磁碟的形式掛接至執行指令碼所在的機器。 掛接會立即發生,您不會產生任何費用。

Get-AzRecoveryServicesBackupRPMountScript -RecoveryPoint $rp[0] -VaultId $targetVault.ID

輸出類似於下列範例:

OsType  Password        Filename
------  --------        --------
Windows e3632984e51f496 V2VM_wus2_8287309959960546283_451516692429_cbd6061f7fc543c489f1974d33659fed07a6e0c2e08740.exe

在您要復原檔案的機器上執行此指令碼。 若要執行指令碼,您必須輸入提供的密碼。 連結磁碟之後,使用 Windows 檔案總管瀏覽新的磁碟區與檔案。 如需詳細資訊,請參閱「備份」文章:從 Azure 虛擬機器備份復原檔案

將磁碟取消掛接

複製所需的檔案之後,使用 Disable-AzRecoveryServicesBackupRPMountScript 將磁碟取消掛接。 請務必取消掛接磁碟,以便移除對復原點檔案的存取權。

Disable-AzRecoveryServicesBackupRPMountScript -RecoveryPoint $rp[0] -VaultId $targetVault.ID

使用 PowerShell 將資料還原至虛擬機器

您現在可以直接將資料還原至原始/替代 VM,而不需要執行多個步驟。

將資料還原至原始 VM

$vault = Get-AzRecoveryServicesVault -ResourceGroupName "resourceGroup" -Name "vaultName"
$BackupItem = Get-AzRecoveryServicesBackupItem -BackupManagementType "AzureVM" -WorkloadType "AzureVM" -Name "V2VM" -VaultId $vault.ID
$StartDate = (Get-Date).AddDays(-7)
$EndDate = Get-Date
$RP = Get-AzRecoveryServicesBackupRecoveryPoint -Item $BackupItem -StartDate $StartDate.ToUniversalTime() -EndDate $EndDate.ToUniversalTime() -VaultId $vault.ID
$OriginalLocationRestoreJob = Restore-AzRecoveryServicesBackupItem -RecoveryPoint $RP[0] -StorageAccountName "DestStorageAccount" -StorageAccountResourceGroupName "DestStorageAccRG" -VaultId $vault.ID -VaultLocation $vault.Location 
WorkloadName    Operation       Status          StartTime              EndTime
------------    ---------       ------          ---------              -------
V2VM            Restore         InProgress      26-Apr-16 1:14:01 PM   01-Jan-01 12:00:00 AM

最後一個命令會觸發原始位置還原作業,以在現有的 VM 中就地還原資料。

將資料還原至新建立的 VM

$vault = Get-AzRecoveryServicesVault -ResourceGroupName "resourceGroup" -Name "vaultName"
$BackupItem = Get-AzRecoveryServicesBackupItem -BackupManagementType "AzureVM" -WorkloadType "AzureVM" -Name "V2VM" -VaultId $vault.ID
$StartDate = (Get-Date).AddDays(-7)
$EndDate = Get-Date
$RP = Get-AzRecoveryServicesBackupRecoveryPoint -Item $BackupItem -StartDate $StartDate.ToUniversalTime() -EndDate $EndDate.ToUniversalTime() -VaultId $vault.ID
$AlternateLocationRestoreJob = Restore-AzRecoveryServicesBackupItem -RecoveryPoint $RP[0] -TargetResourceGroupName "Target_RG" -StorageAccountName "DestStorageAccount" -StorageAccountResourceGroupName "DestStorageAccRG" -TargetVMName "TagetVirtualMachineName" -TargetVNetName "Target_VNet" -TargetVNetResourceGroup "" -TargetSubnetName "subnetName" -VaultId $vault.ID -VaultLocation $vault.Location 
WorkloadName    Operation       Status          StartTime              EndTime
------------    ---------       ------          ---------              -------
V2VM            Restore         InProgress      26-Apr-16 1:14:01 PM   01-Jan-01 12:00:00 AM

最後一個命令會觸發替代位置還原作業,以根據 TargetVMNameTargetVNetNameTargetVNetResourceGroupTargetSubnetName 參數中指定的輸入在 Target_RG 資源群組中建立新 VM。 這可確保資料會在必要的 VM、虛擬網路和子網路中還原。

下一步

如果您偏好使用 PowerShell 來與 Azure 資源互動,請參閱 PowerShell 文章:部署和管理 Windows Server 的備份。 如果您管理 DPM 備份,請參閱部署及管理 DPM 的備份一文。