AD 环回策略 Merge 与 Replace
AD 环回策略 Merge 与 Replace
同一个域用户登录普通办公电脑时,桌面设置来自用户所在 OU;登录公共终端或远程桌面服务器后,却需要使用这台计算机所在 OU 的用户设置。直接把包含用户配置的 GPO 链接到计算机 OU,通常不会让这些用户设置生效。需要先在计算机配置中启用用户组策略环回处理,再选择 Merge 或 Replace。
最容易混淆的是两种模式的结果:同一个冲突项在 Merge 和 Replace 下都可能得到计算机 OU 的值。区分它们,要再检查用户 OU 独有的设置。Merge 保留用户位置的策略并追加计算机位置的用户策略;Replace 使用计算机位置的策略列表,用户位置独有的设置随之退出应用范围。
下面的对照来自隔离域 corp.test.checo.cc,NetBIOS 名 ADLAB,域控为 LAB-DC1,成员服务器为 LAB-MEMBER。两台均为 Windows Server 2022 Datacenter,用户日志记录的系统版本为 10.0.20348,Windows PowerShell 为 5.1.20348.5386。普通用户 ADLAB\KB03-User 在同一成员服务器上完成关闭、Merge、Replace 三组真实控制台登录。每次切换先刷新计算机策略,再重启成员服务器取得新的用户登录会话。
1. 比较两种模式
1.1 用户策略来源
正常处理时,计算机位置决定计算机配置列表,用户位置决定用户配置列表。环回开关属于计算机配置,但开关启用后,应用到用户的仍然是 GPO 中的用户配置,不是把 HKLM 设置转换为 HKCU 设置。
Merge 先收集用户位置的 GPO,再把计算机位置的 GPO 追加到用户列表后面。后处理的用户设置覆盖先处理的同名设置,因此计算机位置的用户配置在普通冲突中优先。用户位置独有的设置仍然保留。
Replace 则使用按计算机位置获得的列表来处理用户配置。用户对象仍留在原 OU,登录身份也没有改变,变化的是这次用户策略处理所采用的列表。计算机位置沿途的域和 OU 策略仍受链接、继承、筛选和配置部分启用状态影响。
成员服务器本机 C:\Windows\PolicyDefinitions\GroupPolicy.admx 中的 UserPolicyMode 定义给出了实际注册表位置与枚举值:
class="Machine"
key="Software\Policies\Microsoft\Windows\System"
valueName="UserPolicyMode"
UserPolicyMode_Merge: decimal value="1"
UserPolicyMode_Replace: decimal value="2"环回开关落在 HKLM\Software\Policies\Microsoft\Windows\System\UserPolicyMode。实验的关闭组写入 0,Merge 使用 1,Replace 使用 2;这是历史对照的具体设置。撤销环回时应通过原 GPO 的禁用/未配置状态或移除本次策略值恢复,不能把手写 0 当作替代管理模板状态的通用方案。最终回读为该值不存在。
1.2 比较策略标记
专属 OU 的安排为:
OU=KB-Lab-20261009
OU=Loopback03-Users
KB03-User
链接 KB03-UserLocation
OU=Loopback03-Computers
LAB-MEMBER
链接 KB03-ComputerLocation
链接 KB03-LoopbackModeKB03-UserLocation 的用户配置写入 Conflict=UserOU 与 UserOnly=Present;KB03-ComputerLocation 的用户配置写入 Conflict=ComputerOU 与 ComputerOnly=Present。三项均位于 HKCU\Software\Policies\KB03Loopback。第三份 GPO 单独负责计算机环回模式,方便每次只改变一个变量。
| 模式 | 用户 gpresult 中应用的实验 GPO | Conflict | UserOnly | ComputerOnly |
|---|---|---|---|---|
| 关闭,值 0 | KB03-UserLocation | UserOU | Present | <absent> |
| Merge,值 1 | KB03-ComputerLocation、KB03-UserLocation | ComputerOU | Present | Present |
| Replace,值 2 | KB03-ComputerLocation | ComputerOU | <absent> | Present |
| 撤销实验链接并刷新 | N/A | <absent> | <absent> | <absent> |
Merge 的 gpresult 列表显示计算机位置 GPO 在前,但这个显示顺序不是处理时序。覆盖关系依据 HKCU 的实际结果判断。Replace 与 Merge 的 Conflict 相同,而 UserOnly 从 Present 变为不存在,清楚区分了“追加覆盖”和“改用计算机位置列表”。
两组关键原始输出如下:
RSOP data for ADLAB\KB03-User on LAB-MEMBER : Logging Mode
Applied Group Policy Objects
-----------------------------
KB03-ComputerLocation
KB03-UserLocation
Conflict=ComputerOU
UserOnly=Present
ComputerOnly=PresentRSOP data for ADLAB\KB03-User on LAB-MEMBER : Logging Mode
Applied Group Policy Objects
-----------------------------
KB03-ComputerLocation
Conflict=ComputerOU
UserOnly=<absent>
ComputerOnly=Present日志中的 whoami /user 记录同一个用户 SID,whoami /groups 包含 NT AUTHORITY\INTERACTIVE、CONSOLE LOGON 和 Medium Mandatory Level。观察脚本在该用户的普通交互令牌下执行,HKCU 指向实际登录用户。计算机策略刷新和域控配置动作由 SYSTEM 执行,两类身份分别承担各自的操作。
2. 配置与验证
2.1 在计算机 OU 配置
在组策略管理中编辑面向目标计算机 OU 的 GPO,进入“计算机配置 → 策略 → 管理模板 → 系统 → 组策略 → 配置用户组策略环回处理模式”,启用后选择合并或替换。把公共终端需要的用户设置配置在计算机位置可获得的 GPO 的“用户配置”部分。
需要保留办公用户的日常设置,只覆盖公共终端的部分设置时选 Merge。需要让公共终端的用户策略统一由计算机位置控制时选 Replace。Replace 会使用户位置的其他设置退出这次策略列表,切换前应检查驱动器映射、文件夹重定向等是否也在用户位置的 GPO 中。
下面用已存在的实验域、三个专属 OU、测试用户和三份 GPO展示可复制配置。命令在 LAB-DC1 的提升 PowerShell 中执行,需要 ActiveDirectory 与 GroupPolicy 模块及对应 OU/GPO 管理权限;域名和对象名均显式指定。实验开始前将用户放到 Users 子 OU、计算机放到 Computers 子 OU,并保存计算机的原始 DN。
Import-Module ActiveDirectory
Import-Module GroupPolicy
$dc = 'LAB-DC1.corp.test.checo.cc'
$domain = 'corp.test.checo.cc'
$root = 'OU=KB-Lab-20261009,DC=corp,DC=test,DC=checo,DC=cc'
$userOU = 'OU=Loopback03-Users,' + $root
$computerOU = 'OU=Loopback03-Computers,' + $root
$userGPO = Get-GPO -Name 'KB03-UserLocation' -Domain $domain -Server $dc
$computerGPO = Get-GPO -Name 'KB03-ComputerLocation' -Domain $domain -Server $dc
$modeGPO = Get-GPO -Name 'KB03-LoopbackMode' -Domain $domain -Server $dc
$computer = Get-ADComputer -Identity 'LAB-MEMBER' -Server $dc
$backup = 'C:\KB-Loopback-03\operator-backup'
New-Item -ItemType Directory -Path $backup -Force | Out-Null
$computer | Export-Clixml ($backup + '\computer-before.xml')
Get-GPInheritance -Target $userOU -Domain $domain -Server $dc | Export-Clixml ($backup + '\user-links.xml')
Get-GPInheritance -Target $computerOU -Domain $domain -Server $dc | Export-Clixml ($backup + '\computer-links.xml')
foreach ($g in @($userGPO, $computerGPO, $modeGPO)) {
Backup-GPO -Guid $g.Id -Path $backup -Domain $domain -Server $dc | Out-Null
}专属 GPO 中写入无害 marker,以便把策略列表与实际值对应起来。以下命令沿用上一块变量;测试用户所在 OU 与计算机所在 OU 使用不同链接。
$key = 'HKCU\Software\Policies\KB03Loopback'
Set-GPRegistryValue -Guid $userGPO.Id -Key $key -ValueName Conflict -Type String -Value UserOU -Domain $domain -Server $dc | Out-Null
Set-GPRegistryValue -Guid $userGPO.Id -Key $key -ValueName UserOnly -Type String -Value Present -Domain $domain -Server $dc | Out-Null
Set-GPRegistryValue -Guid $computerGPO.Id -Key $key -ValueName Conflict -Type String -Value ComputerOU -Domain $domain -Server $dc | Out-Null
Set-GPRegistryValue -Guid $computerGPO.Id -Key $key -ValueName ComputerOnly -Type String -Value Present -Domain $domain -Server $dc | Out-Null
New-GPLink -Guid $userGPO.Id -Target $userOU -Domain $domain -Server $dc | Out-Null
New-GPLink -Guid $computerGPO.Id -Target $computerOU -Domain $domain -Server $dc | Out-Null
New-GPLink -Guid $modeGPO.Id -Target $computerOU -Domain $domain -Server $dc | Out-Null
Move-ADObject -Identity $computer.ObjectGUID -TargetPath $computerOU -Server $dc若这些链接已存在,保留现有链接即可,不重复运行 New-GPLink。设置 Merge 时执行下面这块;测试关闭组改为 0,Replace 改为 2。每次调整前保存当前 GPO 的备份。
Backup-GPO -Guid $modeGPO.Id -Path $backup -Domain $domain -Server $dc | Out-Null
Set-GPRegistryValue -Guid $modeGPO.Id -Key 'HKLM\Software\Policies\Microsoft\Windows\System' -ValueName UserPolicyMode -Type DWord -Value 1 -Domain $domain -Server $dc | Out-Null
Get-GPRegistryValue -Guid $modeGPO.Id -Key 'HKLM\Software\Policies\Microsoft\Windows\System' -ValueName UserPolicyMode -Domain $domain -Server $dc在 LAB-MEMBER 的本地管理员提升会话中刷新计算机策略,读取生效模式,然后让测试用户注销并重新登录。本次为获得稳定的前台处理对照,采用成员服务器重启;重启会结束该服务器上的会话。
gpupdate /target:computer /force /wait:120
if ($LASTEXITCODE -ne 0) { throw 'Computer gpupdate failed' }
Get-ItemPropertyValue -Path 'HKLM:\Software\Policies\Microsoft\Windows\System' -Name UserPolicyMode
Restart-Computer -Force登录 ADLAB\KB03-User 后,在该用户自己的普通 PowerShell 窗口中执行下面的观察命令。保留 SID、用户 RSoP 和三项实际值,三组比较时使用同一个用户及同一台成员服务器。
whoami /user
whoami /groups
gpupdate /target:user /force /wait:120
if ($LASTEXITCODE -ne 0) { throw 'User gpupdate failed' }
gpresult /scope user /r
if ($LASTEXITCODE -ne 0) { throw 'User gpresult failed' }
$k='HKCU:\Software\Policies\KB03Loopback'
foreach($n in @('Conflict','UserOnly','ComputerOnly')){$v=if(Test-Path $k){(Get-Item $k).GetValue($n)}else{$null};if($null -eq $v){$v='<absent>'};"$n=$v"}读取可能不存在的值时采用注册表对象的 GetValue,返回空值后明确显示 <absent>。Windows PowerShell 5.1 的 Get-ItemPropertyValue 在属性不存在时可能抛出终止异常,因此三组对照不能把脚本中断误判成 marker 已清除。
2.2 结果排查
如果计算机 OU 的用户设置始终不生效,先在成员机提升会话查看 UserPolicyMode。值没有到客户端时,检查开关 GPO 的计算机配置是否启用、是否链接到该计算机路径,以及计算机的读取和应用权限;不要先改用户 OU 的链接顺序。
如果值已经是 1 或 2,但预期用户 GPO仍未应用,检查那份 GPO 的用户配置是否启用、当前用户是否拥有 Read 与 Apply,以及客户端计算机是否能够读取 GPO。用户策略取回使用计算机安全上下文,删除 Authenticated Users 后尤其容易漏掉计算机 Read。再核对 WMI 筛选、实际计算机 DN、策略服务器和 GroupPolicy Operational 日志。不要把一份只有计算机配置的 GPO 当作用户结果列表的必然成员。
如果 Merge 和 Replace 看起来完全相同,给用户位置增加一个独有项再比较。仅用冲突项判断时,两组都得到计算机位置的值正是正常结果。对于组策略首选项,还要检查“当此项目不再应用时删除”等设置和遗留值,避免把持久化值误当成策略仍在应用。
2.3 恢复配置
一次性复现结束后,先将计算机恢复到记录的原始父容器,并撤销本次三条链接;用户与 GPO 暂时保留,供同一个用户刷新后检查 marker 已退出应用。下面在域控的提升会话执行,沿用此前变量和备份目录。
$before = Import-Clixml ($backup + '\computer-before.xml')
$parent = $before.DistinguishedName.Substring($before.DistinguishedName.IndexOf(',') + 1)
Move-ADObject -Identity $before.ObjectGUID -TargetPath $parent -Server $dc
Remove-GPLink -Guid $userGPO.Id -Target $userOU -Domain $domain -Server $dc
Remove-GPLink -Guid $computerGPO.Id -Target $computerOU -Domain $domain -Server $dc
Remove-GPLink -Guid $modeGPO.Id -Target $computerOU -Domain $domain -Server $dc
Get-ADComputer -Identity $before.ObjectGUID -Server $dc | Select-Object DistinguishedName随后在成员机提升会话刷新计算机策略,在测试用户会话重新运行观察命令。实测计算机回到 CN=LAB-MEMBER,CN=Computers,DC=corp,DC=test,DC=checo,DC=cc,用户结果为:
Applied Group Policy Objects
-----------------------------
N/A
Conflict=<absent>
UserOnly=<absent>
ComputerOnly=<absent>环回值也回到原先不存在的状态。使用既有 GPO 做调整时,恢复记录的备份实例和原链接配置;本次使用的三份 GPO、一个用户、三个空 OU 都是一次性对象,回读成功后按记录的 GUID 删除。测试用户随后注销,临时交互任务移除,自动登录相关值按修改前的存在状态、类型和值精确恢复。成员服务器安全通道回读为 True,既有 OU 链接与原 GPO 清单及修改时间保持一致。
参考资料
- Microsoft Learn:Loopback processing of Group Policy,说明用户与计算机位置、Merge 追加列表及 Replace 改用计算机列表的机制。
- Microsoft Learn:Group Policy processing for Windows,列出 Windows Server 2022 适用性、环回配置入口与前台策略处理过程。
