PowerShell - Резервное копирование групповых политик Active Directory (GPO)

PowerShell GPO backup scriptОперацию резервного копирования доменных объектов групповых политик (GPO) можно выполнить штатным способом с помощью консоли Group Policy Management (gpmc.msc), но если нам потребуется автоматизировать данный процесс, - можно использовать командлеты модуля GroupPolicy для PowerShell 2.0

Приведу пример скрипта, который выполняет резервное копирование GPO в том случае, если с момента последнего резервного копирования изменилось время модификации GPO (определение по наличию каталога с именем по отметке времени модификации):

# Блок переменных для резервного копирования GPO
# $BackupPath - Корневой каталог для сохранения GPO
# $GPONameMask - Маска имени GPO. "*" - для полного бэкапа
# $NearestDC - Контроллер домена на котором будут выполняться команды,
# если в качестве имени DC нужно указать имя текущего хоста , можно использовать значение
# [System.Net.Dns]::GetHostEntry([System.Net.Dns]::GetHostName()).HostName
#
$BackupPath = "\\FS\GPO-Backup$"
$GPONameMask = "KOM-*"
$NearestDC = "DC03.holding.com"
#
# Блок переменных для уведомлений по электронной почте в случае ошибок
# $gvEmailFrom – Email адрес отправителя
# $gvEmailTo – Email адрес получателя (например адрес группы рассылки для Администраторов AD)
# $gvSMTPServer – FQDN имя почтового сервера
#
$gvEmailFrom = "GPO-Backup@holding.com"
$gvEmailTo = "DST-GPO-Administrators@holding.com"
$gvSMTPServer = "Mail.holding.com"
#
# Блок отсылки уведомляющего письма об ошибках выполнения скрипта 
#
Trap {
If ($Error){
$vEmailSubj = "GPO Backup Error"
$vEmailBody = "Group Policy Backup Error on DC " + $NearestDC + "`n`nError : " + $Error
$vSMTP = New-Object Net.Mail.SMTPClient($gvSMTPServer)
$vSMTP.Send($gvEmailFrom, $gvEmailTo, $vEmailSubj, $vEmailBody) 
}
Break
} 
#
# Функция для создания структуры каталогов
#
Function Check-Folder ($Folder) {
      $CatExists = Test-Path -Path $Folder 
      If ($CatExists -eq $False) {New-Item $Folder -type directory}
}
#
# Блок процедуры резервного копирования GPO
#
Check-Folder $BackupPath | Out-Null
Import-Module GroupPolicy
$GPOs = Get-GPO -All -Server $NearestDC | Where-Object {$_.DisplayName -like $GPONameMask}
Foreach ($GPO in $GPOs) {
      $GPOFolder = $BackupPath + "\" + $GPO.Id
      Check-Folder $GPOFolder | Out-Null
      $FullPath = $GPOFolder + "\" + $GPO.ModificationTime.ToString("yyyy-MM-dd_HH-mm-ss")
      If (!(Test-Path -Path $FullPath)) {
            New-Item $FullPath -type directory | Out-Null
            Backup-GPO -Guid $GPO.Id -Path $FullPath -Server $NearestDC
            $ReportPath = $FullPath + "\report.html"
            Get-GPOReport -Guid $GPO.Id -Path $ReportPath -Server $NearestDC -ReportType HTML
      }                
}

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

Необходимо помнить то, что при создании резервной копии GPO не сохраняются WMI фильтры и политики IPSec, которые используются в этом GPO, а сохраняются лишь ссылки на них. Так же не сохраняется информация о привязке GPO к контейнерам/OU. Получить дополнительную информацию об этом можно из руководства Planning and Deploying Group Policy

Чтобы, в случае необходимости, можно было восстановить привязки GPO к контейнерам/OU, мы сможем воспользоваться информацией из отчета, который формируется после создания резервной копии.

А чтобы избежать возможных сложностей с резервным копированием и восстановлением WMI фильтров, рекомендую подумать об их замене на механизмы Group Policy Preferences (GPP).


Дополнительная информация:

Всего комментариев: 5 Комментировать

  1. Yegor Startsev /

    Максим, поясни, пожалуйста, момент замены фильтров WMI на GPP. Или я тебя не понял, или одно из двух =)

    1. Yegor Startsev /

      Алексей, что-то я заработался сегодня, извини за описку.

  2. Алексей Максимов /

    Я имею ввиду то, что всё что по классическим сценариям ранее делалось в GPO с помощью фильтров WMI сегодня можно реализовать с помощью GPP. Например ранее могло быть сделано несколько GPO в которых присутсвовали разные фильтры WMI, а теперь проще и удобней создавать один объект GPO и в нём настраивать применение его разных параметров в зависимости от разных условий нацеливания GPP (GPP Targeting)

    1. Yegor Startsev /

      Ясно, спасибо. Точно вчера замотался, и, "зацепившись глазом за абзац", сразу начал примерять GPP как замену типовому фильтру WMI отбора х64 систем для применения опций из раздела Политики. Понятно, что это бесполезно.

  3. buch /

    У меня получилась ситуация, когда временная папка, которая создаётся при бэкапе, не хотела удаляться и отреплицировалась на другие сервера. Для удаления помогла только перезагрузка. А для того, чтобы этого больше не повторялась есть статья http://support.microsoft.com/kb/2667462 где рекомендуется отредактировать параметр DFSR filter:
    DO_NOT_REMOVE_NtFrs_PreInstall_Directory,NtFrs_PreExisting___See_EventLog,MachineOld,UserOld,MachineStaging,UserStaging,AdmOld

Добавить комментарий