ad回收站仅能恢复被删除的gpo对象本身,无法自动还原ou上的gplink链接关系;恢复后需手动重建链接,并建议通过gpmc备份、历史日志或快照等方式追溯原始链接位置。
ad回收站功能不能直接恢复gpo链接,只能恢复被删除的gpo对象本身(即grouppolicycontainer类对象),而gpo链接(即ou上gplink属性中记录的链接关系)不会被保留或自动还原。
这是因为GPO链接属于“非对象实体”,它只是OU对象的一个多值字符串属性,指向某个GPO的DN。当GPO被删除时,链接会失效;当GPO被恢复后,链接不会自动重建——系统不会、也无法知道它原本该链接到哪些OU。
确认GPO是否在AD回收站中
这是第一步,且必须做:
Get-ADObject -Filter {Name -eq "MyAccidentalDeletedGPO"} -IncludeDeletedObjects -Properties isDeleted,LastKnownParent
- 若返回结果中
isDeleted为True,说明GPO对象仍在回收站,可恢复; - 若无输出,或提示“找不到对象”,则GPO未启用回收站、已被彻底清除,或已过期(默认180天)。
⚠️ 注意:GPO名称不等于显示名称(Display Name)。实际存储名是
cn=部分,通常与创建时填写的“新建GPO”名称一致,但空格、特殊字符可能被转义。建议用Get-GPO -All | Where-Object {$_.DisplayName -like "*关键词*"}先定位,再查对应cn。
恢复GPO对象(仅对象,不含链接)
执行恢复命令:
Get-ADObject -Filter {Name -eq "MyAccidentalDeletedGPO"} -IncludeDeletedObjects | Restore-ADObject
- 恢复后GPO会回到原始
CN=Policies,CN=System,DC=domain,DC=com路径; - 所有设置、WMI筛选器、安全筛选、版本号、GUID等全部保留;
- 但所有OU上的gPLink、gPOptions字段不会自动写回。
手动重建GPO链接(关键步骤)
你需要提前有备份或记录,否则无法准确还原链接位置。常用方式包括:
从组策略管理控制台(GPMC)历史导出
若启用了GPMC的“备份GPO”功能,备份包中包含gplink.xml文件,可查看每个GPO曾链接到哪些OU。从域控制器系统状态备份中提取
使用ntdsutil或wbadmin挂载旧系统状态,用ldp.exe或dsquery查历史gPLink值(需技术门槛高,不推荐日常使用)。从PowerShell历史或配置管理工具中追溯
如用DSC、Ansible、或自建脚本部署GPO链接,检查最近一次提交/执行日志。从Active Directory快照(if available)比对
若开启了AD快照(vssadmin create shadow+dsamain),可用ldp.exe连接快照LDAP端口,对比distinguishedName和gPLink属性。-
临时补救:用Get-GPInheritance快速定位常见链接点
对疑似受影响的OU运行:Get-GPInheritance -Target "OU=Sales,DC=domain,DC=com" | Select-Object Path, GpoLinks
可发现当前生效的GPO,反推哪些GPO常驻此处——适用于有运维惯例的环境(如“所有用户OU必链Default Domain Policy”)。
链接操作示例(PowerShell)
确认目标OU和GPO GUID后,手动添加链接(默认启用、强制应用):
$gpoGuid = (Get-GPO -Name "MyAccidentalDeletedGPO").Id.Guid $ouDn = "OU=Finance,DC=domain,DC=com" # 添加链接(追加,不覆盖已有) Set-GPInheritance -Target $ouDn -IsBlocked $false New-GPLink -Name "MyAccidentalDeletedGPO" -Target $ouDn -Order 1 # 若需设为强制(Enforced),额外执行: $gpo = Get-GPO -Name "MyAccidentalDeletedGPO" $gpo.GpoStatus = "AllSettingsEnabled"
✅ 提示:
New-GPLink默认启用且按顺序插入;若原链接有特定顺序(如Order=3),需用Set-GPLink配合-Order参数精确设置。
预防建议(避免下次再丢链接)
- 启用GPMC的自动备份(右键“组策略对象” → “备份所有GPO”),并定期归档;
- 将GPO链接关系导出为CSV供审计:
Get-GPO -All | ForEach-Object { $gpo = $_ Get-GPInheritance -Target $gpo.Path | Select-Object @{n='GPOName';e={$gpo.DisplayName}}, @{n='LinkedTo';e={$_.Path}}, @{n='Enforced';e={$_.GpoLinks.Enforced}} } | Export-Csv gpo-links-report.csv -NoTypeInformation - 在CI/CD流程中统一管理GPO链接(如用PowerShell Desired State Configuration或Azure DevOps Pipeline)。
不复杂但容易忽略。










