Windows server backup powershell

We’ve talked about Windows Server Backup feature in a previous article posted on Poweradmin blog. I’ve shown you how to install this feature and how to create and schedule Windows Server backups using the backup console. In this article I want to show you how to achieve similar results by using a Powershell script. I will try to describe each line so you can understand the logic behind it. Note that I use Windows PowerShell Integrated Scripting Environment (ISE) to create Windows scripts.

#We will start by creating a new Windows Backup(WB) policy object:

$backupPolicy = New-WBPolicy

#We will add the System State and the Bare Metal Recovery options to our new policy:

Add-WBSystemState -Policy $backupPolicy

Add-WBBareMetalRecovery -Policy $backupPolicy

#We’ll need to set a location on where the backups will be stored, I will use a local disk attached to my server. The Get-WBDisk cmdlet displays all disks attached to the server so I’ve used the $disk[1] to specify the needed partition.

$disk = Get-WBDisk

Write-Host $disk

$backupTarget = New-WBBackupTarget -Disk $disk[1]

Add-WBBackupTarget -Policy $backupPolicy -Target $backupTarget

The script will display the backup destination disk information:

#We’ll set the Vss Full Backup option to our policy:

Set-WBVssBackupOption -Policy $backupPolicy -VssFullBackup

#The backup schedule can be configured using the Set-WBSchedule cmdlet. I’ve set the task to run everyday at 9 am:

Set-WBSchedule -Policy $backupPolicy -Schedule 09:00

#Normally, we would not be allowed to run a one-time only backup this is why we’ll have to force our policy by executing the following command:

Set-WBPolicy -force -policy $backupPolicy

#All that’s left to do is to start the backup process:

Start-WBBackup -Policy $backupPolicy

The backup will now start, Windows Powershell ISE will display a status of the backup process. You will be prompted once the the operation is completed.

You can also use the Windows Backup Console to verify the status of the backup operation. Note that the scheduled task will be configured as specified in the script (everyday at 9 am full VSS backup)

That’s about it for this script folks, hope you will enjoy it when automatizing Windows Server backup tasks. You can further develop the script to run backups for multiple machines at the same time. Note that you can also use a network share as the backup destination. Wish you all the best and stay tuned for the following articles from IT training day.

I needed a script to be able to do an on demand backup of a windows server without installing 3rd party software on it. The idea is that physical or virtual, if I needed a quick backup of a box, including a log for auditing, I could have a click to run solution.

Here is that solution. It works for sure on Server 2012, 2012 R2, and 2016 Boxes. 2008 / R2 may need some additional tweaking.

#################################################################
#   Windows Server Backup                                       #
#   Created by - Cameron Joyce                                  #
#   Last Modified - May 2nd 2017                                #
#################################################################
# This script is used to do an on demand backup of a windows server (server 2008 or newer). 

# Variables
$date = (Get-Date).ToString('MM-dd-yyyy')
$time = (Get-Date).ToString('MM-dd-yyyy HH:mm:ss')
$hostname = $env:COMPUTERNAME
$backupserver = "your.server.fqdn"
$osversion = (Get-CimInstance Win32_OperatingSystem).version
$neterr = $false

# Setup folder and logfile.
If(Test-Connection -ComputerName $backupserver -count 1 -Quiet){
    # Try / Catch block for WMI errors. A client that passes Test-Connection may not have PSRemoting enabled and will error. This will handle that.
    Try{
        $ErrorActionPreference = "Stop"
        If(!(Test-Path "\\$backupserver\wsbackups\$hostname")){
            New-Item "\\$backupserver\wsbackups\$hostname" -Type Directory
        }
    }
    Catch [System.Management.Automation.Remoting.PSRemotingTransportException]{
        Write-Warning "Failed connection to backup server."
        $neterr = $true
        If($neterr -eq $true){
            Send-MailMessage -From "smtp@address.com" -To "rcpt@address.com" -Subject "$hostname failed scripted backup. Unable to connect to network storage." -Body "$hostname failed backup because it was unable to connect to '
            $backupserver. Please check the connections and try again." -SmtpServer "srvr.server.com"
        }
        Break
    }
    Finally{
        $ErrorActionPreference = "Continue"
    }
}

# Create Directories and logs.
If(!(Test-Path "\\$backupserver\wsbackups\$hostname\$Date")){
    New-Item "\\$backupserver\wsbackups\$hostname\$Date" -Type Directory
}
$logfile = "\\$backupserver\wsbackups\$hostname\$date\$hostname.$date.txt"

