Содержание статьи:
Создание бекапов неотъемлемая часть повседневной работы в IT сфере. Имеющийся в наличии бекап всегда может восстановить работоспособность того или иного узла. Сегодня мы разберем как автоматизировать процесс создания бекапов Групповых политик (GPO) на Windows Server 2008 R2. Делать бекапы мы будем с помощью скрипта для PowerShell.
По-умолчанию в PowerShell включена максимальная политика безопасности, которая позволяет выполнять команды PowerShell в командной строке, но не позволяет в той же командной строке выполнить скрипт с командами PowerShell. Чтобы рез решить выполнение PowerShell скриптов, выполним команду либо в CMD либо в самом PowerShell:
powershell -Command Set-ExecutionPolicy RemoteSigned
Теперь можно приступать к написанию скрипта, который будет выполнять бекап GPO. В ходе работы над написанием скрипта, у меня получилось два варианта скрипта:
- Автоматическое создание бекапа всех GPO, размещение их на сетевом ресурсе в архивированном виде.
- Автоматическое первоначальное создание бакапа всех GPO, последующие запуски скрипта будут бекапить GPO только если в них были сделаны какие либо изменения.
Все скрипты с комментариями, поэтому разобраться в них не составит труда.
Хочу обратить внимание что скрипты сохраняем в формате скриптов для PowerShell, а именно с расшинением .ps1 Для того чтобы выполнить скрипт PowerShell из CMD нужно выполнять его так:
powershell -File <путь к файлу скрипта> (прим. powershell -File C:\test_script.ps1)
Первый скрипт с размещением бекапов на сетевом ресурсе в архивированном виде
##############################################################
# Описание: Скрипт бекапа GPO для PowerShell на сетевой диск #
# Автор: Jakonda #
# Дата создания:17.11.16 #
##############################################################
#
# Переменные для работы бекапа GPO
#
# Каталог расположения архиватора 7-Zip
$7z = "C:\7z\7z.exe"
# Текущая дата
$CurrentDate = get-date -format dd.MM.yyyy
# Имя домен-контроллера
$DC_Name = "SRV-SPARTA2"
# Параметры подключения к сетевому диску
$Letter_Net_Drive = "X:"
$Path_Net_Drive = "\\10.7.7.248\disky\IT\Backup_GPO"
# Каталог расположения бекапов
$BackupPath = $Letter_Net_Drive + "\" + $DC_Name + "\" + $CurrentDate
# Зададим алиас для запуска 7-Zip
set-alias SZ $7z
#
# Функция для создания структуры каталогов
#
Function CheckPath ($Path) {
$Path_Exists = Test-Path -Path $Path
If ($Path_Exists -eq $False) {New-Item $Path -type directory}
}
#
# Процедура резервного копирования GPO
#
# Подключаем сетевой диск для размещения бекапов
$Net_Drive = New-Object -com WScript.Network
$Net_Drive.EnumNetWorkDrives()
$Net_Drive.MapNetworkDrive("$Letter_Net_Drive","$Path_Net_Drive")
# Создаем каталог для бекапов
CheckPath $BackupPath | Out-Null
# Импортируем модуль групповой политики
Import-Module GroupPolicy
# Получаем данные по всем имеющимся групповым политикам в переменную относящихся к указанному домену
$All_GPO = Get-GPO -All
# Циклом проходимся по каждой группой политике и делаем ее бекап
Foreach ($Single_GPO in $All_GPO) {
# Заносим в переменную название групповой политики
$GPO_Name_Path = $Single_GPO.DisplayName
# Формируем в переменную полное название каталога групповой политики
$GPO_Path_Name = $BackupPath + "\" + $GPO_Name_Path
# Проверям наличие архиватора 7-Zip в системe, если он есть, то выполняем бекап GPO
If (Test-Path -Path $7z) {
# Создаем каталог с названием GPO
New-Item $GPO_Path_Name -type directory | Out-Null
# Выполняем бекап GPO в созданный каталог
Backup-GPO -Name $GPO_Name_Path -Path $GPO_Path_Name
# Формируем переменную для создания отчета по бекапу GPO
$Report = $GPO_Path_Name + "\" + $GPO_Name_Path + "_Report.html"
# Создаем отчет о создании бекапа GPO и помещаем его в каталог бекапа GPO
Get-GPOReport -Name $GPO_Name_Path -Path $Report -ReportType HTML
# Архивируем созданный бекап групповой политики
SZ a "$BackupPath\$GPO_Name_Path.7z" -m0=LZMA2:d=96m:fb=128 -mx=9 -mmt=2 "$GPO_Path_Name" | Out-Null
# Удаляем созданный бекап групповой политики, оставляем только архив бекапа
Remove-Item $GPO_Path_Name -recurse -force | Out-Null
}
}
# Отключаем сетевой диск, после того как закончили создание бекапа
$Net_Drive.RemoveNetworkDrive("$Letter_Net_Drive")
Если выполнить скрипт, то мы получим данные вида как показано ниже на скриншоте.
Второй скрипт с первоначальным полным бекапом и последующими в том случае, если в GPO были сделаны изменения.
###############################################################
# Описание: Скрипт бекапа GPO для PowerShell, с отслеживанием #
# даты модификации GPO #
# Автор: Jakonda #
# Дата создания:17.11.16 #
###############################################################
#
# Переменные для работы бекапа GPO
#
# Каталог расположения бекапов
$BackupPath = "C:\GPOBackup"
# Каталог расположения отчетов
$ReportPath = $BackupPath + "\" + "Reports"
#
# Функция для создания структуры каталогов
#
Function CheckPath ($Path) {
$Path_Exists = Test-Path -Path $Path
If ($Path_Exists -eq $False) {New-Item $Path -type directory}
}
#
# Процедура резервного копирования GPO
#
# Создаем каталог для бекапов
CheckPath $BackupPath | Out-Null
# Создаем каталог для отчетов
CheckPath $ReportPath | Out-Null
# Импортируем модуль групповой политики
Import-Module GroupPolicy
# Получаем данные по всем имеющимся групповым политикам в переменную относящихся к указанному домену
$All_GPO = Get-GPO -All
# Циклом проходимся по каждой группой политике и делаем ее бекап
Foreach ($Single_GPO in $All_GPO) {
# Заносим в переменную название групповой политики
$GPO_Name_Path = $Single_GPO.DisplayName
# Заносим в переменную дату модификации групповой политики
$GPO_Modif_Date = $Single_GPO.ModificationTime.ToString("yyyy-MM-dd_HH-mm-ss")
# Формируем в переменную полное название каталога групповой политики
$GPO_Path_Name = $BackupPath + "\" + $GPO_Name_Path + "-" + $GPO_Modif_Date
# Проверяем наличие бекапа текущей ГП, если название и дата модификации совпадает,
# то бекап текущей групповой политики не делаем. А если совпадений по названию и дате нет,
# то бекап текущей групповой политики делаем.
If (!(Test-Path -Path $GPO_Path_Name)) {
# Создаем каталог с названием GPO
New-Item $GPO_Path_Name -type directory | Out-Null
# Выполняем бекап GPO в созданный каталог
Backup-GPO -Name $GPO_Name_Path -Path $GPO_Path_Name
# Формируем переменную для создания отчета по бекапу GPO
$Report = $ReportPath + "\" + $GPO_Name_Path + "-" + $GPO_Modif_Date + "_Report.html"
# Создаем отчет о создании бекапа GPO
Get-GPOReport -Name $GPO_Name_Path -Path $Report -ReportType HTML
}
}
Если выполнить скрипт, то мы получим данные вида как показано ниже на скриншоте.
Работоспособность представленных выше скриптов проверена на Windows Server 2008 R2, по идее они должны работать и в других версия Windows (Но не проверял это). Теперь любой понравившийся скрипт можно загонять в планировщик и наслаждаться автоматическим бекапом ваших GPO в удобное нам место и в удобном для нас формате.
Восстановление GPO из резервной копии
Небольшая памятка как восстанавливать Групповую политику (GPO) из бекапа. Пример восстановление GPO используя ее название, в качестве названия у нас выступает название папки с групповой политикой, его и будем использовать при восстановлении.
Восстановление отдельно взятой групповой политики
Restore-GPO -Name 'GPO_TEST' –Path 'C:\BackupGPO\GPO_TEST'
Восстановление всех имеющихся бекапов групповых политик
Restore-GPO -All –Path 'C:\BackupGPO\GPO_TEST'
На этом мы разобрали различные варианты создания бекапов и рассмотрели способы их восстановления.
Понравилась или оказалась полезной статья, поблагодари автора
Оставить ответ