SCROLL
Среднее время на прочтение: 3 мин.

Автоматизируем процесс создания бекапов серверных систем Windows Server 2008 R2, 2012 R2, с помощью скрипта для PowerShell.

Разберем как автоматизировать процесс создания бекапов серверных систем, применимый к Windows Server 2008 R2, 2012 R2. Делать бекапы мы будем с помощью скрипта для PowerShell.

По-умолчанию в PowerShell включена максимальная политика безопасности, которая позволяет выполнять команды PowerShell в командной строке, но не позволяет в той же командной строке выполнить скрипт с командами PowerShell. Разрешим выполнение скриптов в Powershell, выполним команду в CMD или в PowerShell:

powershell -Command Set-ExecutionPolicy RemoteSigned

Выполнять бекап системы мы будем средствами системы, с помощью оснастки Windows Server Backup. Поэтому если данная оснастка не добавлена в систему, добавляем ее и так же добавляем инструменты командной строки (Command-line Tools) для работы с Windows Server Backup через командную строку.

План работы скрипта бекапа:

  1. Создание плана бекапа, бекапить мы будем основные узлы системы (Восстановление исходного состояния системы, Состояние системы, Критические области системы, Теневые копии)
  2. Подготовка месторасположения бекапа.
  3. Запуск создания бекапа.
  4. Сжатие полученного бекапа.
  5. Удаление старых бекапов и чистка хвостов.

Согласно данному плану, я разработал данный скрипт, который будет выполнять бекап системы, сжимать полученный бекап и чистить старые архивы бекапов, в целях экономии места. Есть небольшие различия в использовании командлетов командной строки между Windows Server 2008 R2 и Windows Server 2012 R2. Представлю варианты скрипта, для каждой из систем. Скрипт полностью с комментариями, разобраться в нем можно легко:

Windows Server 2008 R2

###########################################################################
# Описание: Автоматизация создания бекапа системы (Windows Backup Server) #
# Автор: Jakonda                                                          #
# Дата создания: 21.07.17                                                 #
###########################################################################
#
# Переменные для работы бекапа GPO
#
# Каталог расположения архиватора 7-Zip
$7z = "C:\7z\7z.exe"
# Зададим алиас для запуска 7-Zip
set-alias SZ $7z
# Текущая дата
$CurrentDate = get-date -format dd.MM.yyyy
# Имя домен-контроллера
$DC_Name = "SRV-DC1"
# Путь к сетевой папке, в который хранить бекапы
$Path_Net_Drive = "\\192.168.1.3\All_Backups\DC\WSB\" + $DC_Name
# Удалять бекапы старше ... дней (Указывать период в днях)
$StoreBackup_Period = 7
#
#
# Функция для создания структуры каталогов
Function CheckPath ($Path) {
$Path_Exists = Test-Path -Path $Path
If ($Path_Exists -eq $False) {New-Item $Path -type directory}
}
#
# Функция удаления старых бекапов
Function RemoveOldBackup ($Path, $Extention, $CountDays) {
$LastWrite = Get-Date.Add-Days(-$CountDays)
$FoundFiles = Get-Childitem $Path -Include $Extension -Recurse | Where{$_.LastWriteTime -le "$LastWrite"}
Foreach ($File in $FoundFiles){
Remove-Item $File.FullName | Out-Null
}
}
# Блок процедуры создания бекапа системы
#
# Подключаем оснастку Windows Server Backup
Add-PSSnapin Windows.Serverbackup -ErrorAction SilentlyContinue
# Создаем задание бекапа
$policy = New-WBPolicy
# Определяем в переменную путь бекапа
$target = New-WBBackupTarget -NetworkPath $Path_Net_Drive
# Добавляем в задание бекапить Bare Mental Recovery (Восстановление исходного состояния системы)
Add-WBBareMetalRecovery -Policy $policy
# Добавляем в задание бекапить System State (Состояние системы)
Add-WBSystemState -policy $policy
# Добавляем в задание бекапить критические области на жестком диске
Add-WBVolume -Policy $policy -Volume (Get-WBVolume -CriticalVolumes)
# Добавляем в задание параметр VSS (Теневой копии)
Set-WBVssBackupOptions -policy $policy -VssCopyBackup
# Добавляем в задание путь бекапа
Add-WBBackupTarget -Policy $policy -Target $target
#
# Создаем каталог для бекапов
CheckPath $Path_Net_Drive | Out-Null
#
# Запускаем создание бекапа
Start-WBBackup -Policy $policy
#
# Проверяем результат выполнения бекапа
# Если бекап завершился успешно
if ((Get-WBSummary).LastBackupResultHR -eq 0) {
# Переименовываем папку с созданным бекапом в формат текущей даты
Rename-Item $target\WindowsImageBackup "$CurrentDate" | Out-Null
# Если архиватор 7-Zip присутствует, то архивируем бекап
If (Test-Path -Path $7z) {
SZ a "$target\$CurrentDate.7z" -m0=LZMA2:d=96m:fb=128 -mx=9 -mmt=2 "$target\$CurrentDate" | Out-Null
}
else { 
exit 
}
# Подчищаем за собой, удаляем исходную папку бекапа
Remove-Item $target\$CurrentDate -recurse -force | Out-Null
# Удаляем старые архивы бекапа в папке
RemoveOldBackup $target "*.7z" $StoreBackup_Period
}

