Windows 11本地账户LastLoginTime缺失,非事件日志方式获取最后登录时间咨询
无需事件日志获取本地账户最后登录时间的方法
可行方案
1. 使用Win32_NetworkLoginProfile CIM类
这个类直接提供了本地账户的LastLogon属性,无需依赖事件日志或权限受限的注册表路径,且推荐用Get-CimInstance替代已弃用的Get-WmiObject,执行效率更高。
2. 读取SAM注册表(需高权限)
SAM注册表路径HKLM\SAM\SAM\Domains\Account\Users存储了账户登录信息,但默认仅SYSTEM权限可访问,需要临时提升权限读取,操作相对复杂,不推荐作为常规方案。
修改后的脚本示例
以下是基于Win32_NetworkLoginProfile优化后的脚本,解决原脚本中注册表键不存在的问题:
# 设置非活动阈值(天数) $InactiveDays = 90 # 获取当前日期 $CurrentDate = Get-Date # 计算90天前的日期 $InactiveDate = $CurrentDate.AddDays(-$InactiveDays) # 查找已禁用的本地账户 Write-Host "已禁用的本地账户:" -ForegroundColor Green $DisabledAccounts = Get-CimInstance -Class Win32_UserAccount -Filter "Disabled = True AND LocalAccount = True" if ($DisabledAccounts) { foreach ($Account in $DisabledAccounts) { Write-Host " - $($Account.Name)" } } else { Write-Host " 未找到已禁用的本地账户。" } Write-Host "" # 查找超过90天未登录的本地账户 Write-Host "超过$($InactiveDays)天未活动的账户:" -ForegroundColor Green # 获取所有本地用户账户 $LocalAccounts = Get-CimInstance -Class Win32_UserAccount -Filter "LocalAccount = True" # 获取所有登录配置文件,关联账户SID $LoginProfiles = Get-CimInstance -Class Win32_NetworkLoginProfile foreach ($Account in $LocalAccounts) { # 匹配当前账户的登录配置文件 $Profile = $LoginProfiles | Where-Object { $_.SID -eq $Account.SID } if ($Profile -and $Profile.LastLogon) { $LastLoginTime = $Profile.LastLogon # 检查是否超过非活动阈值 if ($LastLoginTime -lt $InactiveDate) { Write-Host " - $($Account.Name) - 最后登录时间: $($LastLoginTime.ToString('yyyy-MM-dd HH:mm:ss'))" } } else { # 处理从未登录或无登录记录的账户 Write-Host " - $($Account.Name) - 无有效登录记录(可能从未登录)" } } Read-Host "按回车键退出"
注意事项
Win32_NetworkLoginProfile的LastLogon属性对从未登录过的账户会返回$null,脚本中已处理该场景。- 该类的
LastLogon记录的是账户的最后登录时间(包括本地和域登录,若机器加入域),通过LocalAccount = True过滤后仅针对本地账户。 - 相比原脚本的注册表方案,此方法无需处理权限问题和注册表键缺失情况,兼容性更强。
内容的提问来源于stack exchange,提问作者Average Joe
相关产品推荐
相关产品推荐