# Verify WSB is installed and load modules. If it is not installed, install it.
Import-Module ServerManager
$bkup = Get-WindowsFeature *backup*
# This if loop contains the commands for install on both 2008 - 2012 as well as server 2016.
If($bkup.InstallState -like "Available"){
    Write-Host "Installing windows server backup role."
    Write-Output "Installing windows server backup role." | Out-File $logfile -append
    If($osversion -like "6.3*" -or "10*"){
    Add-WindowsFeature -Name Windows-Server-Backup -Restart:$false
    }
    Else{Add-WindowsFeature -Name Backup-Features -IncludeAllSubFeature:$true -Restart:$false}
}
Else{
    Write-Host "Server backup is already installed."
    Write-Output "Server backup is already installed." | Out-File $logfile -append
}

# Execute Backup.
Write-Output "Starting Backup at $time" | Out-File $logfile -append
& cmd.exe /c "wbadmin start backup -backupTarget:\\$backupserver\wsbackups\$hostname\$date -allCritical -systemState -vssFull -quiet" | Out-File $logfile -Append
Write-Output "Backup completed at $time" | Out-File $logfile -append

# Look for backup errors.
$eventid4 = $false
$eventlist = Get-WinEvent -logname Microsoft-Windows-Backup | Where {$_.timecreated -gt (Get-Date).Addminutes(-5)} | Select Message
Foreach($line in $table){
    If($line -like "The backup operation has finished successfully."){
        $eventid4 = $true
    }
}

# Send success / failure email.
If($eventid4 -eq $true){
    Write-Host "Backup Success!"
    Send-MailMessage -From "$hostname@domain.com" -To "rcpt@domain.com" -Subject "$hostname has successfully backed up." -Body "Review attachment for backup log." -Attachments "$logfile" -SmtpServer "smtp.server.com"
}
ElseIf($eventid4 -eq $false){
    Write-Host "Backup Failed"
    Send-MailMessage -From "$hostname@domain.com" -To "rcpt@domain.com" -Subject "$hostname has failed backedup." -Body "Review attachment for backup log." -Attachments "$logfile" -SmtpServer "smtp.server.com"
}

Skip to content

If you would like to automate your Windows Server Backup workflows, you can use the following Powershell snippet.

1. Install Windows feature (if not already installed)

Firstly check if the Windows Server Backup feature is installed on the Windows Server machine. The easiest way is to execute the following statement in a Powershell Window which will install the feature if it is not installed yet.

Install-WindowsFeature Windows-Server-Backup

Note: if the feature is already installed you will see the following output stating “NoChangeNeeded”, which is OK.

Success Restart Needed Exit Code      Feature Result
------- -------------- ---------      --------------
True    No             NoChangeNeeded {}

2. Run following snippet

Run the snippet below to run a Windows Server Backup. This script contains comments explaining the various steps.

# ----------------------------------------------------------
# Check if Powershell is opened with Administrator rights.
# If not, re-open this script asking for Administrator rights.
# ----------------------------------------------------------
param([switch]$Elevated)
function Test-Admin {
    $currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent())
    $currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
}
if ((Test-Admin) -eq $false)  {
    if ($elevated) {
        # tried to elevate, did not work, aborting
    } else {
        Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -noexit -file "{0}" -elevated' -f ($myinvocation.MyCommand.Definition))
    }
    exit
}
# ----------------------------------------------------------

# Install Windows feature if it isn't installed already..
Install-WindowsFeature Windows-Server-Backup

$Policy = New-WBPolicy

# Option 1: Enable the line below to backup the current system state. This includes many things such as installed device drivers,
# most of the Windows Directory, the Windows Registry, the Active Directory config (where applicable) etc.
Add-WBSystemState $Policy

# Option 2: the command below will include the system volume (C partition) to the backup to enable a full server restore
# Only enable this line if this is what you want.
Add-WBBareMetalRecovery $Policy

# Option 3: enable the line below to specify the locations manually that you want to backup (e.g. a single partition or folder)
# You can duplicate this line to include multiple locations in the backup.
# Specify the path of files/folders/volumes which we want to backup
New-WBFileSpec -FileSpec "D:\MyApplication" | Add-WBFileSpec -Policy $Policy

# Destination where the backup will be saved to (when specifying "D:\" the full output dir will defaults to D:\WindowsImageBackup)
$BackupLocation = New-WBBackupTarget -VolumePath "D:\" 
Add-WBBackupTarget -Policy $Policy -Target $BackupLocation

Set-WBVssBackupOptions -Policy $Policy -VssCopyBackup

# Print configured settings
$Policy

# Wait for confirmation of user..
Write-Output "Check settings above and confirm these are correct. Press any key to start the backup.."
Read-Host

Write-Output "-----------------------------------------"
Write-Output "Starting backup process, this might take some time..."
Write-Output "-----------------------------------------"

# Start backup process
Start-WBBackup -Policy $Policy

You can read more about the various options in the Microsoft documentation at: https://docs.microsoft.com/en-us/powershell/module/windowsserverbackup/?view=windowsserver2022-ps

