Windows Server 2025 / 使用精细密码策略配置密码要求与帐户锁定
Windows Server 2025 的精细密码策略(Fine-Grained Password Policies,FGPP)可以为同一域中的不同用户或组设置不同的密码要求与帐户锁定条件。本练习将密码设置对象(Password Settings Object,PSO)分配给专用实验组,查询用户实际生效的策略,并保持域默认策略不变。把普通组策略对象(Group Policy Object,GPO)链接到用户所在的组织单位(OU),并不会为该 OU 单独建立域用户密码策略。
区分域默认策略与精细密码策略
精细密码策略只能直接应用于用户对象和全局安全组,不能直接应用于 OU,具体范围见 Microsoft 精细密码策略指南。在 DC1 或安装了远程服务器管理工具(RSAT)的管理电脑上,需要使用 Windows PowerShell 的 Active Directory(AD)模块,并具备相应的 AD 权限。默认由 Domain Admins 管理,也可以委派权限;电脑的本地管理员权限不能代替域管理权限。执行以下查询前,先确认当前会话针对实验域 ad.example.test,因为这些命令没有显式指定其他域。
Get-ADDefaultDomainPasswordPolicy
Get-ADUserResultantPasswordPolicy -Identity 'labuser1'
Get-ADFineGrainedPasswordPolicy -Filter *
第一个命令读取域默认密码策略,第二个查询 labuser1 的最终生效 PSO,第三个列出已有 PSO。记录初始值及分配关系,但不要记录任何密码。一个用户最终选出一个 PSO,而不是从多个 PSO 中逐项拼出最严格的设置。直接分配给用户的 PSO 优先于通过组获得的 PSO;同类候选之间,Precedence 数值越小优先级越高。因此,100 本身不保证本例一定生效。如果已有策略、同名对象或优先级冲突,应先停下来检查,不要直接覆盖。
确认实验对象与参数
使用创建用户、组和 OU 的课程中准备的 GG_LabUsers 与普通用户 labuser1。在“Active Directory 用户和计算机”(dsa.msc)中确认组作用域为“全局”、组类型为“安全”,并检查全部成员,包括嵌套组带来的成员。只有全部对象均属于隔离实验环境时才继续;如果涉及管理员、服务帐户或真实用户,停止练习,不要为了完成练习而删除生产组成员。下表数值用于观察行为,不是通用的生产安全基准。
| 设置 | 实验值 |
|---|---|
| 最小长度与复杂性 | 14 个字符;启用复杂性 |
| 密码历史记录 | 5 个密码 |
| 最短与最长使用期限 | 0 天与 30 天 |
| 帐户锁定阈值 | 5 次被计数的身份验证失败 |
| 锁定持续时间与观察窗口 | 均为 15 分钟 |
| 可逆加密 | 禁用 |
密码最短使用期限为 0 天是为了方便实验中再次更改密码;最长使用期限 30 天、锁定阈值 5 次也只是演示值,不应直接作为生产建议。锁定观察窗口不能长于锁定持续时间,本例均为 15 分钟。实际配置还取决于异常检测、多因素身份验证(MFA)、帐户类型及恢复流程。过低的锁定阈值可能被用于拒绝服务攻击;密码长度、复杂性与到期时间也不能单独代表整个帐户的保护水平。
创建 PSO 并分配给实验组
以提升权限打开 Windows PowerShell,并使用具备相应 AD 权限的身份。先确认 Lab-Password-Policy 尚不存在,且已检查优先级与目标成员。下面的代码依次定义参数、创建 PSO、将策略分配给 GG_LabUsers,再查询 labuser1 的结果。请分阶段执行:如果创建失败,应停止排查,不能继续把同名旧对象分配给组,也不要盲目重复创建。参数含义可查阅 New-ADFineGrainedPasswordPolicy 文档。
$policyParameters = @{
Name = 'Lab-Password-Policy'
Precedence = 100
MinPasswordLength = 14
ComplexityEnabled = $true
PasswordHistoryCount = 5
MinPasswordAge = (New-TimeSpan -Days 0)
MaxPasswordAge = (New-TimeSpan -Days 30)
LockoutThreshold = 5
LockoutDuration = (New-TimeSpan -Minutes 15)
LockoutObservationWindow = (New-TimeSpan -Minutes 15)
ReversibleEncryptionEnabled = $false
}
New-ADFineGrainedPasswordPolicy @policyParameters
Add-ADFineGrainedPasswordPolicySubject -Identity 'Lab-Password-Policy' -Subjects 'GG_LabUsers'
Get-ADUserResultantPasswordPolicy -Identity 'labuser1'
labuser1 的预期结果应为 Lab-Password-Policy:Precedence 为 100,最小长度 14,启用复杂性,历史记录 5,最短使用期限 0 天、最长 30 天,锁定阈值 5,锁定持续时间与观察窗口均为 15 分钟,并禁用可逆加密。仅看到 PSO 创建成功或目标列表中出现组,并不能证明用户已采用该策略。如果结果不同,应先检查成员关系、其他 PSO 及复制状态,不要重复创建。
也可以改用图形界面:运行 dsac.exe 打开“Active Directory 管理中心”,选择正确的域,再进入“系统(System)→ 密码设置容器(Password Settings Container)”。在“任务”中选择“新建 → 密码设置”,填写名称 Lab-Password-Policy、优先级 100 以及表中的全部参数。在“直接应用到”中选择“添加”,输入 GG_LabUsers 并确认。随后选择 labuser1,在“任务”中使用“查看结果密码设置”核对实际效果。这是 PowerShell 的替代操作;已经创建成功时,不要再创建一次。
验证密码更改并解释帐户状态
策略不会追溯性地把已保存的密码变长,也不会重写原密码;到期条件则可能随现有密码的使用时间发生变化。确认最终 PSO 正确后,在 CLIENT1 上以域用户 labuser1 登录,按 Ctrl+Alt+Delete 并选择“更改密码”。如果使用虚拟机,应通过虚拟化软件把该组合键发送给来宾系统。输入当前密码,再输入符合要求且未重复使用的新密码,并在确认框中再次输入;等待更改成功提示,再验证正常登录。不要采用网上公开的示例密码,不要把密码写入脚本、日志或截图,也不要通过反复输错来演示锁定。
不要用管理员或服务帐户进行错误密码试验。阈值针对实际被计数的身份验证失败,用户感知的一次操作并不一定只对应一次失败:协议或应用程序重试可能增加请求次数,参见帐户锁定阈值的说明。如果 labuser1 意外锁定,先检查计划任务、服务和已保存连接是否仍在使用旧凭据。可以从有权限的管理会话读取以下状态,无需输入用户密码:
Get-ADUser -Identity 'labuser1' -Properties LockedOut,PasswordLastSet | Select-Object SamAccountName,LockedOut,PasswordLastSet
LockedOut 是查询所针对的域控制器当时返回的锁定状态,不能说明锁定原因。PasswordLastSet 表示上次设置密码的时间,既不显示密码文本,也不能证明旧密码满足当前复杂性要求。更改成功后,该时间应反映新的设置事件;解释结果时还要考虑所查询的域控制器、复制状态及时间上下文。
解锁不会自动清除其他设备或应用中保存的旧凭据。应先确认用户身份,找到失败来源并更新相关凭据,再根据授权对该用户进行有针对性的解锁。不要为了让练习通过而降低策略要求,或一次性解锁所有帐户。
移除分配并确认最终策略
练习结束后,只移除 GG_LabUsers 与此 PSO 的分配关系。如出现确认提示,先核对对象;该操作不会删除组、用户或 PSO 本身。然后重新查询用户最终策略和域默认策略:
Remove-ADFineGrainedPasswordPolicySubject -Identity 'Lab-Password-Policy' -Subjects 'GG_LabUsers'
Get-ADUserResultantPasswordPolicy -Identity 'labuser1'
Get-ADDefaultDomainPasswordPolicy
如果没有其他适用的 PSO,用户将受域默认策略约束,最终 PSO 查询可能不返回对象;要把这种情况与权限错误或查询失败区分开来。如果出现其他 PSO,应检查其分配原因,不要为了得到空结果而删除其他策略。将域默认策略与初始记录比较,确认其保持不变。移除分配不会恢复旧密码,仍应安全保管已经更改成功的新密码。若准备删除 PSO,必须先检查是否还有其他目标;需要复用时也可以保留为未分配状态。




