如何查询Active Directory中手动禁用与自动过期的用户账号?
Active Directory禁用用户审计方案
核心问题解答
- 问题1:是否存在属性记录账号实际被禁用/过期的时间?
AD默认没有专门的内置属性存储账号实际停用时间。accountExpires仅保存预设的账号到期时间,无论是自动过期还是手动禁用操作,都不会修改该属性的原有值。
你猜测的whenChanged属性只有在用户对象被主动修改时才会更新:手动禁用账号会修改userAccountControl属性,因此会触发whenChanged更新;而账号自动过期是域控在用户认证时的动态判断逻辑,不会修改用户对象的任何属性,因此不会更新whenChanged。 - 问题2:是否存在属性可以标识账号的禁用/过期方式?
AD默认没有专门的属性直接标识禁用方式,可通过两类属性的特征组合判断:
- 自动过期的账号:
userAccountControl属性不会被打上禁用标记,账号状态仍显示为启用,仅在用户登录时被域控拒绝,不会出现在已禁用用户的筛选结果中。 - 手动禁用的账号:
userAccountControl属性会被打上ACCOUNTDISABLE标记,账号状态显示为禁用。如果whenChanged的时间早于accountExpires记录的预设到期时间,可100%判定为提前手动禁用。
实操导出报表方案
可通过PowerShell的ActiveDirectory模块批量导出审计结果,操作步骤如下:
- 在已安装AD域服务工具的设备上运行PowerShell,导入AD模块:
Import-Module ActiveDirectory - 执行以下查询命令导出报表:
Get-ADUser -Filter {Enabled -eq $false} -Properties accountExpires, whenChanged, Name, SamAccountName | ForEach-Object { # 转换accountExpires时间戳为可读格式,特殊值代表永不过期 $expireTime = if ($_.accountExpires -in 0,9223372036854775807) { [DateTime]::MaxValue } else { [DateTime]::FromFileTime($_.accountExpires) } $disableType = if ($_.whenChanged -lt $expireTime) { "手动提前禁用" } else { "到期后手动禁用" } [PSCustomObject]@{ 用户名 = $_.Name 登录账号 = $_.SamAccountName 预设到期时间 = $expireTime 最后修改时间 = $_.whenChanged 禁用类型 = $disableType } } | Export-Csv -Path "C:\AD禁用用户审计报表.csv" -Encoding UTF8 -NoTypeInformation
如果你的域控开启了安全日志留存,可进一步匹配事件ID 4725(用户账号被禁用)的日志,可精准获取手动禁用操作的操作人、操作时间,实现100%准确的区分。
内容的提问来源于stack exchange,提问作者rodstewart
相关产品推荐
相关产品推荐

