如何通过PowerShell利用组策略首选项设置本地用户密码?Windows Server 2022是否支持该操作?
首先明确两个核心问题的答案:可以通过PowerShell手动配置实现,Windows Server 2022也支持这种方式——不过得先说明背景:微软确实在Server 2022的组策略GUI里彻底屏蔽了设置密码的输入框,原因是早期GPP的密码加密机制存在严重漏洞(加密密钥是公开的,任何人拿到Groups.xml都能轻松解密出明文密码)。但如果你是做实验室演示AD配置缺陷,完全可以绕开GUI用PowerShell+手动XML配置的方式实现。
下面是具体的操作步骤:
1. 创建/选择目标组策略对象(GPO)
首先用PowerShell创建一个新的GPO(或者用已有的GPO):
# 创建名为"Set Local User Password"的GPO New-GPO -Name "Set Local User Password"
创建完成后,你可以通过Get-GPO -Name "Set Local User Password"获取这个GPO的GUID,后面会用到它的存储路径。
2. 生成加密后的密码(GPP格式)
GPP要求密码以特定的AES加密格式存储(虽然密钥公开,但必须按这个格式生成)。你可以用以下PowerShell脚本生成加密后的密码字符串:
# GPP公开加密密钥(固定值,所有环境都一样) $gppKey = [byte]@(0x4e,0x99,0x06,0xe8,0xfc,0xb6,0x6c,0xc9,0xfa,0xf4,0x93,0x10,0x62,0x0f,0xfe,0xe8, 0xf4,0x96,0xe8,0x06,0xcc,0x05,0x79,0x90,0x20,0x9b,0x09,0xa4,0x33,0xb6,0x6c,0x1b) # 替换成你要设置的明文密码 $plainPassword = "LabTestPass123!" # 执行加密 $bytes = [System.Text.Encoding]::Unicode.GetBytes($plainPassword) $aes = New-Object System.Security.Cryptography.AesManaged $aes.Key = $gppKey $aes.Mode = [System.Security.Cryptography.CipherMode]::CBC $aes.IV = [byte]@(0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00) $encryptor = $aes.CreateEncryptor() $encryptedBytes = $encryptor.TransformFinalBlock($bytes, 0, $bytes.Length) $cpassword = [System.Convert]::ToBase64String($encryptedBytes) # 输出加密后的字符串,后面要用到 Write-Output "加密后的密码:$cpassword"
运行后会得到一个cpassword值,复制下来备用。
3. 创建Groups.xml配置文件
GPP的用户密码设置是通过Groups.xml文件定义的,你需要手动创建这个文件,并替换其中的关键参数:
<?xml version="1.0" encoding="utf-8"?> <Groups clsid="{3125E937-EB16-4b4c-9934-544FC6D24D26}"> <User clsid="{DF5F1855-51E5-4d24-8B1A-D9BDE98BA1D1}" name="LocalAdmin" <!-- 替换成目标本地用户名 --> image="2" changed="2024-05-20 12:00:00" uid="{A1B2C3D4-E5F6-7890-ABCD-EFGHIJKLMNOP}" <!-- 用[guid]::NewGuid().ToString()生成唯一GUID替换 --> > <Properties action="U" newName="" fullName="" description="" cpassword="刚才生成的加密密码" <!-- 替换成步骤2得到的cpassword值 --> changeLogon="0" noChange="0" neverExpires="1" acctDisabled="0" subAuthority="" userName="LocalAdmin" <!-- 再次确认目标用户名 --> /> </User> </Groups>
4. 将配置文件部署到GPO路径
找到你创建的GPO的存储路径,通常格式为:\\你的域名\SysVol\你的域名\Policies\{GPO的GUID}\User\Preferences\Groups
如果Groups文件夹不存在,就手动创建它,然后把刚才的Groups.xml放进去。
5. 应用组策略
在目标客户端服务器上执行命令更新组策略:
gpupdate /force
执行完成后,目标本地用户的密码就会被设置成你指定的明文密码,同时这个加密后的密码会保存在客户端的C:\ProgramData\Microsoft\Group Policy\History\{GPO-GUID}\User\Preferences\Groups\Groups.xml里,正好符合你实验室演示的需求。
关于Windows Server 2022的支持性
虽然GUI里被禁用了,但组策略客户端服务仍然会正常读取并应用Groups.xml里的配置,所以Windows Server 2022完全支持这种方式。微软只是从GUI层面阻止用户创建这类不安全的配置,但底层的执行逻辑并没有移除——这也正是这个配置能用来演示AD安全缺陷的原因。
⚠️ 重要提醒:这种方式绝对不能用于生产环境,因为GPP的加密密钥是公开的,任何能读取SysVol的用户都能轻松解密出明文密码,属于极高风险的配置。
备注:内容来源于stack exchange,提问作者Olivier Lasne

