ページ

2020/09/01

PowershellでWSB実行:はじめに(1)

 はじめに

Windows Server Backup(以下、WSB)機能はWindows Server 2008から搭載されており、Windows Server 2003以前のNT Backupから発展したMicrosoft社の製品技術です。

Windows Serverライセンスの範囲内で追加費用無く利用できるため、全国に展開したWindows Server約150台のシステムバックアップとして利用してきました。

WSBを利用する方法は次のとおりですが、Powershellでの利用にあたり、今回色々障害に至った(苦労させられた)ので、備忘録も兼ねて本投稿に至った次第です。

WSBの利用方法

  • GUI(wbadmin.msc)
  • WBADMINコマンド(wbadmin.exe)
  • Powershell(WindowsServerBackupモジュール)

WindowsServerBackupモジュール

WindowsServerBackupモジュールを確認するためのコマンドレットは以下のとおりです。

Get-Command -Module WindowsServerBackup


基本的な使い方

PowershellでWSBの使い方は、GUI操作手順の一つずつのように次のとおりですが、対象オブジェクトを作りポリシーに追加していくのでステップ数は多くなります。

バックアップ

  1. WBポリシーを作成(New-WBPolicy)
  2. バックアップ先オブジェクトを作成(New-WBBackupTarget)
  3. バックアップ先オブジェクトをWBポリシーに追加(Add-WBBackupTarget)
  4. バックアップ対象オブジェクトを作成(Get-WBVolume)
  5. バックアップ対象オブジェクトをWBポリシーに追加(Add-WBVolume)
  6. バックアップ実行(Start-WBBackup)
  7. 実行結果確認(Get-WBJob -Previous 1)

リストア

  1. バックアップ元オブジェクトを作成(New-WBBackupTarget)
  2. バックアップ元からバックアップセットを見つける(Get-WBBackupSet)
  3. リストア実行(Start-WBxxxxxRecovery)注1
  4. 実行結果確認(Get-WBJob -Previous 1)

(注) xxxx: File / Volume / HyperV / SystemState

実行結果(WSBジョブ履歴)の確認

直前のWSBジョブ履歴(Get-WBJob -Previous 1)の開始日時を退避しておき、実行したWSBジョブ完了後、実行結果の確認のために使用します。

WSBジョブ履歴(実行結果)の確認すべき項目は次のとおりです。他のサイトではHRESULTだけの確認を説明されてますが、経験的にそれだけでは不十分でしたので、念には念を入れます。

  1. StartTime(直前のジョブ以降である事)
  2. JobType(Backup | ApplicationRecovery | VolumeRecovery | FileRecovery のいずれかである事)
  3. JobState(Completedである事)
  4. HRESULT(0である事)

ジョブ履歴の開始日時は「yyyy/mm/dd h:mm」形式の文字列であり。日付時刻型ではありません。

また、日付はゼロ補完されますが、時刻(秒は無し)はゼロ補完されないため、「2020/03/15 9:00」のように日付と時刻の間は空白が1個となります。もし、直前のWSBジョブ履歴が同日午前9時であり、午後2時に実行したバックアップの結果は「2020/03/15 14:00」となるので、単純に大小比較すると後の方が小さい(=古い)ことになります。よって、[日付時刻]型への変換が必要です。**

更に、バックアップ等のコマンドレットが終了しても直ぐにWSBジョブ履歴が作られないので、10秒位してから結果を取るようにした方が良いです。

経験的に、WSBの実行主体であるWBENGINE.exeが実行途中で異常終了した場合等、WSBジョブ履歴が記録されないこともあるので、必ず開始日付時刻等の確認が必要です。


PowershellでWSB実行:ベアメタルバックアップ(2)

具体的なスクリプト例

システムのベアメタル・バックアップ

Windowsサーバのシステム状態とCドライブ、Fドライブをバックアップする。

wbadmin start backup -backupTarget:W: -allCritical -include:F: -systemState


  • WBバックアップポリシー作成

$wbpolicy = New-WBPolicy

  • バックアップ先をWドライブに設定

$target = New-WBBackupTarget -VolumePath W:

Add-WBBackupTarget -Policy $wbpolicy -Target $target

  • ベアメタル回復のWBバックアップポリシーへの追加

Add-WBBareMetalRecovery -Policy $wbpolicy

  • システム状態のWBバックアップポリシーへの追加

Add-WBSystemState -Policy $wbpolicy

  • FドライブのWBバックアップポリシーへの追加

$volume = Get-WBVolume -VolumePath F:

