可通过PowerShell脚本定期识别、禁用并(可选)删除AD中90天未登录的域账号,依据LastLogonDate属性判断过期,需满足AD模块、权限、域功能级别等前提,并推荐分禁用、观察、删除三阶段安全执行。
可以通过powershell脚本结合windows server域环境的active directory模块,定期识别、禁用并(可选)删除超过指定天数未登录的域账号。关键在于准确判断“过期”——通常以 lastlogontimestamp(复制属性,延迟最长14天)或更精确的 lastlogondate(需域功能级别≥2008 r2,且各dc同步后才可靠)为依据,并辅以账号启用状态、密码策略和组织单位(ou)范围控制。
一、确认前提条件与权限
执行脚本前需确保:
- 运行环境已安装 ActiveDirectory PowerShell模块(通常需在域控或已配置RSAT的管理机上);
- 执行账户具备 读取用户对象属性 权限,若需禁用/删除账号,还需 修改用户账户控制(userAccountControl) 和 删除对象 权限;
- 目标域支持 LastLogonDate 属性(推荐使用,比 LastLogonTimestamp 更及时);
- 明确清理策略:是仅禁用(推荐先试运行)、还是直接删除?是否排除管理员、服务账号、特定OU?
二、基础审计脚本示例(导出待处理账号)
以下脚本查找过去90天内未登录、且处于启用状态的普通用户账号(排除内置账户和服务账号):
# 设置参数
$DaysInactive = 90
$SearchBase = "OU=Users,DC=contoso,DC=com" # 指定OU范围,留空则查整个域
$ExcludeGroups = @("Domain Admins", "Enterprise Admins", "Server Operators")
$ExportPath = "C:\Reports\StaleAccounts_$(Get-Date -Format 'yyyyMMdd').csv"
<h1>获取过期账号(使用LastLogonDate,更准确)</h1><p>$StaleUsers = Search-ADAccount -UsersOnly -AccountInactive -TimeSpan "$DaysInactive" -SearchBase $SearchBase |
Where-Object {
$<em>.Enabled -eq $true -and
$</em>.SamAccountName -notmatch '^((KRBTGT|ADMINISTRATOR|GUEST)|S-\d-\d-\d{2}-\d{8,10}-\d{8,10}-\d{8,10}-\d{8,10})$' -and
($<em>.DistinguishedName -notmatch 'CN=Administrator|CN=Guest') -and
(-not (Get-ADPrincipalGroupMembership $</em> | Where-Object Name -in $ExcludeGroups))
} |
Get-ADUser -Properties LastLogonDate, PasswordLastSet, Description, Department |
Select-Object SamAccountName, Name, LastLogonDate, PasswordLastSet, Enabled, Description, Department, DistinguishedName</p><h1>导出报告</h1><p>$StaleUsers | Export-Csv -Path $ExportPath -NoTypeInformation -Encoding UTF8
Write-Host "共发现 $($StaleUsers.Count) 个待审核账号,已导出至 $ExportPath"
</p>三、安全清理流程(建议分阶段执行)
不建议一步删除。推荐三阶段策略:
-
第一阶段(禁用+通知):对导出账号执行
Disable-ADAccount,并在Description字段追加禁用时间与原因(如"DISABLED-20240520-Inactive90days"),便于追溯; - 第二阶段(保留观察):禁用后保留30–60天,期间监控业务影响、接收反馈;
-
第三阶段(删除):确认无误后,用
Remove-ADUser -Confirm:$false删除;生产环境强烈建议加日志记录与备份(如导出DN列表后再删)。
四、部署为定期任务
将脚本保存为 Invoke-StaleAccountCleanup.ps1,通过Windows任务计划程序定时运行:
- 触发器设为每周日凌晨2点;
- 操作中启动程序填
powershell.exe,参数填:-ExecutionPolicy Bypass -File "C:\Scripts\Invoke-StaleAccountCleanup.ps1"; - “运行方式”选择具备AD权限的专用服务账户(避免用Administrator);
- 勾选“不管用户是否登录都要运行”和“使用最高权限”。
脚本内建议加入错误捕获(try/catch)和邮件通知(用 Send-MailMessage 或现代 Send-MgUserMail)发送摘要报告。











