다음을 통해 공유

组策略

组策略对象(GPO)是策略设置的集合,用于定义计算机系统和用户帐户在 Windows Active Directory 域环境中的行为方式。 GPO 充当跨 Windows 网络集中配置管理、安全强制和管理控制的主要机制。

备份功能概述

组策略备份功能是添加到域运行状况监视器的一项新功能,可在 Active Directory 域服务中自动创建和管理组策略对象(GPO)的备份。 此功能通过维护关键组策略的定期备份来帮助确保业务连续性和灾难恢复。

文件系统结构

备份位置

  • 主路径F:\\GPO\\Backups

  • 网络共享GPOBackupsShare$ (隐藏共享)

目录结构

F:\GPO\Backups\

├── MMddyyyyHHmm\          # Timestamp folder (e.g., 092520251430)

│   ├── {GUID-1}\          # Individual GPO backup folder

│   ├── {GUID-2}\          # Individual GPO backup folder

│   └── ...

├── MMddyyyyHHmm\          # Previous backup

│   └── ...

└── ...

功能性

创建网络共享

创建具有以下特征的加密 SMB(服务器消息块)共享:

  • 共享名称GPOBackupsShare$ (隐藏)
  • 加密:启用安全性
  • Permissions:
    • 完全访问权限:域管理员
    • 读取访问权限:AAD (Azure Active Directory) DC 管理员

安全注意事项

Permissions

  • 文件夹权限

    • 域管理员:完全控制
    • AAD DC 管理员:读取访问权限
  • 共享权限

    • 用于网络访问的加密 SMB 共享
    • 隐匿共享($ 后缀)通过模糊化实现安全性

访问控制

备份位置和网络共享配置了相应的 Active Directory 安全组,以确保只有经过授权的管理员可以访问备份数据。

用法示例

验证备份

# Check backup location
Get-ChildItem "F:\GPO\Backups" -Directory

# Access via network share (from another machine)
Get-ChildItem "\\PDC-SERVER\GPOBackupsShare$"

手动清理

# The feature handles cleanup automatically, but for manual operations:
Get-ChildItem "F:\\GPO\Backups" | Where-Object { $\_.CreationTime -lt (Get-Date).AddDays(-7) } | Remove-Item -Recurse -Force

本部分介绍已加入域的计算机上的管理员如何发现、访问和还原此功能创建的组策略对象(GPO)备份。 同时提供 GUI(GPMC)和 PowerShell 工作流。

先决条件

  • 您已与至少一个可写域控制器(理想情况下是主域控制器 (PDC) 模拟器)建立了网络连接。
  • 你的帐户属于一个有权读取(AAD DC 管理员)或修改(域管理员)GPO 的组。
  • 安装 RSAT(远程服务器管理工具)组策略管理控制台(GPMC)(用于 GUI 还原)。
  • PowerShell GroupPolicy 模块可用(默认包括在 RSAT 中/通常在域控制器上提供)。

确定 PDC 模拟器(如果需要)

尽管代码尝试解析和发布 PDC 上的共享,但可以使用以下任一方法显式发现 PDC 模拟器:

Get-ADDomain | Select-Object PDCEmulator

或者(旧版/没有 AD 模块):

nltest /dsgetdc:<yourDomainFQDN> /pdc

获取 UNC(通用命名约定)路径中第一个句点左侧的短主机名。

访问备份共享文件夹(Domain-Joined 工作站)

  1. 按 Win+R,输入 UNC 路径:

    \\<PDCShortName>\GPOBackupsShare$
    
  2. (可选)映射驱动器号:

    New-PSDrive -Name GPOBK -PSProvider FileSystem -Root "\\<PDCShortName>\GPOBackupsShare$" -Persist
    
  3. 浏览时间戳文件夹(格式 MMddyyyyHHmm)。 每个子文件夹包含用于每个已备份 GPO 的 GUID 命名文件夹。

备份文件夹布局回顾

\\<PDCShortName>\GPOBackupsShare$\<TimestampFolder>\{GPO-GUID}\
  +-- backup.xml          (metadata, if present)
  +-- GPO.tmf / Gpt.ini / Machine / User  (typical structural contents)
  +-- (Optional manifest files depending on API)

注释