Add-WBVolume -Policy $wbpolicy -Volume $volume

ここまでで、WBバックアップポリシーは完成です。続いて、バックアップ実行結果確認のために直前のWSBジョブ履歴の開始日時を退避します。

  • 直前のWSBジョブ履歴開始日時の退避

$previous_starttime = (Get-WBJob -Previous 1).StartTime

  • バックアップの実行

Start-WBBackup -Policy $wbpolicy -Force

  • 実行結果(WSBジョブ履歴)の取得

Start-Sleep -Seconds 10

$wbstatus = Get-WBJob -previous 1

  • WSBジョブ履歴(実行結果)の確認

WSBジョブ履歴の確認すべき項目は次のとおりです。

  1. StartTime(直近のジョブ以降である事
  2. JobType('Backup'である事)
  3. JobState('Completed'である事)
  4. HRESULT(0である事)

if (([datetime]$wbstatus.StartTime -gt [datetime]$previous_starttime) `

-and ($wbstatus.JobType -eq "Backup") `

-and ($wbstatus.JobState -eq "Completed") `

-and ($wbstatus.HRESULT -eq 0) ) `

 {echo "Backup Completed" } else {echo "Backup Failed"}


PowershellでWSB実行:仮想マシンバックアップ(3)

具体的なスクリプト例

Hyper-V仮想マシンのバックアップ

Hyper-V上の仮想マシン(Win2016A)をWドライブにバックアップする。

wbadmin start backup -backupTarget:W: -HyperV:Win2016A


  • WBバックアップポリシー作成

$wbpolicy = New-WBPolicy

  • バックアップ先をWドライブに設定

$target = New-WBBackupTarget -VolumePath W:

Add-WBBackupTarget -Policy $wbpolicy -Target $target```

  • 仮想マシン(Win2016A)のWBバックアップポリシーへの追加

$vm = Get-WBVirtualMachine | ? VMName -Match "Win2016A"

Add-WBVirtualMachine -Policy $wbpolicy -VirtualMachine $VM

ここで注意すべきことは、Get-VMで仮想マシンを確認できても、WSBの Get-WBVirtualMachineで確認できるとは限らないことです。経験的にチェックポイント(スナップショット)が作成されている仮想マシンを、Get-WBVirtualMachineで取得できませんでした。事前にチェックポイントを削除しておいてください。

ここまでで、WBバックアップポリシーは完成です。続いて、バックアップ実行結果確認のために直前のWSBジョブ履歴の開始日時を退避します。

  • 直前のWSBジョブ履歴の開始日時の退避

$previous_starttime = (Get-WBJob -Previous 1).StartTime

  • バックアップの実行

Start-WBBackup -Policy $wbpolicy -Force

  • 実行結果(WSBジョブ履歴)の取得

Start-Sleep -Seconds 10

$wbstatus = Get-WBJob -previous 1

  • WSBジョブ履歴(実行結果)の確認

WSBジョブ履歴の確認すべき項目は次のとおりです。

  1. StartTime(直近のジョブ以降である事)
  2. JobType('Backup'である事)
  3. JobState('Completed'である事)
  4. HRESULT(0である事)

if ( ([datetime]$wbstatus.StartTime -gt [datetime]$previous_starttime) `

-and ($wbstatus.JobType -eq "Backup") `

-and ($wbstatus.JobState -eq "Completed") `

-and ($wbstatus.HRESULT -eq 0) ) `

{echo "Backup Completed" } else {echo "Backup Failed"}


PowershellでWSB実行:ボリュームバックアップ(4)

具体的なスクリプト例

ボリュームのバックアップ

特定のボリューム(Fドライブ)をWドライブにバックアップする。

wbadmin start backup -backupTarget:W: -include:F: 

  • WBバックアップポリシー作成

 $wbpolicy = New-WBPolicy

  • バックアップ先をWドライブに設定

$target = New-WBBackupTarget -VolumePath W:

Add-WBBackupTarget -Policy $wbpolicy -Target $target

  • FドライブのWBバックアップポリシーへの追加

$volume = Get-WBVolume -VolumePath F:

Add-WBVolume -Policy $wbpolicy -Volume $volume

ここまでで、WBバックアップポリシーは完成です。

  • 直前のWSBジョブ履歴の開始日時の退避

$previous_starttime = (Get-WBJob -Previous 1).StartTime

  • バックアップの実行

Start-WBBackup -Policy $wbpolicy -Force

  • 実行結果(WSBジョブ履歴)の取得

Start-Sleep -Seconds 10

$wbstatus = Get-WBJob -previous 1

  • WSBジョブ履歴(実行結果)の確認

if (([datetime]$wbstatus.StartTime -gt [datetime]$previous_starttime) `

-and ($wbstatus.JobType -eq "Backup") `

-and ($wbstatus.JobState -eq "Completed") `

-and ($wbstatus.HRESULT -eq 0) ) `

{echo "Backup Completed" } else {echo "Backup Failed"}


PowershellでWSB実行:仮想マシンリストア(5)

具体的なスクリプト例

BMR(Bare Metal Recovery)リストア

通常、Windowsサーバのシステムリストアは、インストールメディアからの回復しかできないので説明は割愛します。

Hyper-V仮想マシンのリストア

WドライブにバックアップしたHyper-V仮想マシン(Win2016A)を元の場所(F:\Hyper-V)にリストアします。

wbadmin start recovery -backupTarget:W: -version:03/15/2020-01:23 -itemtype:Hyperv -items:Win2016A -recoveryTarget:F:\Hyper-V


  • バックアップ元をWドライブに設定

$target = New-WBBackupTarget -VolumePath W:

  • バックアップ元からバックアップセットを検索

$backupset = Get-WBBackupSet -BackupTarget $target -MachineName $env:ComputerName | ? Application -Match "Win2016A"

  • 最新のバックアップセットを確認

複数バックアップ世代が作られていたら、直近のものを採用します。

$bs = $backupset.count - 1

$ap = $backupset[$bs].Application | ? Identifier -match "HyperV"

$cp = $ap.Component | ? VMName -match "Win2016A"

  • 直前のWSBジョブ履歴の開始日時の退避

$previous_starttime = (Get-WBJob -Previous 1).StartTime

  • リストアの実行

Start-WBHyperVRecovery -BackupSet $backupset[$bs] -VMInBackup $cp -TargetPath F:\Hyper-V -Force

  • 実行結果(WSBジョブ履歴)の取得

Start-Sleep -Seconds 10

$wbstatus = Get-WBJob -previous 1

  • WSBジョブ履歴(実行結果)の確認

  1. StartTime(直前のジョブ以降である事)
  2. JobType('ApplicationRecovery'である事)
  3. JobState('Completed'である事)
  4. HRESULT(0である事)

if (([datetime]$wbstatus.StartTime -gt [datetime]$previous_starttime) `