Windows Server 2012 R2

###########################################################################
# Описание: Автоматизация создания бекапа системы (Windows Backup Server) #
# Автор: Jakonda                                                          #
# Дата создания: 21.07.17                                                 #
###########################################################################
#
# Переменные для работы бекапа GPO
#
# Каталог расположения архиватора 7-Zip
$7z = "C:\7z\7z.exe"
# Зададим алиас для запуска 7-Zip
set-alias SZ $7z
# Текущая дата
$CurrentDate = get-date -format dd.MM.yyyy
# Имя домен-контроллера
$DC_Name = "SRV-DC1"
# Путь к сетевой папке, в который хранить бекапы
$Path_Net_Drive = "\\192.168.1.3\All_Backups\DC\WSB\" + $DC_Name
# Удалять бекапы старше ... дней (Указывать период в днях)
$StoreBackup_Period = 7
#
#
# Функция для создания структуры каталогов
Function CheckPath ($Path) {
$Path_Exists = Test-Path -Path $Path
If ($Path_Exists -eq $False) {New-Item $Path -type directory}
}
#
# Функция удаления старых бекапов
Function RemoveOldBackup ($Path, $Extention, $CountDays) {
$LastWrite = (Get-Date).AddDays(-$CountDays)
$FoundFiles = Get-Childitem $Path -Include $Extension -Recurse | Where{$_.LastWriteTime -le "$LastWrite"}
Foreach ($File in $FoundFiles){
Remove-Item $File.FullName | Out-Null
}
}
# Блок процедуры создания бекапа системы
#
# Подключаем оснастку Windows Server Backup
Add-PSSnapin Windows.Serverbackup -ErrorAction SilentlyContinue
# Создаем задание бекапа
$policy = New-WBPolicy
# Определяем в переменную путь бекапа
$target = New-WBBackupTarget -NetworkPath $Path_Net_Drive
# Добавляем в задание бекапить Bare Mental Recovery (Восстановление исходного состояния системы)
Add-WBBareMetalRecovery -Policy $policy
# Добавляем в задание бекапить System State (Состояние системы)
Add-WBSystemState -policy $policy
# Добавляем в задание бекапить критические области на жестком диске
Add-WBVolume -Policy $policy -Volume (Get-WBVolume -CriticalVolumes)
# Добавляем в задание параметр VSS (Теневой копии)
Set-WBVssBackupOptions -policy $policy -VssCopyBackup
# Добавляем в задание путь бекапа
Add-WBBackupTarget -Policy $policy -Target $target
#
# Создаем каталог для бекапов
CheckPath $Path_Net_Drive | Out-Null
#
# Запускаем создание бекапа
Start-WBBackup -Policy $policy
#
# Проверяем результат выполнения бекапа
# Если бекап завершился успешно
if ((Get-WBSummary).LastBackupResultHR -eq 0) {
# Переименовываем папку с созданным бекапом в формат текущей даты
Rename-Item $target\WindowsImageBackup "$CurrentDate" | Out-Null
# Если архиватор 7-Zip присутствует, то архивируем бекап
If (Test-Path -Path $7z) {
SZ a "$target\$CurrentDate.7z" -m0=LZMA2:d=96m:fb=128 -mx=9 -mmt=2 "$target\$CurrentDate" | Out-Null
}
else { 
exit 
}
# Подчищаем за собой, удаляем исходную папку бекапа
Remove-Item $target\$CurrentDate -recurse -force | Out-Null
# Удаляем старые архивы бекапа в папке
RemoveOldBackup $target "*.7z" $StoreBackup_Period
}

