Windows Server バックアップでは、バックアップの保存先としてネットワークフォルダを指定する場合、保存可能な世代数としては第一世代のみとなっています。スケジュールされたバックアップが走るたびに古いバックアップは上書きされる動作となり、通常の方法では最新のバックアップのみしか保持することができません。そのため、世代管理を行いたい場合は、バックアップ保存先を専用ハードディスクもしくはボリュームにする必要があるのですが、スクリプトで世代管理を行うことができましたので残します。
Windows Server バックアップの仕様
Windows Backupの仕様については以下のようになっています。
バックアップ格納先 | 世代 | バックアップ格納先の容量が圧迫した場合の動作 |
バックアップ専用のハードディスクにバックアップする | 最大 512 世代保存 | シャドウ コピーを保存する容量が足りないと最も古い世代から自動的に削除 |
ボリュームにバックアップする | 最大 512 世代保存 | シャドウ コピーを保存する容量が足りないと最も古い世代から自動的に削除 |
共有ネットワーク フォルダーにバックアップする | 最新 1 世代のみ保存 | バックアップに失敗 |
バックアップ先フォルダの準備
事前準備としてバックアップの保存先対象から保存先となるフォルダを作成します。ここでは “backup” という名前でネットワークフォルダ上に作成して通常は見えないように “Backup$” で隠し共有フォルダとして共有化を行います。
※アクセス権は後ほど設定するバックアップスクリプトを構成するタスクスケジューラーで指定するアカウントと同じものを指定
New-Item "C:\Backup" -ItemType Directory New-SmbShare -Name Backup$ -Path "C:\Backup" -FullAccess "<アクセス権(Contoso\Domain Adminsなど)>" -ReadAccess "Everyone" -Description "windows backup share"
バックアップ用スクリプトの中身
ここでは第二世代までのバックアップを保存するスクリプト構成を参考として記載します。変数を変えることで世代数の変更は可能です。
流れとしてはまず wbadmin コマンドにてバックアップを取得し、バックアップ完了後にフォルダ名を変更後、最後に古いバックアップファイルを削除するといった動作となります。
※2日前のバックアップファイルがない場合は、削除は行われません。
また、こちらのスクリプトではバックアップ取得後に日付を付与しているため、リストア時はそのままではバックアップファイルを認識できないため、リストアのタイミングでフォルダ名からバックアップの日時を削除する必要となります。
#Variable $TODAY=(get-date).ToString("yyyyMMdd") $OLDESTDAY =(get-date).adddays(-2).ToString("yyyyMMdd") $NEWBK="$ENV:Computername"+"_"+"$TODAY" $OLDESTBK="$ENV:Computername"+"_"+"$OLDESTDAY" $BKDIR="\\<ネットワークフォルダ>\Backup$" #Get Backup wbadmin start backup -backupTarget:$BKDIR -allCritical -systemState -vssCopy -quiet #Rename Backup File Rename-Item $BKDIR\WindowsImageBackup\$ENV:Computername $NEWBK #Delete After 2 Days Remove-Item -path $BKDIR\WindowsImageBackup\$OLDESTBK -recurse -force
これを “wbscript.ps1” などの名前でPS1形式で保存し、特定のフォルダに配置します。
タスクスケジューラにて、保存したps1ファイルを登録し、スケジュールとネットワークフォルダにアクセス権のある実行アカウントを指定します。
この方法であればネットワークフォルダに対しても Windows Server バックアップにて世代の管理が行えるようになります。