-and ($wbstatus.JobType -eq "ApplicationRecovery") `

-and ($wbstatus.JobState -eq "Completed") `

-and ($wbstatus.HRESULT -eq 0) ) `

{echo "Backup Completed" } else {echo "Backup Failed"}


PowershellでWSB実行: ボリュームリストア(6)

具体的なスクリプト例

ボリュームリストア

Wドライブにバックアップしたボリューム(Fドライブ)を元の場所にリストアします。

wbadmin start recovery -version:03/15/2020-01:23 -backupTarget:W: -itemtype:Volume -items:F:


  • バックアップ元をWドライブに設定

$target = New-WBBackupTarget -VolumePath W:

  • バックアップ元からバックアップセットを検索

$backupset = Get-WBBackupSet -BackupTarget $target -MachineName $env:ComputerName | ? Volume -Match "F:"

  • 最新のバックアップセットを確認

複数バックアップ世代が作られていたら、直近のものを採用します。

$bs = $backupset.count - 1

$vl = $backupset[$bs].Volume | ? {$_.MountPath -match "F:"}

  • 直前のWSBジョブ履歴の開始日時の退避

$previous_starttime = (Get-WBJob -Previous 1).StartTime

  • リストアの実行

Start-WBVolumeRecovery -BackupSet $backupset[$bs] -VolumeInBackup $vl -Force

  • 実行結果(WSBジョブ履歴)の取得

Start-Sleep -Seconds 10

$wbstatus = Get-WBJob -previous 1

  • WSBジョブ履歴(実行結果)の確認

  1. StartTime(直前のジョブ以降である事)
  2. JobType('VolumeRecovery'である事)
  3. JobState('Completed'である事)
  4. HRESULT(0である事)

if (([datetime]$wbstatus.StartTime -gt [datetime]$previous_starttime) `

-and ($wbstatus.JobType -eq "VolumeRecovery") `

-and ($wbstatus.JobState -eq "Completed") `

-and ($wbstatus.HRESULT -eq 0) ) `

{echo "Backup Completed" } else {echo "Backup Failed"}