none
Powershell: GPO Backup RRS feed

  • Вопрос

  • Есть скрипт для бэкапа доменных групповых политик и информации о них. Проблема в том, что забэкапив 157 из 450 GPO, скрипт выдает ошибку:

    "Backup-GPO : Библиотека, дисковод или носитель пусты. (Исключение из HRESULT: 0x800710D2)
    C:\Tasks\GPOBackup-RZDP1.ps1:20 знак:26
    + Get-GPO -All | Backup-GPO <<<<  -Path "$BackupFolder\$CurrentDate\GPO"
        + CategoryInfo          : NotSpecified: (:) [Backup-GPO], COMException
        + FullyQualifiedErrorId : System.Runtime.InteropServices.COMException,Microsoft.GroupPolicy.Commands.BackupGpoComm
       and"

    Вот содержимое самого скрипта:

    Import-Module GroupPolicy

    $BackupAge = 30
    $BackupFolder = "C:\GPO Backups"
    $CurrentDate = Get-Date -uformat "%Y-%m-%d_%H-%M"
    If (![IO.Directory]::Exists("$BackupFolder\$CurrentDate\GPO")) {
       [IO.Directory]::CreateDirectory("$BackupFolder\$CurrentDate\GPO")
    }

    Function Get-AllGPO {
       Get-GPOReport -all -ReportType xml | %{
          ([xml]$_).gpo | select name,@{n="SOMName";e={$_.LinksTo | % {$_.SOMName}}},@{n="SOMPath";e={$_.LinksTo | %{$_.SOMPath}}}
       }
    }

    Get-GPO -All | Backup-GPO -Path "$BackupFolder\$CurrentDate\GPO"
    Get-AllGPO | Format-List > "$BackupFolder\$CurrentDate\GPOLinks.txt"

    Get-ChildItem "$BackupFolder\$CurrentDate\GPO" -force | Where-Object {$_.LastWriteTime -le (Get-Date).AddDays(-$BackupAge)} | Remove-Item -force -recurse

    Добавление в начало скрипта конструкции

    $ErrorActionPreference = "SilentlyContinue"

    ничего не изменяет (т.е. бэкапятся опять все те же 157 объектов GPO).

    Изменение строки

    Get-GPO -All | Backup-GPO -Path "$BackupFolder\$CurrentDate\GPO"

    на

    Backup-GPO -All -Path "$BackupFolder\$CurrentDate\GPO"

    тоже ни к чему не приводит.

    27 апреля 2015 г. 16:27

Ответы

  • $ErrorActionPreference = "SilentlyContinue" - - Если реализовано в командлете и ошибка non-terminating

    $gpos = Get-GPO -All 
    foreach($gpo in $gpos)
    {
    	try {
    		$gpo | Backup-GPO -Path "$BackupFolder\$CurrentDate\GPO" -Verbose
    	}
    	catch {
    		Write-Host -ForegroundColor Red "$($gpo.DisplayName) - ERROR!"
    	}
    }

    Так же если добавить -Verbose, получим список GPO по GUID и можно отловить проблемную:

    Get-Gpo -Guid 31b2f340-016d-11d2-945f-00c04fb984f9

    • Помечено в качестве ответа Evgenii Alekseev 27 апреля 2015 г. 19:35
    27 апреля 2015 г. 18:44
    Отвечающий
  • $dir = "$BackupFolder\$CurrentDate\GPO"
    
    workflow  BackupGPO {
       param($GPOs,$dir)
        foreach -parallel ($GPO in $GPOs) { 
          Backup-GPO -Guid $gpo.Id -Path $dir -Domain rzdp.ru
       }
    }
    
    $GPOs = Get-GPO -All
    BackupGPO $GPOs $dir

    • Помечено в качестве ответа Evgenii Alekseev 27 апреля 2015 г. 20:03
    27 апреля 2015 г. 19:56
    Отвечающий

