当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 如何备份和还原组策略对象 (GPO)

作者:精品下载站 日期:2024-12-14 06:16:53 浏览:15 分类:玩电脑

如何备份和还原组策略对象 (GPO)


组策略对象对于管理 Windows Server 基础结构至关重要。为了避免严重的服务问题,管理员必须仔细配置 GPO,并准备好通过在修改之前进行备份来快速恢复任何更改。

组策略复习

在深入研究组策略对象备份和恢复之前,我们先回顾一下有关如何创建和使用 GPO 的一些重要细节。

GPO组件

创建新的组策略对象时,会为其分配一个称为 GUID 的唯一标识符。每个 GPO 都有两部分:

  • 组策略模板 (GPT) - GPT 包含 SYSVOL 文件共享中的一组文件夹(“C:\WindowsSYSVOLdomainPolicies{GUID}”)。这些文件夹用于存储组策略对象的大部分内容,包括模板、设置、脚本和有关 MSI 包的详细信息。 GPT 通过文件复制服务 (FRS) 或分布式文件系统复制 (DFSR) 复制到域中的每个 DC,具体取决于 Windows 版本。事实上,GPO 实际上是特定于域的,因为 SYSVOL 仅在域内复制。

[玩转系统] 如何备份和还原组策略对象 (GPO)

  • 组策略容器 (GPC) — GPC 是一个 groupPolicyContainer 对象,位于 CN=System,CN=Policies 下的域命名上下文中。该 AD 对象的属性用于存储与 GPO 相关的参考信息。值得注意的是,这包括 gPCFileSysPath 属性,该属性包含 SYSVOL 中 GPO 的 GPT 的路径。与 GPT 不同,GPC 由 Active Directory 域服务根据配置的复制成本、计划和间隔进行复制。

[玩转系统] 如何备份和还原组策略对象 (GPO)

GPO 协会

创建 GPO 后,它可以与一个或多个 Active Directory 对象关联:组织单位 (OU)、域和站点。此关联不是由 GPO 维护,而是由每个关联的 AD 对象在其 gPLink 属性中维护。对象的 gPLink 属性的值是与该对象关联的每个 GPO 的 GPC 路径列表。创建或删除 GPO 与对象的关联时,仅修改受影响对象的 gPLink 属性的值。

重要的一点是,虽然 SYSVOL 的复制有效地使 GPO 特定于域,但 GPO 可以链接到站点对象这一事实意味着与 GPO 相关的信息不一定局限于域。站点对象存储在 Active Directory 配置分区中,该分区被复制到林中的所有域控制器。这会导致 gPLink 属性中包含的组策略对象 GPC 的路径在 Active Directory 复制期间偷偷溜出域。

组策略处理顺序

Active Directory 按以下顺序应用 GPO:

  1. 本地 GPO
  2. 站点链接的 GPO
  3. 域链接的 GPO
  4. OU 链接的 GPO(从根开始处理,因此链接到嵌套 OU 的 GPO 将优先于链接到其父 OU 的 GPO)

最后应用的策略“获胜”(除非使用“强制”选项,这可以防止策略被后续应用的策略覆盖)。

[玩转系统] 如何备份和还原组策略对象 (GPO)

用户和计算机配置

最后要注意的一件事是 GPO 包含计算机配置和用户配置。这些子组包含几乎相同的策略设置集,但它们在应用 GPO 设置时有所不同。

计算机配置设置在启动期间应用于计算机,用户配置设置在登录期间应用。这意味着计算机配置中的选项始终针对关联的计算机强制执行,而用户配置中的选项仅在关联的用户帐户登录到计算机时才强制执行。

如果用户登录到计算机并且计算机配置设置和用户配置设置之间存在冲突,则计算机配置设置将始终优先。

使用 PowerShell 的 GPO 备份和恢复过程

完全理解这些关键概念后,我们可以继续进行 GPO 备份和恢复。

我们将从两个相关的组策略 PowerShell cmdlet 开始,它们是 Microsoft Windows 远程服务器管理工具的一部分:

  • Backup-GPO - 此 cmdlet 可以非常轻松地拍摄域的所有组策略对象或单个指定 GPO 的快照。
  • Restore-GPO - 此 cmdlet 可以将组策略对象恢复到由 Backup-GPO cmdlet 制作的备份中捕获的状态。

创建所有 GPO 的备份

以下 PowerShell 脚本使用 Backup-GPO cmdlet 的 -All 参数来使用指定 DC 创建指定域中所有 GPO 的备份:

$BackupPath = '\HOSTNAMEGPOBackup'
$Domain = 'domain.local'
$DomainController = 'DC.domain.local'

$BackupFolder = New-Item -Path $BackupPath -Name (Get-Date -format yyyyMMddTHHmmss) -ItemType Directory
Backup-GPO -All -Domain $Domain -Server $DomainController -Path $BackupFolder

