powershell 是 windows 域环境中检测僵尸账户最实用的工具,通过精准识别长期未登录、禁用未删除、密码永不过期却失活的高风险账户,并结合 lastlogontimestamp 等属性实现可追溯的持续治理。
powershell 是 windows 域环境中检测僵尸账户(长期未登录、已禁用但未删除、密码永不过期却无活动痕迹等)最实用的工具之一。关键不在于“查出多少个”,而在于精准识别“真正不再使用且存在安全风险”的账户。
识别长期未登录的用户账户
域控制器上运行以下命令,列出过去 90 天内从未登录的启用账户(排除内置账户和系统服务主体):
Get-ADUser -Filter {(Enabled -eq $true) -and (LastLogonDate -notlike "*")} -Properties LastLogonDate, PasswordNeverExpires, WhenCreated |
Where-Object { $_.LastLogonDate -lt (Get-Date).AddDays(-90) -or $_.LastLogonDate -eq $null } |
Select-Object Name, SamAccountName, WhenCreated, LastLogonDate, PasswordNeverExpires |
Sort-Object WhenCreated注意:LastLogonDate 是近似值(基于复制延迟),如需精确判断,应结合 LastLogonTimestamp(推荐)或跨所有域控查 LastLogon(性能开销大)。生产环境建议用 LastLogonTimestamp 并补上时间偏移校准。
筛选禁用但未删除的“幽灵账户”
这类账户常被遗忘,仍保留在 OU 中,可能被误启用或成为提权跳板:
Get-ADUser -Filter {Enabled -eq $false} -Properties Description, LastLogonDate, WhenChanged |
Where-Object { $_.WhenChanged -lt (Get-Date).AddDays(-180) } |
Select-Object Name, SamAccountName, Description, LastLogonDate, WhenChanged, DistinguishedName- 重点关注
Description字段是否为空或含“former”、“terminated”、“test”等线索 - 检查
DistinguishedName所在 OU 是否为归档区(如 “Disabled Users”),否则需人工确认是否应迁移或清理 - 避免直接批量删除,先导出报告并通知 IT 安全与 HR 共同审核
定位密码永不过期但长期失活的高风险账户
这类账户一旦凭据泄露,危害更大:
Get-ADUser -Filter {(PasswordNeverExpires -eq $true) -and (Enabled -eq $true)} -Properties LastLogonDate, WhenCreated, PasswordLastSet |
Where-Object {
($_.LastLogonDate -lt (Get-Date).AddDays(-180) -or $_.LastLogonDate -eq $null) -and
($_.PasswordLastSet -lt (Get-Date).AddDays(-365))
} |
Select-Object Name, SamAccountName, PasswordLastSet, LastLogonDate, WhenCreated- 同时满足:密码永不过期 + 启用状态 + 近半年无登录 + 近一年未改密 → 高优先级审查对象
- 常见于服务账户或早期管理员手动配置的遗留账户,建议改为定期轮换策略或迁移到托管服务账户(gMSA)
自动化汇总与轻量审计输出
将上述逻辑整合为可调度脚本,输出 HTML 报告供审核:
$Report = @()
$Report += Get-ADUser -Filter {(Enabled -eq $true) -and (LastLogonTimestamp -lt (Get-Date).AddDays(-90).ToFileTime())} -Properties LastLogonTimestamp, PasswordNeverExpires |
Select-Object Name, SamAccountName, @{n='LastLogonDaysAgo';e={[math]::Round(((Get-Date) - [datetime]::FromFileTime($_.LastLogonTimestamp)).TotalDays,0)}}, PasswordNeverExpires
<p>$Report | ConvertTo-Html -Title "Zombie Account Audit Report" -CssUri "style.css" | Out-File "C:\Reports\ZombieReport.html"</p>- 使用
ToFileTime()提升LastLogonTimestamp查询准确性 - 输出中加入“距上次登录天数”比原始时间戳更直观
- 配合任务计划程序每日凌晨执行,邮件发送摘要(可用
Send-MailMessage)
僵尸账户治理不是一次性的清理动作,而是持续的身份生命周期管理环节。PowerShell 提供了足够灵活又无需额外许可的手段,把“谁该删、谁该禁、谁该跟进”变成可验证、可追溯、可复现的操作。











