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

如何查询Active Directory中手动禁用与自动过期的用户账号?

Active Directory禁用用户审计方案

核心问题解答

  • 问题1:是否存在属性记录账号实际被禁用/过期的时间?
    AD默认没有专门的内置属性存储账号实际停用时间。accountExpires仅保存预设的账号到期时间,无论是自动过期还是手动禁用操作,都不会修改该属性的原有值。
    你猜测的whenChanged属性只有在用户对象被主动修改时才会更新:手动禁用账号会修改userAccountControl属性,因此会触发whenChanged更新;而账号自动过期是域控在用户认证时的动态判断逻辑,不会修改用户对象的任何属性,因此不会更新whenChanged。
  • 问题2:是否存在属性可以标识账号的禁用/过期方式?
    AD默认没有专门的属性直接标识禁用方式,可通过两类属性的特征组合判断:
  1. 自动过期的账号:userAccountControl属性不会被打上禁用标记,账号状态仍显示为启用,仅在用户登录时被域控拒绝,不会出现在已禁用用户的筛选结果中。
  2. 手动禁用的账号:userAccountControl属性会被打上ACCOUNTDISABLE标记,账号状态显示为禁用。如果whenChanged的时间早于accountExpires记录的预设到期时间,可100%判定为提前手动禁用。

实操导出报表方案

可通过PowerShell的ActiveDirectory模块批量导出审计结果,操作步骤如下:

  1. 在已安装AD域服务工具的设备上运行PowerShell,导入AD模块:
    Import-Module ActiveDirectory
  2. 执行以下查询命令导出报表:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 20:09:03