确切的文件集可能因提供程序实现而异,但每个 GPO 的 GUID 文件夹是密钥标识。

标识正确的备份

可以将 GUID 关联到易识别的 GPO 名称:

Get-GPO -All | Where-Object Id -eq '{GUID-HERE}' | Select DisplayName, Id

或按名称跨 GUID 文件夹搜索(如果 backup.xmlgpreport.xml 存在):

Get-ChildItem "\\<PDCShortName>\GPOBackupsShare$" -Directory -Recurse -Depth 2 | Where-Object { Test-Path (Join-Path $\_.FullName 'backup.xml') } |
  ForEach-Object {
    [xml]$meta = Get-Content (Join-Path $\_.FullName 'backup.xml') -ErrorAction SilentlyContinue

    if ($meta.BackupInformation.GPOName) {
      [pscustomobject]@{ Folder=$\_.FullName; GPOName=$meta.BackupInformation.GPOName; GPOId=$meta.BackupInformation.GPOID }
    }
  }

如果缺少元数据,则依赖于生产环境中的 GPO GUID(Get-GPO -All)。

通过 GUI 使用 GPMC 还原 GPO

  1. 启动“组策略管理”(GPMC.msc)。

  2. 在左侧树中,右键单击 组策略对象 容器(或者执行就地还原时单个 GPO)。

  3. 选择 “管理备份...”

  4. 单击“ 浏览 ”并选择时间戳文件夹路径:

    \\<PDCShortName>\GPOBackupsShare$\<TimestampFolder>
    
  5. 该列表使用可发现的备份填充。 选择目标 GPO 备份。

  6. 在以下选项中选择:

    • 恢复:直接覆盖现有的 GPO(匹配 GUID)。
    • 还原到...:允许还原到 其他 GPO(选择现有目标)。
    • 复制 (如果可用):从备份创建新的 GPO(GUID 更改;必须手动重新建立链接)。
  7. 确认操作。 查看结果窗格,了解成功/失败。

  8. 根据需要重新链接或验证安全筛选/WMI(Windows Management Instrumentation)筛选器(请参阅下文)。

还原后验证

  • 运行 gpresult /h report.html 在目标工作站上确认策略应用。
  • 使用 GPMC 中的 GPO 状态 来确保启用“用户”和“计算机”部分。
  • 验证 WMI 筛选器关联(WMI 筛选器并不总是嵌入到原始文件级备份中,并且可能需要重新关联)。

使用 PowerShell 还原 GPO

GroupPolicy 模块提供 Restore-GPOImport-GPONew-GPO 以适用于不同场景。

1. 就地还原(同一 GUID)

$timestampFolder = '092520251430'              # Example

$pdc = (Get-ADDomain).PDCEmulator.Split('.')[0]

$backupRoot = "\\<PDCShortName>\GPOBackupsShare$\$timestampFolder"

# List available backups in that timestamp folder
Get-GPOBackup -Path $backupRoot | Format-Table DisplayName, Id, CreationTime

# Restore specific GPO by name (must already exist in domain)
Restore-GPO -Name 'My Application Baseline' -Path $backupRoot -Confirm:$false

删除原始 GPO 后进行还原

如果原始 GPO(GUID)已消失,则有两个选项:

  1. 使用原始 GUID 重新生成(仅在您知道 GUID 并希望保持其不变时):

      $backup = Get-GPOBackup -Path $backupRoot | Where-Object { $\_.DisplayName -eq 'My Application Baseline' }
    
      Restore-GPO -Guid $backup.Id -Path $backupRoot -CreateIfNeeded
    
  2. 选项 B - 创建新的 GPO 和导入设置:

      $newGpo = New-GPO -Name 'My Application Baseline (Restored)'
    
      Import-GPO -TargetName $newGpo.DisplayName -BackupId $backup.Id -Path $backupRoot -CreateIfNeeded
    

3. 仅通过 GUID 选择备份

$gpoGuid = '{12345678-90AB-CDEF-1234-567890ABCDEF}'

Restore-GPO -Guid $gpoGuid -Path $backupRoot -Confirm:$false

4. 将备份副本复制到新的 GPO(为取证保留原件)

$backup = Get-GPOBackup -Path $backupRoot | Where-Object DisplayName -eq 'Legacy GPO'