Все ответы

  • 1) Включить логирование GPMC

    https://technet.microsoft.com/en-us/library/cc737379(v=ws.10).aspx

    2) Сделать бэкап через оснасткуhttps://technet.microsoft.com/en-us/library/cc782589(v=ws.10).aspx

    https://support.microsoft.com/en-us/kb/978098/en-us - Как одна из проблем поискать политику, где используется Folder Redirect и попробовать ее исключить на время теста, если успешно, то попробовать рекомендации из статьи.

    27 апреля 2015 г. 16:41
    Отвечающий
  • Здравствуйте,

    Ознакомьтесь со следующей статьей "COMException: The library, drive, or media pool is empty. HRESULT: 0x800710D2", рассмотрен вариант решения схожей с Вашей ошибкой.

    Best Regards, Andrei ...
    Microsoft Certified Professional

    27 апреля 2015 г. 16:47
    Модератор
  • 1. Из ошибки не видно, на каком GPO скрипт свалился. Напомню, их более 450 штук и проверять все вручную не лучший вариант.

    2. Не понимаю, почему если не получилось забэкапить одну GPO, он не продолжает бэкапить остальные? Вроде конструкция

    $ErrorActionPreference = "SilentlyContinue"

    для этого и предназначена.

    Второй вопрос меня волнует больше. Как сделать, чтобы "битые" GPO просто пропускались (а в идеале писалось какой GPO не получилось забэкапить), а резервирование продолжалось своим чередом?

    27 апреля 2015 г. 17:14
  • $ErrorActionPreference = "SilentlyContinue" - - Если реализовано в командлете и ошибка non-terminating

    $gpos = Get-GPO -All 
    foreach($gpo in $gpos)
    {
    	try {
    		$gpo | Backup-GPO -Path "$BackupFolder\$CurrentDate\GPO" -Verbose
    	}
    	catch {
    		Write-Host -ForegroundColor Red "$($gpo.DisplayName) - ERROR!"
    	}
    }

    Так же если добавить -Verbose, получим список GPO по GUID и можно отловить проблемную:

    Get-Gpo -Guid 31b2f340-016d-11d2-945f-00c04fb984f9

    • Помечено в качестве ответа Evgenii Alekseev 27 апреля 2015 г. 19:35
    27 апреля 2015 г. 18:44
    Отвечающий
  • $ErrorActionPreference = "SilentlyContinue" - - Если реализовано в командлете и ошибка non-terminating

    $gpos = Get-GPO -All 
    foreach($gpo in $gpos)
    {
    	try {
    		$gpo | Backup-GPO -Path "$BackupFolder\$CurrentDate\GPO" -Verbose
    	}
    	catch {
    		Write-Host -ForegroundColor Red "$($gpo.DisplayName) - ERROR!"
    	}
    }

    Так же если добавить -Verbose, получим список GPO по GUID и можно отловить проблемную:

    Get-Gpo -Guid 31b2f340-016d-11d2-945f-00c04fb984f9

    Огромное спасибо! Отлично работает!

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

    Import-Module GroupPolicy

    $BackupAge = 30
    $BackupFolder = "C:\GPO Backups"
    $CurrentDate = Get-Date -uformat "%Y-%m-%d_%H-%M"
    If (![IO.Directory]::Exists("$BackupFolder\$CurrentDate\GPO")) {
       [IO.Directory]::CreateDirectory("$BackupFolder\$CurrentDate\GPO")
    }

    workflow  BackupGPO {
       param($GPO)
       foreach -parallel ($GPO in $GPOs) {
          Backup-GPO -Path "$BackupFolder\$CurrentDate\GPO" -Domain rzdp.ru
       }
    }

    $GPOs = Get-GPO -All
    BackupGPO $GPOs

    Скрипт долго висит, а в результате бэкап не происходит.

    27 апреля 2015 г. 19:41
  • $dir = "$BackupFolder\$CurrentDate\GPO"
    
    workflow  BackupGPO {
       param($GPOs,$dir)
        foreach -parallel ($GPO in $GPOs) { 
          Backup-GPO -Guid $gpo.Id -Path $dir -Domain rzdp.ru
       }
    }
    
    $GPOs = Get-GPO -All
    BackupGPO $GPOs $dir

    • Помечено в качестве ответа Evgenii Alekseev 27 апреля 2015 г. 20:03
    27 апреля 2015 г. 19:56
    Отвечающий
  • Еще раз спасибо!
    27 апреля 2015 г. 20:04