Good luck!

В этой статье мы поговорим об особенностях резервного копирования контроллеров домена Active Directory, рассмотрим, как настроить автоматическое резервное копирование AD с помощью PowerShell и встроенного Windows Server Backup.

Содержание:

  • Нужно ли бэкапить Active Directory?
  • Как проверить дату последнего бэкапа контроллера домена Active Directory?
  • Бэкап контроллера домена AD с помощью Windows Server Backup
  • Резервное копирование Active Directory с помощью PowerShell

Нужно ли бэкапить Active Directory?

Одним из способов повышения отказоустойчивой и распределения нагрузки в Active Directory является развертывание дополнительных контроллеров домена. В такой среде база AD реплицируется между всеми DC и при выходе из строя любого контроллера домена не происходит полный отказ сервиса. Клиенты смогут просто переключиться на оставшиеся DC. Администратор может затем быстро развернуть новый DC на площадке, реплицировать на него базу AD с оставшихся DC, а старый контроллер домена удалить согласно инструкции.

Однако наличие дополнительных контроллеров домена не поможет в случаях когда неисправны все контроллеры домена. Например, когда все DC инфицированы или зашифрованы (например в случае перехвата учетных данных администратора домена утилитой mimikatz), повреждений в логической структуре базы данных NTDS.DIT (которая была реплицирована на все DC), или в других катастрофических сценариях.

В общем, бэкапить AD можно и нужно. Как минимум вы должны регулярно создавать резервные копии ключевых контроллеров доменов, владельцев ролей FSMO (Flexible single-master operations). Вы можете получить список контролеров домена с ролями FSMO командой:

netdom query fsmo

Как проверить дату последнего бэкапа контроллера домена Active Directory?

Можно проверить, когда создавалась резервная копия текущего контроллера домена AD с помощью утилиты repadmin:

repadmin /showbackup

В данном примере видно, что последний раз бэкап DC и разделов AD выполнялся в 2021 году (скорее всего он не делался с момента развертывания контроллера домена).

время последнего резервного копирования контроллера AD

Узнать время последнего резервному копированию всех DC в домене:

repadmin /showbackup *

С помощью следующей команды можно узнать сколько раз выполнялось резервное копирование AD на конкретном DC:

(Get-ADReplicationAttributeMetadata -Object "CN=Configuration,DC=WINITPRO,DC=LOC" -Properties dSASignature -Server DC01).Version

Если ваши виртуальные контроллеры домена бэкапятся через снапшоты(см. пример с резервным копированием Hyper-V),, убедитесь что при ваша система резервного копирования обновляет в LDAP значение атрибута LastOriginatingChangeTime (содержит дату последнего резервного копирования).

Бэкап контроллера домена AD с помощью Windows Server Backup

Если у вас нет специального ПО для резервного копирования, для создания резервных копий AD можно использовать встроенный Windows Server Backup (этот компонент пришел на замену
NTBackup
).

Для резервного контроллера домена нужно создать резервную копию Состояния системы (System State). В System State бэкап попадает база Active Directory (NTDS.DIT), содержимое каталога SYSVOL с файлами групповых политик (GPO), DNS зоны, реестр, метаданные IIS, база данных службы сертификации AD CS, файлы загрузчика Windows, и другие системные файлы и ресурсы. Резервная копия создается через службу теневого копирования VSS.

Проверьте, установлен ли компонент Windows Server Backup с помощью PowerShell командлета Get-WindowsFeature:

Get-WindowsFeature Windows-Server-Backup

Get-WindowsFeature Windows-Server-Backup

Если компонент WSB отсутствует, установите его с помощью PowerShell:

Add-Windowsfeature Windows-Server-Backup –Includeallsubfeature

Или из Server Manager -> Features.

windows server backup установка

Я буду сохранять бэкап данного контроллера домена AD в сетевую папку на отдельном выделенном сервере для резервного копирования. Например, путь к каталогу будет таким
\\srvbak1\backup\dc01
. Измените NTFS разрешения на сетевой папке, чтобы права чтения-записи в каталог были только у SYSTEM, Domain Admins и Domain Controllers.

каталог для резевных копий Active Directory

Вы можете настроить автоматическое задание резервного копирования в графической MMC оснастке Windows Server Backup (
wbadmin.msc
). Недостаток этого инструмента — новая резервная копия в каталоге WindowsImageBackup будет перезаписывать старую. Чтобы хранить копии AD от разных дат, можно автоматизировать резервное копирование с помощью консольной утилиты wbadmin.exe.

Резервное копирование Active Directory с помощью PowerShell

Для автоматизации бэкапов контроллера домена воспользуемся PowerShell скриптом. Для хранения нескольких уровней копий AD мы будем хранить каждый бэкап в отдельном каталоге с датой создания копии в качестве имени папки.

