You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过PowerShell利用组策略首选项设置本地用户密码?Windows Server 2022是否支持该操作?

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 16:03:05