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

PowerShell 2.0环境下查询本地用户账号禁用时间戳的方法

关于查询Windows本地用户禁用时间的解决方案

Windows系统的本地用户账户原生属性中,未内置存储「禁用操作时间戳」的字段,无论是通过Win32_UserAccountWMI类还是ADSI的WinNT提供者查询,都无法直接读取到该数据,该数据默认不会被系统持久化存储,因此不存在直接查询的方法。

以下是完全适配你场景的替代实现方案(兼容PowerShell 2.0,无需额外模块、不依赖事件日志):

实现思路

通过用户自带的「描述」字段存储禁用时间标记:首次执行脚本时为所有已禁用的无标记用户写入当前时间作为禁用时间基准,后续执行时读取该标记计算时间差即可筛选出超时的禁用账号,全程无额外依赖。

完整可运行代码

# 配置项:禁用用户最长保留周数,可按需修改
$maxDisabledWeeks = 4
$computerName = $env:COMPUTERNAME
$adsiComputer = [ADSI]"WinNT://$computerName,computer"

# 遍历所有本地用户
$localUsers = $adsiComputer.PsBase.Children | Where-Object {$_.SchemaClassName -eq 'user'} | ForEach-Object {
    $userFlags = $_.PsBase.Properties.Item("userflags").Value
    $isDisabled = [bool]($userFlags -band 2)
    $description = $_.PsBase.Properties.Item("Description").Value
    $disabledTime = $null

    # 读取描述中的禁用时间标记,标记格式约定为[Disabled:yyyy-MM-dd]
    if ($isDisabled) {
        if ($description -match '\[Disabled:(\d{4}-\d{2}-\d{2})\]') {
            $disabledTime = [datetime]::ParseExact($matches[1], 'yyyy-MM-dd', $null)
        } else {
            # 未标记的禁用用户写入当前时间作为禁用基准
            $disabledTime = Get-Date
            $newDesc = $description + " [Disabled:$($disabledTime.ToString('yyyy-MM-dd'))]"
            $_.PsBase.Properties.Item("Description").Value = $newDesc
            $_.PsBase.CommitChanges()
        }
    }

    # 输出标准化的用户属性
    New-Object PSObject -Property @{
        ComputerName = $computerName
        UserName = $_.PsBase.Properties.Name.Value
        Description = $_.PsBase.Properties.Description.Value
        Disabled = $isDisabled
        LastLogin = if ($_.PsBase.Properties.LastLogin.Value) {[datetime]$_.PsBase.Properties.LastLogin.Value} else {$null}
        DisabledTime = $disabledTime
        NeedDelete = if ($isDisabled -and $disabledTime) {((Get-Date) - $disabledTime).TotalDays -gt ($maxDisabledWeeks * 7)} else {$false}
    }
}

# 输出筛选结果,可直接查看核对
$localUsers | Select-Object ComputerName,UserName,Disabled,LastLogin,DisabledTime,NeedDelete

# 确认筛选结果正确后,取消注释下方代码即可执行删除操作
# $localUsers | Where-Object {$_.NeedDelete} | ForEach-Object {
#     $adsiComputer.Delete('user', $_.UserName)
# }

方案说明

  • 全程仅使用PowerShell 2.0原生支持的ADSI接口,无需导入任何第三方模块,兼容所有主流Windows版本
  • 首次运行仅在原有描述末尾追加禁用时间标记,不会覆盖或修改原有描述内容
  • 可直接调整$maxDisabledWeeks参数自定义禁用账号的保留时长

内容的提问来源于stack exchange,提问作者Vlad D

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 02:24:03