При резервном копировании в сетевую папку поддерживается только режим создания полной резервной копии. Если вы подключите диск для бэкапов как локальное устройство (например, LUN через FC или iSCSI диск), для такого устройства служба VSS будет поддерживать режим инкрементального резервного копирования.

Базовая версия PowerShell скрипта резервного копирования DC будет выглядеть так (укажите UNC путь к сетевой папке:

$path="\\srvbak1\backup\dc1\"
Import-Module ServerManager
[string]$date = get-date -f 'yyyy-MM-dd'
$TargetUNC=$path+$date
$TestTargetUNC= Test-Path -Path $TargetUNC
if (!($TestTargetUNC)){
New-Item -Path $TargetUNC -ItemType directory
}
$WBadmin_cmd = "wbadmin.exe START BACKUP -backupTarget:$TargetUNC -systemState -noverify -vssCopy -quiet"
Invoke-Expression $WBadmin_cmd

Чтобы PowerShell скрипт удалял старые резервные копии (например, старше 60 дней), можно добавить такой код:

$Period = "-60" # Количество хранимых дней.
# Вычисляем дату после которой будем удалять файлы.
$CurrentDay = Get-Date
$ChDaysDel = $CurrentDay.AddDays($Period)
# Удаление файлов, дата создания которых больше заданного количества дней
GCI -Path $TargetUNC -Recurse | Where-Object {$_.CreationTime -LT $ChDaysDel} | RI -Recurse -Force
# Удаление пустых папок
GCI -Path $TargetUNC -Recurse | Where-Object {$_.PSIsContainer -and @(Get-ChildItem -Path $_.Fullname -Recurse | Where { -not $_.PSIsContainer }).Count -eq 0 } | RI -Recurse

При резервном копировании на локально подключенный диск, можно вместо такого скрипта можно корректно удалять старые копии с помощью команды:
$KeepVersion=10
$WBadmin_cmd = " wbadmin delete backup -keepVersions:$KeepVersion -quiet"
Invoke-Expression $WBadmin_cmd


В этом случае wbadmin будет хранить только последние 10 резервных копий. Более старые будут удалены.

Запустите данный скрипт. Должна появится консоль wbadmin с информацией о процессе создании теневой копии диска:

powershell скрипт для резевного копирования контроллера домена AD

Если бэкап выполнен успешно, в логе появятся сообщения:

The backup operation successfully completed.
The backup of volume (C:) completed successfully.
The backup of the system state successfully completed [11/15/24 12:51 PM].

Лог бэкапа хранится в каталоге
C:\Windows\Logs\WindowsServerBackup\
.

Теперь проверьте, что дата даты последнего бэкапа DC обновлена:

repadmin /showbackup

Проверь, что контроллер домена бы успешно забэкаплен

Размер каталога с резервной копией контроллера домена в сетевой папке в этом примере около 12 Гб. На выходе вы получили VHDX файл, который можно использовать для восстановления ОС через WSB, или вы можете вручную смонтировать VHDX файл и извлечь из него нужные файлы или папки.

VHDX файл с резервной копии DC

Если на площадке имеется несколько DC, то не обязательно бэкапить их все. Для экономии места достаточно периодически бэкапить только файл базы данных AD (ntds.dit). Для этого используйте следующие команды:

$WBadmin_cmd = "wbadmin start backup -backuptarget:$path -include:C:\Windows\NTDS\ntds.dit -quiet"
Invoke-Expression $WBadmin_cmd

Размер такого бэкапа будет составлять всего 50-500 Мб в зависимости от размера базы AD.

Для автоматического выполнения бэкапа по расписанию, создайте на DC создать скрипт
c:\ps\backup_ad.ps1
. Этот скрипт нужно запускать по расписанию через Task Scheduler. Можно создать задание планировщика из графического интерфейса или из PowerShell. Главное требование — задание должно запускать от имени SYSTEM с включенной опцией Run with highest privileges. Для бэкапа контролера домена AD три раза в неделю создайте следующее задание:

$trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Tuesday,Friday -At "01:00AM"
$User= "NT AUTHORITY\SYSTEM"
$Action= New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "c:\ps\backup_ad.ps1"
Register-ScheduledTask -TaskName "BackupADScript_PS" -Trigger $Trigger -User $User -Action $Action -RunLevel Highest –Force

задание планировщика для автоматического резервного копирования Active Directory

Итак, мы настроили резервное копирование на контроллере домена AD, а в следующей статье мы поговорим о способах восстановления Active Directory из имеющейся резервной копии.

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • Обновить windows 10 до windows 11 с сохранением данных
  • Total commander windows 7 x32
  • Приложение центр отзывов windows 10 что это
  • Как вернуть гаджеты на рабочий стол windows 10
  • Панель задач пропали значки windows 10