Данный скрипт проверен и он полностью рабочий, ставим его в планировщик и наслаждаемся автоматизацией процесса создания бекапов.

Обсуждение

12 комментариев
  • Приветствую!
    Ошибка из-за неправильно указанного метода комадлета Get-Date.
    Должно быть — Get-Date.Adddays(-7)

  • После прохождения бэкапа выдается ошибка:
    Get-Date.Add-Days : The term ‘Get-Date.Add-Days’ is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path
    was included, verify that the path is correct and try again.
    At C:\Users\Administrator\Documents\Untitled1.ps1:25 char:14
    + $LastWrite = Get-Date.Add-Days(-$CountDays)
    + ~~~~~~~~~~~~~~~~~
    + CategoryInfo : ObjectNotFound: (Get-Date.Add-Days:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

    Could not compare «06/03/2020 14:09:40» to «». Error: «Cannot convert value «» to type «System.DateTime». Error: «Строка не распознана как действительное значение DateTime.»»
    At C:\Users\Administrator\Documents\Untitled1.ps1:26 char:72
    + … nclude $Extension -Recurse | Where{$_.LastWriteTime -le «$LastWrite»}
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : ComparisonFailure

  • Спасибо за превосходную работу!
    Мог бы ты ответить:
    1. каким образом
    При выполнении скрипта бэкапа, система подсоединяется к сетевой папке (учетные данные). И от имени кого выполняется бэкап?
    Мне нужен пользователь с ролью «Оператор Архива».
    Насколько я помню в wbadmin и в графическом интерфейсе, учетка и пароль к сетевому расположению задается в явном виде, а в скрипте я этого не вижу.
    2. Можно ли архивирование и очистку старых бэкапов, проводить на стороне сетевого расположения? К примеру, если серверов много. Сложно ли это реализовать?

    • Это ответ на комментарий Ananda

      Спасибо за отзыв!

      1) В моем случае скрипт выполняется от администратора домена, и доступ на сетевую папку у него есть. Я думаю можно любого пользователя указать, главное чтоб был доступ к сетевой папке у него.
      2) Да можно, правда нужно подумать как лучше это реализовать..

  • согласно данноМУ планУ

  • А восстанавливать то как? 🙂

  • Тогда как его можно рекомендовать если он такой сложный, а то что Вы ссылку удалили там все просто.

    • Это ответ на комментарий Макс

      Там ничего сложного нет, используются только инструменты самой системы Windows. Только скрипт делает немного больше чем просто бекап, а именно архивирует полученный бекап и удаляет старые бекапы, в целях экономии места на файловом хранилище.

      Такой же бекап можно делать непосредственно силами оснастки Windows Server Backup, даже планировщик можно там настроить, только мне захотелось сделать по своему.

      Ссылки не публикуются.

  • Зачем так сложно, есть утилита wbadmin.

    • Это ответ на комментарий Макс

      Нужен был инструмент выполняющий ровно то что мне нужно, поэтому и был написан такой скрипт.