传送门
正文
在我们真正开始修改GPO之前,我们需要尝试理解一些关于它们是如何在GPMC和AD中正常更新的复杂问题。因为请相信我,事情并没有看上去那么简单。
当你首先创建一个GPO并命名它,然后查看它的“Details”选项卡时,你会看到它有以下User和Computer版本字段:# (AD), # (SYSVOL)。
对于每个GPO,在硬盘的C:WindowsSYSVOLdomainPolicies<guid>
上,也有相应的路径(称为组策略模板(Group Policy Template))。对于这个GPO,它会是C:WindowsSYSVOLdomainPolicies{F3003ADC-17E3-4FBE-A11E-6A41779ADD6E}
。对于域成员,你还可以通过它的网络共享访问SYSVOL,例如,\testlab.localSYSVOLtestlab.localPolicies{F3003ADC-17E3-4FBE-A11E-6A41779ADD6E}
。
在GPT中,有一个Machine和User目录以及一个GPT.INI文件。
PS > ls "\testlab.localSYSVOLtestlab.localPolicies{F3003ADC-17E3-4FBE-A11E-6A41779ADD6E}"
Directory: \testlab.localSYSVOLtestlab.localPolicies{F3003ADC-17E3-4FBE-A11E-6A41779ADD6E}
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 13/01/2019 11:13 Machine
d----- 13/01/2019 11:13 User
-a---- 13/01/2019 11:13 59 GPT.INI
很明显,Computer策略被放入Machine中而User策略被放在User中。
GPT.INI是一个非常简单的文件,它包含:
PS > cat "\testlab.localSYSVOLtestlab.localPolicies{F3003ADC-17E3-4FBE-A11E-6A41779ADD6E}GPT.INI"
[General]
Version=0
displayName=New Group Policy Object
请注意,displayName参数不会改变
¯_(ツ)_/¯
。
如果我们对GPO进行一些修改并刷新GPMC,我们可以看到Computer的AD和SYSVOL编号已经增大了。
每次修改后,它们似乎都在增大,但是由于GPMC在后台做了一些不可见的操作,除非你使用Process Monitor之类的方法进行监视,所以看起来很小的改动会导致很大的变化。
AD和SYSVOL值存储在不同的地方,但是理解它们非常重要。
SYSVOL保存在GPT.INI文件中。如果我们再次查看,就会发现版本已经变了。
PS > cat "\testlab.localSYSVOLtestlab.localPolicies{F3003ADC-17E3-4FBE-A11E-6A41779ADD6E}GPT.INI"
[General]
Version=12
displayName=New Group Policy Object
如果你有一个同时应用Computer和User策略的GPO,它会变得更加复杂,因为GPT.INI的数字格式会发生变化。
PS > cat "\testlab.localSYSVOLtestlab.localPolicies{F3003ADC-17E3-4FBE-A11E-6A41779ADD6E}GPT.INI"
[General]
Version=65548
displayName=New Group Policy Object
version = [user verion][computer version]
,其中每个值都为16位。
要“翻译”它们,我们首先将十进制转换为十六进制。用科学模式的计算器,结果是1000C。但是因为它们是16位数字,所以实际上是0001000C,因为计算器不显示前导零。
所以0001是1,000C是12。
AD编号保存为AD中组策略对象的属性。可以通过Powerview查看它,如下所示:
PS > Get-DomainGPO -Identity "Test GPO" -Properties VersionNumber
versionnumber
-------------
65548
它使用完全相同的格式。
在GPMC中修改GPO时,它将更新SYSVOL中的相应文件,更新GPT.INI中的值,然后更新它在AD中的versionnumber属性。
要修改不带GPMC的GPO,必须进入SYSVOL并手动修改文件。例如:如果我们想使用Restricted Groups部署一些新的本地管理员,我们必须修改C:WindowsSYSVOLdomainPolicies{F3003ADC-17E3-4FBE-A11E-6A41779ADD6E}MachineMicrosoftWindows NTSecEditGptTmpl.inf
。
更新文件而不增加AD或SYSVOL版本号的限制是:
- 客户端不会自动提取修改,因为他们认为自己已经拥有了最新的配置(除非存在代码执行,并且可以执行gpupdate /force)。
- 这些修改不会在域控制器之间复制。
要使所有客户端能够将修改作为其常规组策略更新计划的一部分,必须手动增加AD和SYSVOL版本号。
这对于GPT.INI来说很容易,因为它只是一个文本文件。versionnumber属性可以通过Powerview更新:
PS > Get-DomainGPO -Identity "Test GPO" | Set-DomainObject -Set @{'versionnumber'='1337'}
PS > Get-DomainGPO -Identity "Test GPO" -Properties VersionNumber
versionnumber
-------------
1337
必须始终保持两个值相同,否则会导致AD / SYSVOL Version Mismatch
错误。