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

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

Создание бекапов неотъемлемая часть повседневной работы в IT сфере. Имеющийся в наличии бекап всегда может восстановить работоспособность того или иного узла. Сегодня мы разберем как автоматизировать процесс создания бекапов Групповых политик (GPO) на Windows Server 2008 R2. Делать бекапы мы будем с помощью скрипта для PowerShell.

 

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

powershell -Command Set-ExecutionPolicy RemoteSigned

 

Теперь можно приступать к написанию скрипта, который будет выполнять бекап GPO. В ходе работы над написанием скрипта, у меня получилось два варианта скрипта:

  1. Автоматическое создание бекапа всех GPO, размещение их на сетевом ресурсе в архивированном виде.
  2. Автоматическое первоначальное создание бакапа всех GPO, последующие запуски скрипта будут бекапить GPO только если в них были сделаны какие либо изменения.

Все скрипты с комментариями, поэтому разобраться в них не составит труда.

 

[stextbox id=’info’]

Хочу обратить внимание что скрипты сохраняем в формате скриптов для PowerShell, а именно с расшинением .ps1 Для того чтобы выполнить скрипт PowerShell из CMD нужно выполнять его так:

powershell -File <путь к файлу скрипта> (прим. powershell -File C:\test_script.ps1)

[/stextbox]

 

Первый скрипт с размещением бекапов на сетевом ресурсе в архивированном виде

##############################################################
# Описание: Скрипт бекапа 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")

Если выполнить скрипт, то мы получим данные вида как показано ниже на скриншоте.

1_w2

 

Второй скрипт с первоначальным полным бекапом и последующими в том случае, если в 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
 } 
}

Если выполнить скрипт, то мы получим данные вида как показано ниже на скриншоте.

1_1

Работоспособность представленных выше скриптов проверена на 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'

На этом мы разобрали различные варианты создания бекапов и рассмотрели способы их восстановления.

 

Понравилась или оказалась полезной статья, поблагодари автора

 

Обсуждение

0 комментариев

Нет комментариев.