Wenn Sie ein Gruppenrichtlinienbackup erstellen, wird für jede GPO ein eigener Sicherungsordner angelegt. Der Sicherungsordner trägt allerdings nicht den Namen der GPO, sondern es wird für jede Sicherung eine eigene GUID erstellt.
Wenn Sie die Sicherung in der Domäne wiederherstellen möchten, in der Sie die Sicherung angelegt haben, ist das nicht problematisch, da die GPMC Ihnen über "Manage Backups" auf den Container "Group Policy Objects" die Details Ihrer Backups anzeigt. Wenn Sie die Backups allerdings auf eine andere Domäne übertragen wollen, fehlen Ihnen diese Informationen. Vor allem bei umfangreichen Backups hilft dann nur eine gute Dokumenation oder die folgenden beiden Funktionen, die einen Backup-Ordner einlesen und die relevanten Informationen auslesen können.
ConvertFrom-GPVersion konvertiert die 32-Bit Versionsnummern der Computer- bzw. Benutzerkonfiguration in einen dezimalen Versionswert. Sie wird von Get-GPOBackupInfoFromXML verwendet, um die korrekte Version der User-bzw. Computerkonfiguration zu berechnen. Beide Funktionen sind auch Bestandteil des aktuellen GPHelper-Powershellmoduls.
function ConvertFrom-GPVersion
{
<#
.SYNOPSIS
Converts the Group Policy Version-Number into a Computer-/User Version Number
.EXAMPLE
ConvertFrom-GPVersion -VersionNumber 65537
converts the 32-Bit Represenation of the Version-Number into a 16-Bit Value
.NOTES
Group-Policys Version-Number for Computer- and Userversion are represented in one 32-Bit Value. This Function converts
the number back into a 16-Bit Value.
#>
[CmdletBinding()]
param(
[Parameter(Mandatory=$true)]
[ValidateRange(0,4294967295)]
[int]$VersionNumber
)
[regex]$regex = '(\d{16})?'
If ( $VersionNumber -lt [int]65536 )
{
$VersionBinary = ([convert]::ToString($VersionNumber,2)).padleft(16,'0')
Write-Verbose -Message $VersionBinary
[convert]::ToUInt64($VersionBinary,2)
}
Else
{
$VersionBinary = ([convert]::ToString($VersionNumber,2)).padleft(32,'0')
Write-Verbose -Message $VersionBinary
$Versions =$regex.Matches($VersionBinary) | Select-Object -ExpandProperty Value -skip 1 -First 1
[convert]::ToUInt64($Versions,2)
}
}
function Get-GPOBackupInfoFromXml {
<#
.SYNOPSIS
Gets the relevant Information about GPO-Backups from a Powershell Backup Directory
.DESCRIPTION
If you want to find out which backups are in a dedicated Group Policy Backup Folder
and when they are taken, this functions returns all the relevant Information
.EXAMPLE
Get-GPOBackupInfoFromXml -backuppath c:\gpobackup
Parses all backup.xml-files in the directory and returns Infomation about the Backups.
#>
[CmdletBinding()]
param(
[parameter(mandatory=$true,
position=0,
ValueFromPipelineByPropertyName=$true)]
[ValidateScript({ Test-path -Path $_ -PathType Container })]
[Alias('Fullname')]
[string]$backuppath
)
process { $backupfiles = get-childitem -Path $backuppath\backup.xml -Recurse
Foreach ( $BackupFileItem in $backupfiles )
{
[xml]$backupinfo = get-content -Path $BackupFileItem.Fullname -ReadCount 0 -Encoding UTF8
$comment = Get-Content -Path ( join-path -Path $BackupFileItem.Directory.FullName -ChildPath 'DomainSysvol\gpo\GPO.cmt' ) -ErrorAction SilentlyContinue -Encoding Unicode
$gpoProperties = [ordered]@{
BackupTime = ( get-date -Date $BackupFileItem.CreationTime -Format g )
name = $backupinfo.GroupPolicyBackupScheme.GroupPolicyObject.GroupPolicyCoreSettings.DisplayName.InnerText
GPOGUID = $backupinfo.GroupPolicyBackupScheme.GroupPolicyObject.GroupPolicyCoreSettings.ID.InnerText
BackupGUID = $BackupFileItem.Directory.Name
Options = $backupinfo.GroupPolicyBackupScheme.GroupPolicyObject.GroupPolicyCoreSettings.Options.InnerText
UserVersion = ConvertFrom-GPVersion -VersionNumber ( $backupinfo.GroupPolicyBackupScheme.GroupPolicyObject.GroupPolicyCoreSettings.UserVersionNumber.InnerText.ToString())
MachineVersion = ConvertFrom-GPVersion -VersionNumber ( $backupinfo.GroupPolicyBackupScheme.GroupPolicyObject.GroupPolicyCoreSettings.MachineVersionNumber.InnerText.ToString())
Comment = $comment
}
$GPO = New-Object -TypeName PSCustomObject -Property $GPOProperties
$GPO
}
}
}