$copy = New-GPO -Name "Recovered - $($backup.DisplayName)"

Import-GPO -BackupId $backup.Id -TargetName $copy.DisplayName -Path $backupRoot

5. 跨域/实验室导入

将整个时间戳文件夹复制到目标域的管理工作站(保留结构)并运行:

Get-GPOBackup -Path 'C:\Temp\GPOBackups\092520251430' | ForEach-Object {

  $existing = Get-GPO -All | Where-Object Id -eq $\_.Id -ErrorAction SilentlyContinue

  if ($existing) {
    Restore-GPO -Guid $\_.Id -Path 'C:\Temp\GPOBackups\092520251430' -Confirm:$false
  } else {
    New-GPO -Name $\_.DisplayName | Out-Null

    Import-GPO -BackupId $\_.Id -TargetName $\_.DisplayName -Path 'C:\Temp\GPOBackups\092520251430'
  }
}

注释

确保在跨域导入后,检查 GPO 中的任何特定于域的安全主体(包括委派 ACL 和偏好设置中的组的 SID(安全标识符))。

处理链接的对象和依赖项

还原原始 GPO 内容时不会自动完成:

  • 将 GPO 重新链接到 OU(保留链接以便进行就地还原;新的 GPO 需要手动链接)。

  • 重新创建 WMI 筛选器(必须存在;如果丢失,则重新分配)。

  • 如果域 SID 不同(在跨域方案中),请重新生成安全筛选。

重新链接示例

New-GPLink -Name 'My Application Baseline (Restored)' -Target 'OU=Workstations,DC=contoso,DC=com' -Enforced:$false

重新关联 WMI 筛选器

Set-GPWmiFilter -Guid '{RESTORED-GPO-GUID}' -WmiFilter (Get-GPWmiFilter -All | Where-Object Name -eq 'Win11Only')

验证和报告

若要确认设置,请生成 HTML 报告:

Get-GPO -Name 'My Application Baseline' | Get-GPOReport -ReportType Html -Path .\BaselineReport.html

Start-Process .\BaselineReport.html

强制客户端刷新和检查策略结果集(RSoP):

Invoke-GPUpdate -Computer 'CLIENT01' -RandomDelayInMinutes 0

回滚策略

如果还原的 GPO 引入了问题:

  1. 使用另一个(较早的)时间戳文件夹,并使用该备份重新运行 Restore-GPO

  2. 或者禁用 GPO(在调查时将“用户”和“计算机”配置设置为“已禁用”)。

  3. 若要确保轻松回滚路径,请至少保留两个最近的时间戳文件夹。

常见恢复陷阱

問题 原因 决议
Get-GPOBackup 不返回任何内容 路径深度错误(指向根目录而不是时间戳文件夹) 指向 -Path 特定时间戳文件夹,而不是更高级别的父文件夹
Access denied 在共享上 缺少群组成员资格或防火墙阻止 确认域管理员组/AAD DC 管理员组中的成员身份;验证 SMB 入站规则
导入后缺少 GPO 链接 使用 Import-GPO 创建新的 GPO 手动使用 New-GPLink 重新创建链接
缺少 WMI 筛选器 不包括/未重新创建 在 GPMC 中重新创建筛选器并重新分配
安全筛选无效 SID 不匹配(跨域) 从目标域读取的组

最小端到端 PowerShell 示例

# Variables

$pdc = (Get-ADDomain).PDCEmulator.Split('.')[0]

$latestTimestamp = Get-ChildItem "\\<PDCShortName>\GPOBackupsShare$" -Directory | Sort-Object Name -Descending | Select-Object -First 1 -ExpandProperty Name

$backupPath = "\\<PDCShortName>\GPOBackupsShare$\$latestTimestamp"

$gpoName = 'Baseline Workstation Policy'

# Inspect backups
Get-GPOBackup -Path $backupPath | Where-Object DisplayName -eq $gpoName

# Restore (in-place)
Restore-GPO -Name $gpoName -Path $backupPath -Confirm:$false

# Report
Get-GPO -Name $gpoName | Get-GPOReport -ReportType Html -Path .\Restored.html

Start-Process .\Restored.html

使用这些过程,管理员可以可靠地识别、检索和还原 GPO 备份,无论是执行例程恢复、迁移到实验室还是紧急回滚。