Backup-GPO cmdlet 的输出包含每个 GPO 备份信息的单独子文件夹和一个包含将每个子文件夹与其各自的 GPO 关联所需信息的 manifest.xml 文件:

[玩转系统] 如何备份和还原组策略对象 (GPO)

查看其中一个子文件夹,我们发现每个备份都包含一个文件夹和三个 XML 文件:

[玩转系统] 如何备份和还原组策略对象 (GPO)

该文件夹包含组策略对象的 GPT 副本,XML 文件包含来自组策略 GPC 的数据、特定于备份执行的信息以及描述 GPO 内容的报告。

备份版本控制

支持将组策略对象重复备份到单个位置,但此脚本的每次执行都会为其输出创建一个唯一的子文件夹。子文件夹使用 cmdlet 执行期间生成的备份特定 GUID 进行命名,这几乎消除了重复备份到单个位置时发生命名冲突的可能性。

将每次执行的输出分离到唯一的文件夹中并不是严格必要的,但 Restore-GPO cmdlet 的行为会带来这样做的好处。 Restore-GPO cmdlet 将允许您一次还原所有 GPO,但它将使用在 manifest.xml 中标识的每个组策略对象的最新备份。通过将每组备份分离到其自己的文件夹中,您可以确保每组备份都有自己的manifest.xml。这允许通过单个操作恢复任何这些备份集中的所有 GPO。

使用 Backup-GPO cmdlet 的 -All 参数的一个缺点是,它每次执行时都会备份域中的所有组策略对象,而不是仅备份已更改的对象。解决该问题的一种方法是使用如下脚本。它强制 Backup-GPO cmdlet 使用脚本在更新文件夹中创建的文件来维护脚本上次运行时的时间戳。如果该文件存在,该脚本将备份自文件中的时间戳以来已修改的任何域的 GPO。如果该文件不存在,脚本将创建该文件、设置时间戳并备份域的所有 GPO。

$BackupPath = '\DCGPOBackup'
$Domain = 'domain.local'
$DomainController = 'DC.domain.local'

$BackupPathTracker = "$BackupPathLastBackup.txt"

if((Test-Path "$BackupPathTracker")) {
  $LastBackup = Get-Date (Get-Content -Path "$BackupPathTracker")
  Set-Content -Path "$BackupPathTracker" -Value (Get-Date)
  $GPOs = Get-GPO -All -Domain $Domain -Server $DomainController
  $GPOs | Where-Object { $_.ModificationTime -gt $LastBackup } | ForEach-Object {
  Backup-GPO -Guid $_.Id -Domain $Domain -Server $DomainController -Path $BackupPath
  }
} else {
  Set-Content -Path "$BackupPathTracker" -Value (Get-Date)
  Backup-GPO -All -Domain $Domain -Server $DomainController -Path $BackupPath
}

虽然这种方法可以通过限制不必要的备份来节省空间,但它所做的备份最终都会在同一个文件夹中,这使得将组策略对象恢复到特定时间点变得困难。

结合两个脚本中采用的方法可以解决我们所有的问题,对吧?

BackupPath = '\HOSTNAMEGPOBackup'
$Domain = 'domain.local'
$DomainController = 'DC.domain.local'

$BackupPathTracker = "$BackupPathLastBackup.txt"
$BackupFolder = New-Item -Path $BackupPath -Name (Get-Date -format yyyyMMddTHHmmss) -ItemType Directory

if((Test-Path "$BackupPathTracker")) {
  $LastBackup = Get-Content -Path "$BackupPathTracker"
  Set-Content -Path "$BackupPathTracker" -Value (Get-Date)
  $GPOs = Get-GPO -All -Domain $Domain -Server $DomainController
  $GPOs | Where-Object { $_.ModificationTime -gt $LastBackup } | ForEach-Object {
  Backup-GPO -Guid $_.Id -Domain $Domain -Server $DomainController -Path $BackupFolder
  }
}
else {
  Set-Content -Path "$BackupPathTracker" -Value (Get-Date)
  Backup-GPO -All -Domain $Domain -Server $DomainController -Path $BackupFolder
}

事实证明,将每个差异备份结果隔离在各自的文件夹中实际上会使一切变得更糟。这种方法还将每个manifest.xml 文件隔离在各自的文件夹中,这既有效地消除了立即恢复所有GPO 的能力,又使得查找与任何特定组策略对象关联的备份变得极其困难。

从备份中恢复 GPO

实际上,这些方法遇到了 Restore-GPO cmdlet 的限制:Restore-GPO 可以从 manifest.xml 文件中引用的最新备份或指定的备份中恢复特定的组策略对象,但会恢复所有组策略对象。域的 GPO 一次仅限于使用指定的 manifest.xml 文件中的最新备份。

# Restore a single GPO from its most recent backup
Restore-GPO -Name 'GpoName' -Path '\HOSTNAMEGPOBackup' -Domain 'domain.local' -Server 'DC.domain.local'

# Restore a single GPO from a specific backup
Restore-GPO -BackupId 12345678-09ab-cdef-1234-567890abcdef -Path '\HOSTNAMEGPOBackup' -Domain 'domain.local' -Server 'DC.domain.local'

# Restore all of a domain’s GPOs from their most recent backup
Restore-GPO -All -Path '\HOSTNAMEGPOBackup' -Domain 'domain.local' -Server 'DC.domain.local'

从备份还原组策略对象时,GPO 的版本会作为还原过程的一部分递增,以强制复制以支持 GPO 的还原副本。

[玩转系统] 如何备份和还原组策略对象 (GPO)

版本号如何不同步

Restore-GPO cmdlet 的输出包括两组版本号,一组用于计算机配置,一组用于用户配置。

GPT 和 GPC 各自负责维护自己的版本号,并分别根据用户配置版本和计算机配置版本号计算出单独的 UserVersion 和 ComputerVersion 值。由于版本号递增的方式,这是可能的。当修改 GPO 的计算机配置时,该值会增加 1;每次修改用户配置时,该值会增加 65536。

所有这些都是必要的,因为如上所述,组策略对象的 GPT 和 GPC 由不同的服务单独复制,这可能会导致任何特定域控制器上的 GPO 的 GPT 和 GPC 的版本号不同步 — 这将导致阻止它被处理。

恢复已删除的 GPO

Restore-GPO cmdlet 的记录限制是它不能用于恢复已删除的组策略对象,因为它将无法在 Active Directory 中找到 GPO 的 GPC 部分。尝试恢复已删除的 GPO 将导致如下所示的错误:

[玩转系统] 如何备份和还原组策略对象 (GPO)

但是,如果您能够先恢复 GPC,则可以使用 Restore-GPO 来恢复已删除的 GPO。为此,我们可以使用 Restore-ADObject cmdlet 从 Active Directory 回收站完全恢复 GPO 的 Active Directory 部分,然后 Restore-GPO cmdlet 就能够恢复 GPO:

[玩转系统] 如何备份和还原组策略对象 (GPO)

虽然此过程可以恢复已删除的 GPO,但无法恢复删除 GPO 之前存在的 gPLink 值。这是因为这些值仅存在于链接的对象上。解决此限制的唯一安全方法是利用包含 gPLink 值的 Active Directory 的外部备份。

使用 GPMC 和 AGPM 进行 GPO 备份和恢复

组策略 PowerShell cmdlet 并不是 GPO 备份和还原的唯一选择。 Microsoft 还提供组策略管理控制台 (GPMC),这是一个可用于备份和恢复组策略对象的 MMC 管理单元。与 Backup-GPO cmdlet 类似,它可以备份单个指定的 GPO 或域的所有 GPO。与 Restore-GPO cmdlet 不同,它仅限于一次恢复一个 GPO。

GPMC确实提供了一种从备份中恢复已删除的GPO的方法,但它实际上并没有恢复已删除的GPO;它实际上只是创建一个新的 GPO 并使用备份中的信息填充它。

GPMC 的另一个好处是提高了 GPO 备份内容的可见性,尽管将备份中的设置与实时 GPO 的当前设置进行比较仍然很困难。

Microsoft 的高级组策略管理 (AGPM) 工具作为 Microsoft Desktop Optimization Pack 的一部分提供,它通过版本控制功能扩展了 GPMC,可帮助您查看和了解备份内容。然而,AGPM 的好处往往被两个因素所抵消:它似乎没有得到很好的维护,并且它因与其他组件不能很好地配合而臭名昭著(例如,在 AGPM 之外修改 AGPM 管理的 GPO 可以导致 AGPM 数据库损坏)。也就是说,它不一定是一个坏工具;它也不一定是一个坏工具。我只是建议您在尝试将其部署到生产环境之前在实验室环境中对其进行一些修改。

Netwrix 如何提供帮助?

Netwrix Recovery for Active Directory 提供了统一的 Web 界面,使您能够在单个快照中备份 Active Directory 对象和组策略对象、搜索和管理备份、回滚对活动对象的属性更改,甚至恢复已删除的 GPO, 其关联的 gPLink。

常问问题

我可以使用什么命令从备份中恢复 GPO?

Windows PowerShell cmdlet Restore-GPO 将单个 GPO 或所有 GPO 还原到原始域。

如何从文件导入 GPO?

如果您在高级组策略管理 (AGPM) 中拥有必要的管理员权限,并且已将 GPO 导出到 CAB 文件中,则可以按照此处提供的步骤将 GPO 设置导入到新 GPO 或现有 GPO 中。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