在 Windows 系统上,有多种方法可以查看上一次登录的时间。以下是几种常见的方法:Windows 系统提供了丰富的日志和工具,可以帮助管理员和用户跟踪和分析登录历史。根据不同的需求,你可以选择合适的方法,如 PowerShell 脚本、事件查看器、Active Directory 查询、远程桌面日志等。对于大型企业环境,还可以通过集成的监控工具进行全面的用户活动追踪,确保系统的安全性和合规性。
完整执行命令 + 对应精度结果
1. 安全事件原始高精度 Tick(最高精度)
# 取最新一条4624登录事件
$log = Get-WinEvent -MaxEvents 1 -FilterHashtable @{LogName='Security';Id=4624}
# 读取原生时间戳计数
$log.TimeCreated.Ticks
639189545724628860
2. 安全事件格式化毫秒时间
$log.TimeCreated.ToString("yyyy-MM-dd HH:mm:ss.fff")
2026-07-06 17:09:32.462
3. CIM 开机时间 格式化毫秒输出
$boot = (Get-CimInstance Win32_OperatingSystem).LastBootUpTime
$boot.ToString("yyyy-MM-dd HH:mm:ss.fff")
2026-07-06 00:11:15.500
.500是原生存储粒度。4. CIM 开机时间 默认直接输出(自动舍弃毫秒)
(Get-CimInstance Win32_OperatingSystem).LastBootUpTime
2026年7月6日 0:11:15
5. quser 会话登录时间(最低精度,仅分钟)
quser
sysadmin_9070 console 1 运行中 无 2026-07-06 星期一 00:28
二、精度从高到低完整排序对比表
| 执行命令 / 数据类型 | 输出示例 | 最小分辨单位 | 精度层级 |
|---|---|---|---|
$log.TimeCreated.Ticks |
639189545724628860 | 100 纳秒 | 1(最高) |
$log.TimeCreated.ToString("yyyy-MM-dd HH:mm:ss.fff") |
2026-07-06 17:09:32.462 | 1 毫秒 | 2 |
$boot.ToString("yyyy-MM-dd HH:mm:ss.fff") |
2026-07-06 00:11:15.500 | 1 毫秒 | 3 |
(Get-CimInstance Win32_OperatingSystem).LastBootUpTime 默认打印 |
2026 年 7 月 6 日 0:11:15 | 1 秒 | 4 |
quser 登录时间 |
2026-07-06 星期一 00:28 | 1 分钟 | 5(最低) |
三、整合一键提取完整脚本(一次性输出全部时间 + 精度说明)
Write-Host "===== 1. 安全事件原始Ticks(100纳秒精度) =====" -ForegroundColor Cyan
$log = Get-WinEvent -MaxEvents 1 -FilterHashtable @{LogName='Security';Id=4624}
$tickVal = $log.TimeCreated.Ticks
Write-Host "Ticks数值:$tickVal"
Write-Host "`n===== 2. 安全事件 格式化毫秒时间 =====" -ForegroundColor Cyan
$logMs = $log.TimeCreated.ToString("yyyy-MM-dd HH:mm:ss.fff")
Write-Host "带毫秒时间:$logMs"
Write-Host "`n===== 3. 系统开机时间 格式化毫秒输出 =====" -ForegroundColor Cyan
$bootObj = Get-CimInstance Win32_OperatingSystem
$bootMs = $bootObj.LastBootUpTime.ToString("yyyy-MM-dd HH:mm:ss.fff")
Write-Host "开机毫秒时间:$bootMs"
Write-Host "`n===== 4. 系统开机 默认原生输出(仅到秒) =====" -ForegroundColor Cyan
$bootObj.LastBootUpTime
Write-Host "`n===== 5. 当前登录会话 quser(仅到分钟) =====" -ForegroundColor Cyan
quser
Write-Host "`n===== 精度层级:高 → 低 =====" -ForegroundColor Green
Write-Host "1. Event Ticks 100纳秒"
Write-Host "2. 日志格式化 .fff 毫秒"
Write-Host "3. 开机时间格式化 .fff 毫秒"
Write-Host "4. 开机直接输出 秒"
Write-Host "5. quser会话时间 分钟"
最终修改完整脚本 TimeAccuracyReport.ps1
- 保留两套格式对比:
.fff截断毫秒 /.ffffff完整 6 位微秒无截断 - HTML 每个区块附带对应 PowerShell 命令、输出样例、精度文字说明,完全匹配你给出的 5 段标准描述
- 保留 Tick 完整单位换算、微秒拆分数据
- 兼容低版本 PowerShell
-FilePath,带文件校验
<#
.SYNOPSIS
采集Windows各类高精度时间戳,生成桌面HTML对比报告
.DESCRIPTION
区分截断/无截断两种时间格式,附带每条对应的PowerShell命令、输出、精度说明
#>
#region 1. 定义输出路径(桌面)
$desktopPath = [Environment]::GetFolderPath("Desktop")
$htmlFullPath = Join-Path -Path $desktopPath -ChildPath "TimeReport.html"
#endregion
#region 2. 采集各项时间数据
# 2.1 安全日志最新4624登录事件
$latestSecLog = Get-WinEvent -MaxEvents 1 -FilterHashtable @{LogName='Security'; Id=4624}
$tickRawValue = $latestSecLog.TimeCreated.Ticks
# 截断3位毫秒
$logTimeMs_Trunc = $latestSecLog.TimeCreated.ToString("yyyy-MM-dd HH:mm:ss.fff")
# 无截断6位微秒完整精度
$logTimeFull_NoTrunc = $latestSecLog.TimeCreated.ToString("yyyy-MM-dd HH:mm:ss.ffffff")
# Tick小数拆分换算
$tickSecDecimal = $tickRawValue / 10000000
$decimalPart = $tickSecDecimal - [Math]::Floor($tickSecDecimal)
$totalNs = $decimalPart * 1000000000
$msPart = [Math]::Floor($decimalPart * 1000)
$usPart = [Math]::Floor(($decimalPart * 1000000) % 1000)
# 2.2 系统开机时间
$osInfo = Get-CimInstance Win32_OperatingSystem
$bootTimeMs = $osInfo.LastBootUpTime.ToString("yyyy-MM-dd HH:mm:ss.fff")
$bootTimeRaw = $osInfo.LastBootUpTime.ToString()
# 2.3 当前登录会话 quser 原始文本(保留换行)
$quserOutput = quser 2>&1 | Out-String
$quserHtmlText = $quserOutput -replace "`r`n","<br>"
#endregion
#region 3. 构建完整HTML页面代码
$htmlTemplate = @"
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Windows 系统时间精度对比报告 | 截断 vs 无截断</title>
<style>
*{box-sizing:border-box;margin:0;padding:0;}
body {font-family:"Microsoft Yahei",SimHei,sans-serif;background:#f0f4f9;padding:24px;line-height:1.6}
h1 {color:#007acc;margin-bottom:20px;border-left:6px solid #007acc;padding-left:12px}
h2 {color:#005b99;font-size:17px;margin:16px 0 10px 0}
.card {background:#ffffff;border-radius:10px;padding:18px;margin-bottom:18px;box-shadow:0 2px 10px rgba(0,122,204,0.1)}
pre {background:#0f192b;color:#4cd964;padding:14px;border-radius:6px;white-space:pre-wrap;font-family:Consolas,monospace;font-size:14px;overflow-x:auto}
.table-box {margin-top:10px}
table {width:100%;border-collapse:collapse;border:1px solid #d0e4f5}
th,td {padding:10px 14px;border:1px solid #d0e4f5;text-align:left}
th {background:#007acc;color:#fff}
.rank-card {background:#e8f4ff}
.info-desc {color:#666;font-size:14px;margin-bottom:8px}
.cmd-block {color:#ff8822;font-weight:bold;margin:6px 0}
.non-trunc {color:#00aa33;font-weight:bold}
.trunc-text {color:#cc3333}
.calc-desc {color:#009933;margin-top:6px;font-size:14px}
</style>
</head>
<body>
<h1>Windows 时间精度采集对比报告(区分截断/无截断)</h1>
<div class="card">
<h2>1. 安全事件原始高精度 Tick(最高精度)</h2>
<div class="cmd-block">PowerShell 命令:</div>
<pre>`$log = Get-WinEvent -MaxEvents 1 -FilterHashtable @{LogName='Security';Id=4624}
`$log.TimeCreated.Ticks</pre>
<div class="info-desc">输出结果:</div>
<pre>$tickRawValue</pre>
<div class="info-desc">精度说明:1 Tick = 100 纳秒,系统原生存储无精度丢失,审计场景精度天花板。</div>
<div class="calc-desc">完整拆分:$msPart 毫秒 + $usPart 微秒 | 总纳秒:$totalNs</div>
</div>
<div class="card">
<h2>2. 安全事件格式化时间对比(截断 / 无截断)</h2>
<div class="cmd-block">【截断版 3位毫秒】命令:</div>
<pre>`$log.TimeCreated.ToString("yyyy-MM-dd HH:mm:ss.fff")</pre>
<div class="info-desc trunc-text">输出(纳秒部分被截断):</div>
<pre>$logTimeMs_Trunc</pre>
<div class="info-desc trunc-text">精度:毫秒级(保留 3 位小数),由 Tick 换算而来,纳秒部分被截断丢失。</div>
<br>
<div class="cmd-block">【无截断完整6位微秒】命令:</div>
<pre>`$log.TimeCreated.ToString("yyyy-MM-dd HH:mm:ss.ffffff")</pre>
<div class="info-desc non-trunc">输出(完整不截断):</div>
<pre>$logTimeFull_NoTrunc</pre>
<div class="info-desc non-trunc">精度:微秒级(6位小数),完整还原Tick原始精度,无截断、无丢失。</div>
</div>
<div class="card">
<h2>3. CIM 开机时间 格式化毫秒输出</h2>
<div class="cmd-block">PowerShell 命令:</div>
<pre>`$boot = (Get-CimInstance Win32_OperatingSystem).LastBootUpTime
`$boot.ToString("yyyy-MM-dd HH:mm:ss.fff")</pre>
<div class="info-desc">输出结果:</div>
<pre>$bootTimeMs</pre>
<div class="info-desc">精度:毫秒级;底层 CIM 接口本身只存毫秒数据,无纳秒原始值,末尾.500是原生存储粒度。</div>
</div>
<div class="card">
<h2>4. CIM 开机时间 默认直接输出(自动舍弃毫秒)</h2>
<div class="cmd-block">PowerShell 命令:</div>
<pre>(Get-CimInstance Win32_OperatingSystem).LastBootUpTime</pre>
<div class="info-desc">输出结果:</div>
<pre>$bootTimeRaw</pre>
<div class="info-desc">精度:仅到秒,控制台默认展示省略毫秒。</div>
</div>
<div class="card">
<h2>5. quser 会话登录时间(最低精度,仅分钟)</h2>
<div class="cmd-block">PowerShell / CMD 命令:</div>
<pre>quser</pre>
<div class="info-desc">输出片段:</div>
<pre>$quserHtmlText</pre>
<div class="info-desc">精度:仅到分钟,秒、毫秒全部丢弃。</div>
</div>
<div class="card rank-card">
<h2>时间精度层级排序(由高 → 低)</h2>
<div class="table-box">
<table>
<tr>
<th>精度排名</th>
<th>数据来源</th>
<th>最小分辨单位</th>
<th>截断说明</th>
</tr>
<tr>
<td>1</td>
<td>安全事件 .Ticks</td>
<td>100 纳秒</td>
<td>原生整型,完全无截断</td>
</tr>
<tr>
<td>2</td>
<td>日志 .ffffff 6位微秒格式</td>
<td>1 微秒</td>
<td>完整还原,无截断</td>
</tr>
<tr>
<td>3</td>
<td>日志 .fff 3位毫秒格式</td>
<td>1 毫秒</td>
<td>截断后3位,丢失微秒纳秒</td>
</tr>
<tr>
<td>4</td>
<td>CIM开机 .fff 毫秒格式</td>
<td>1 毫秒</td>
<td>底层原生仅存毫秒,无更高精度</td>
</tr>
<tr>
<td>5</td>
<td>CIM开机默认直接输出</td>
<td>1 秒</td>
<td>舍弃全部小数毫秒</td>
</tr>
<tr>
<td>6</td>
<td>quser 会话登录时间</td>
<td>1 分钟</td>
<td>秒、毫秒全部丢弃</td>
</tr>
</table>
</div>
</div>
</body>
</html>
"@
#endregion
#region 4. 写入HTML(兼容全版本PowerShell)
$htmlTemplate | Out-File -FilePath $htmlFullPath -Encoding utf8
# 判断文件是否生成成功
if (Test-Path -Path $htmlFullPath) {
Write-Host "`n报告生成完成!文件路径:$htmlFullPath" -ForegroundColor Green
Start-Process -FilePath $htmlFullPath
}
else {
Write-Host "`n文件写入失败,未生成HTML报告!" -ForegroundColor Red
}
#endregion
脚本匹配你需求的核心改动
- 分 5 大区块,完全对应你列出的 5 类时间源,每块内置对应执行命令、输出样例、原文精度描述;
- 第 2 区块增加对比:
- 红色标注
.fff截断版(丢失微秒 / 纳秒) - 绿色标注
.ffffff无截断完整微秒版
- 红色标注
- 精度表格新增「截断说明」列,清晰区分有无精度丢失;
- 保留 Tick 毫秒 / 微秒 / 纳秒自动换算展示;
- 所有文字说明完全照搬你提供的标准描述,无修改;
- 修复 Out-File 参数兼容低版本 PowerShell,生成后自动打开桌面 HTML。
修改完成:完整保留 6 位微秒不截断、新增纳秒换算明细,修复版完整脚本 TimeAccuracyReport.ps1
- 安全日志时间改为
.ffffff6 位微秒,无截断完整展示小数 - 新增纳秒拆分计算,HTML 输出完整细分:毫秒 / 微秒 / 总纳秒
- 精度表格补充 6 位微秒格式说明
- 保留
-FilePath兼容低版本 PowerShell
<#
.SYNOPSIS
采集Windows各类高精度时间戳,生成桌面HTML对比报告
.DESCRIPTION
采集安全事件Ticks、完整6位微秒日志时间、开机时间、quser登录会话,生成美化网页保存桌面并自动打开,时间无截断完整精度展示
#>
#region 1. 定义输出路径(桌面)
$desktopPath = [Environment]::GetFolderPath("Desktop")
$htmlFullPath = Join-Path -Path $desktopPath -ChildPath "TimeReport.html"
#endregion
#region 2. 采集各项时间数据
# 2.1 安全日志最新4624登录事件
$latestSecLog = Get-WinEvent -MaxEvents 1 -FilterHashtable @{LogName='Security'; Id=4624}
$tickRawValue = $latestSecLog.TimeCreated.Ticks
# 改为6位微秒,不截断完整精度 .ffffff
$logTimeFull = $latestSecLog.TimeCreated.ToString("yyyy-MM-dd HH:mm:ss.ffffff")
# 拆分时间小数段做单位换算
$tickSecDecimal = $tickRawValue / 10000000
$decimalPart = $tickSecDecimal - [Math]::Floor($tickSecDecimal)
$totalNs = $decimalPart * 1000000000
$msPart = [Math]::Floor($decimalPart * 1000)
$usPart = [Math]::Floor(($decimalPart * 1000000) % 1000)
# 2.2 系统开机时间
$osInfo = Get-CimInstance Win32_OperatingSystem
$bootTimeMs = $osInfo.LastBootUpTime.ToString("yyyy-MM-dd HH:mm:ss.fff")
$bootTimeRaw = $osInfo.LastBootUpTime.ToString()
# 2.3 当前登录会话 quser 原始文本(保留换行)
$quserOutput = quser 2>&1 | Out-String
# 替换换行符为HTML换行标签
$quserHtmlText = $quserOutput -replace "`r`n","<br>"
#endregion
#region 3. 构建完整HTML页面代码
$htmlTemplate = @"
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Windows 系统时间精度对比报告</title>
<style>
*{box-sizing:border-box;margin:0;padding:0;}
body {font-family:"Microsoft Yahei",SimHei,sans-serif;background:#f0f4f9;padding:24px;line-height:1.6}
h1 {color:#007acc;margin-bottom:20px;border-left:6px solid #007acc;padding-left:12px}
h2 {color:#005b99;font-size:17px;margin:16px 0 10px 0}
.card {background:#ffffff;border-radius:10px;padding:18px;margin-bottom:18px;box-shadow:0 2px 10px rgba(0,122,204,0.1)}
pre {background:#0f192b;color:#4cd964;padding:14px;border-radius:6px;white-space:pre-wrap;font-family:Consolas,monospace;font-size:14px;overflow-x:auto}
.table-box {margin-top:10px}
table {width:100%;border-collapse:collapse;border:1px solid #d0e4f5}
th,td {padding:10px 14px;border:1px solid #d0e4f5;text-align:left}
th {background:#007acc;color:#fff}
.rank-card {background:#e8f4ff}
.info-desc {color:#666;font-size:14px;margin-bottom:8px}
.calc-desc {color:#009933;margin-top:6px;font-size:14px}
</style>
</head>
<body>
<h1>Windows 时间精度采集对比报告(无截断完整精度)</h1>
<div class="card">
<h2>1. 安全事件原始Ticks(最高精度:1 Tick = 100 纳秒)</h2>
<div class="info-desc">安全日志底层原生存储整型时间戳,无精度丢失</div>
<pre>Ticks 原始数值:$tickRawValue</pre>
<div class="calc-desc">单位换算基准:1秒 = 10,000,000 Ticks | 1 Tick = 100 纳秒</div>
</div>
<div class="card">
<h2>2. 安全事件完整高精度时间(6位微秒,无截断)</h2>
<div class="info-desc">由Ticks完整换算,保留小数点后6位微秒,不截断、不四舍五入</div>
<pre>完整高精度时间:$logTimeFull</pre>
<div class="calc-desc">细分拆分:$msPart 毫秒 + $usPart 微秒 | 小数段总纳秒:$totalNs</div>
</div>
<div class="card">
<h2>3. 系统开机时间(格式化毫秒输出,仅3位精度)</h2>
<div class="info-desc">CIM接口底层仅支持毫秒存储,无法输出微秒级数据</div>
<pre>开机毫秒时间:$bootTimeMs</pre>
</div>
<div class="card">
<h2>4. 系统开机 默认原生输出(仅到秒)</h2>
<div class="info-desc">PowerShell直接打印自动舍弃毫秒部分</div>
<pre>$bootTimeRaw</pre>
</div>
<div class="card">
<h2>5. 当前登录会话 quser(最低精度:仅到分钟)</h2>
<div class="info-desc">会话接口仅记录登录分钟,秒、毫秒全部丢失</div>
<pre>$quserHtmlText</pre>
</div>
<div class="card rank-card">
<h2>时间精度层级排序(由高 → 低)</h2>
<div class="table-box">
<table>
<tr>
<th>精度排名</th>
<th>数据来源</th>
<th>最小分辨单位</th>
<th>输出格式说明</th>
</tr>
<tr>
<td>1</td>
<td>安全事件 .Ticks</td>
<td>100 纳秒</td>
<td>原生整型,完整无丢失</td>
</tr>
<tr>
<td>2</td>
<td>日志格式化 yyyy-MM-dd HH:mm:ss.ffffff</td>
<td>1 微秒</td>
<td>6位小数,无截断完整展示</td>
</tr>
<tr>
<td>3</td>
<td>开机时间格式化 .fff</td>
<td>1 毫秒</td>
<td>仅3位,底层精度限制</td>
</tr>
<tr>
<td>4</td>
<td>开机默认原生输出</td>
<td>1 秒</td>
<td>舍弃全部小数</td>
</tr>
<tr>
<td>5</td>
<td>quser 会话登录时间</td>
<td>1 分钟</td>
<td>仅保留时分,丢失秒</td>
</tr>
</table>
</div>
</div>
</body>
</html>
"@
#endregion
#region 4. 写入HTML(-FilePath 兼容全版本PowerShell)
$htmlTemplate | Out-File -FilePath $htmlFullPath -Encoding utf8
# 判断文件是否生成成功
if (Test-Path -Path $htmlFullPath) {
Write-Host "`n报告生成完成!文件路径:$htmlFullPath" -ForegroundColor Green
Start-Process -FilePath $htmlFullPath
}
else {
Write-Host "`n文件写入失败,未生成HTML报告!" -ForegroundColor Red
}
#endregion
核心修改说明
- 取消截断关键修改
原:
yyyy-MM-dd HH:mm:ss.fff(仅 3 位毫秒,截断微秒)现:yyyy-MM-dd HH:mm:ss.ffffff(6 位完整微秒,无任何截断) - 自动计算拆分:毫秒、微秒、总纳秒,在网页展示完整单位换算明细
- 精度表格新增一列说明,区分「6 位无截断微秒格式」与「3 位截断毫秒格式」
- 页面标题标注 无截断完整精度,区分旧版截断脚本
- 保留兼容修复:
-FilePath写入参数、文件存在校验逻辑不变
PowerShell 脚本:采集全部时间数据,自动生成 HTML 网页保存到桌面
- 采集你所有时间精度数据(Ticks / 毫秒开机 / 默认开机 /quser 会话 / 精度排序)
- 生成美观 HTML 页面,自动存桌面
TimeReport.html - 执行完成自动打开网页
保存为 TimeAccuracyReport.ps1 编码 ANSI 保存
<#
.SYNOPSIS
采集Windows各类高精度时间戳,生成桌面HTML对比报告
.DESCRIPTION
采集安全事件Ticks、毫秒级日志时间、开机时间、quser登录会话,生成美化网页保存桌面并自动打开
#>
#region 1. 定义输出路径(桌面)
$desktopPath = [Environment]::GetFolderPath("Desktop")
$htmlFullPath = Join-Path -Path $desktopPath -ChildPath "TimeReport.html"
#endregion
#region 2. 采集各项时间数据
# 2.1 安全日志最新4624登录事件
$latestSecLog = Get-WinEvent -MaxEvents 1 -FilterHashtable @{LogName='Security'; Id=4624}
$tickRawValue = $latestSecLog.TimeCreated.Ticks
$logTimeMs = $latestSecLog.TimeCreated.ToString("yyyy-MM-dd HH:mm:ss.fff")
# 2.2 系统开机时间
$osInfo = Get-CimInstance Win32_OperatingSystem
$bootTimeMs = $osInfo.LastBootUpTime.ToString("yyyy-MM-dd HH:mm:ss.fff")
$bootTimeRaw = $osInfo.LastBootUpTime.ToString()
# 2.3 当前登录会话 quser 原始文本(保留换行)
$quserOutput = quser 2>&1 | Out-String
# 替换换行符为HTML换行标签
$quserHtmlText = $quserOutput -replace "`r`n","<br>"
#endregion
#region 3. 构建完整HTML页面代码
$htmlTemplate = @"
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Windows 系统时间精度对比报告</title>
<style>
*{box-sizing:border-box;margin:0;padding:0;}
body {font-family:"Microsoft Yahei",SimHei,sans-serif;background:#f0f4f9;padding:24px;line-height:1.6}
h1 {color:#007acc;margin-bottom:20px;border-left:6px solid #007acc;padding-left:12px}
h2 {color:#005b99;font-size:17px;margin:16px 0 10px 0}
.card {background:#ffffff;border-radius:10px;padding:18px;margin-bottom:18px;box-shadow:0 2px 10px rgba(0,122,204,0.1)}
pre {background:#0f192b;color:#4cd964;padding:14px;border-radius:6px;white-space:pre-wrap;font-family:Consolas,monospace;font-size:14px;overflow-x:auto}
.table-box {margin-top:10px}
table {width:100%;border-collapse:collapse;border:1px solid #d0e4f5}
th,td {padding:10px 14px;border:1px solid #d0e4f5;text-align:left}
th {background:#007acc;color:#fff}
.rank-card {background:#e8f4ff}
.info-desc {color:#666;font-size:14px;margin-bottom:8px}
</style>
</head>
<body>
<h1>Windows 时间精度采集对比报告</h1>
<div class="card">
<h2>1. 安全事件原始Ticks(最高精度:1 Tick = 100 纳秒)</h2>
<div class="info-desc">安全日志底层原生存储整型时间戳,无精度丢失</div>
<pre>Ticks 原始数值:$tickRawValue</pre>
</div>
<div class="card">
<h2>2. 安全事件格式化毫秒时间</h2>
<div class="info-desc">由Ticks换算,精确到千分之一秒</div>
<pre>带毫秒完整时间:$logTimeMs</pre>
</div>
<div class="card">
<h2>3. 系统开机时间(格式化毫秒输出)</h2>
<div class="info-desc">CIM接口格式化后展示毫秒,底层仅支持毫秒存储</div>
<pre>开机毫秒时间:$bootTimeMs</pre>
</div>
<div class="card">
<h2>4. 系统开机 默认原生输出(仅到秒)</h2>
<div class="info-desc">PowerShell直接打印自动舍弃毫秒部分</div>
<pre>$bootTimeRaw</pre>
</div>
<div class="card">
<h2>5. 当前登录会话 quser(最低精度:仅到分钟)</h2>
<div class="info-desc">会话接口仅记录登录分钟,秒、毫秒全部丢失</div>
<pre>$quserHtmlText</pre>
</div>
<div class="card rank-card">
<h2>时间精度层级排序(由高 → 低)</h2>
<div class="table-box">
<table>
<tr>
<th>精度排名</th>
<th>数据来源</th>
<th>最小分辨单位</th>
</tr>
<tr>
<td>1</td>
<td>安全事件 .Ticks</td>
<td>100 纳秒</td>
</tr>
<tr>
<td>2</td>
<td>日志格式化 yyyy-MM-dd HH:mm:ss.fff</td>
<td>1 毫秒</td>
</tr>
<tr>
<td>3</td>
<td>开机时间格式化 .fff</td>
<td>1 毫秒</td>
</tr>
<tr>
<td>4</td>
<td>开机默认原生输出</td>
<td>1 秒</td>
</tr>
<tr>
<td>5</td>
<td>quser 会话登录时间</td>
<td>1 分钟</td>
</tr>
</table>
</div>
</div>
</body>
</html>
"@
#endregion
#region 4. 修复写入参数:改用 -FilePath 兼容所有PS版本
$htmlTemplate | Out-File -FilePath $htmlFullPath -Encoding utf8
# 判断文件是否生成成功
if (Test-Path -Path $htmlFullPath) {
Write-Host "`n报告生成完成!文件路径:$htmlFullPath" -ForegroundColor Green
Start-Process -FilePath $htmlFullPath
}
else {
Write-Host "`n文件写入失败,未生成HTML报告!" -ForegroundColor Red
}
#endregion
PowerShell 脚本:采集全部时间数据,自动生成 HTML 网页保存到桌面
- 采集你所有时间精度数据(Ticks / 毫秒开机 / 默认开机 /quser 会话 / 精度排序)
- 生成美观 HTML 页面,自动存桌面
TimeReport.html - 执行完成自动打开网页
# 获取桌面路径
$desktop = [Environment]::GetFolderPath("Desktop")
$htmlPath = Join-Path $desktop "TimeReport.html"
# 1. 采集安全事件数据
$log = Get-WinEvent -MaxEvents 1 -FilterHashtable @{LogName='Security';Id=4624}
$tickVal = $log.TimeCreated.Ticks
$logMs = $log.TimeCreated.ToString("yyyy-MM-dd HH:mm:ss.fff")
# 2. 采集开机时间
$bootObj = Get-CimInstance Win32_OperatingSystem
$bootMs = $bootObj.LastBootUpTime.ToString("yyyy-MM-dd HH:mm:ss.fff")
$bootRaw = $bootObj.LastBootUpTime.ToString()
# 3. 采集quser文本
$quserText = quser 2>&1 | Out-String
# 拼接完整HTML内容
$html = @"
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>系统时间精度对比报告</title>
<style>
body { font-family: "Microsoft Yahei",sans-serif; padding:20px; background:#f5f7fa; }
.box { background:#fff; border-radius:8px; padding:16px; margin-bottom:15px; box-shadow:0 1px 4px #ddd; }
h2 { color:#0099cc; margin-top:0; font-size:18px; }
pre { background:#222; color:#0f0; padding:12px; border-radius:6px; white-space:pre-wrap; }
.rank { background:#e8f4ff; }
table { border-collapse:collapse; width:100%; margin-top:10px; }
td,th { border:1px solid #ccc; padding:8px; }
th { background:#0099cc; color:white; }
</style>
</head>
<body>
<h1>Windows 时间精度采集对比报告</h1>
<div class="box">
<h2>1. 安全事件原始Ticks(最高精度:1 Tick = 100 纳秒)</h2>
<pre>Ticks数值:$tickVal</pre>
</div>
<div class="box">
<h2>2. 安全事件格式化毫秒时间</h2>
<pre>带毫秒时间:$logMs</pre>
</div>
<div class="box">
<h2>3. 系统开机时间(格式化毫秒输出)</h2>
<pre>开机毫秒时间:$bootMs</pre>
</div>
<div class="box">
<h2>4. 系统开机 默认原生输出(仅到秒)</h2>
<pre>$bootRaw</pre>
</div>
<div class="box">
<h2>5. 当前登录会话 quser(最低精度:仅到分钟)</h2>
<pre>$quserText</pre>
</div>
<div class="box rank">
<h2>时间精度层级排序(由高 → 低)</h2>
<table>
<tr><th>层级</th><th>数据类型</th><th>最小分辨单位</th></tr>
<tr><td>1</td><td>安全事件 .Ticks</td><td>100 纳秒</td></tr>
<tr><td>2</td><td>日志格式化 yyyy-MM-dd HH:mm:ss.fff</td><td>1 毫秒</td></tr>
<tr><td>3</td><td>开机时间格式化 .fff</td><td>1 毫秒</td></tr>
<tr><td>4</td><td>开机默认原生输出</td><td>1 秒</td></tr>
<tr><td>5</td><td>quser 会话登录时间</td><td>1 分钟</td></tr>
</table>
</div>
</body>
</html>
"@
# 写入桌面HTML文件
$html | Out-File -FilePath $htmlPath -Encoding utf8
Write-Host "报告已生成至桌面:$htmlPath" -ForegroundColor Green
# 自动打开网页
Start-Process $htmlPath
使用方式
- 管理员打开 PowerShell
- 全部复制粘贴执行
- 自动在桌面生成
TimeReport.html并弹出浏览器打开 - 页面包含所有采集数据、格式化代码块、精度对比表格,可直接保存 / 复制
在 Windows 系统上查看上一次登录时间的完整指南
在 Windows 系统中,无论你是排查安全问题还是进行系统审计,查看用户的上一次登录时间都是一项常见需求。根据不同的环境(本地计算机或企业域环境),以下是准确且实用的查看方法。
一、 本地计算机环境(适用于单台 PC 或服务器)
1. 使用 net user 命令(最简单快捷)
这是查看本地用户上次登录时间最直接的方法。
- 按
Windows 键 + R,输入cmd,按 Enter 打开命令提示符。 - 输入以下命令并按 Enter(将
username替换为目标用户名):
net user username
- 在返回的信息中,查找 “上次登录” 字段,即可看到确切的时间。
2. 使用 PowerShell 查看 (Get-LocalUser)
PowerShell 提供了更现代的查询方式,wmic 命令已被微软弃用,推荐使用此方法。
- 按
Windows 键 + X,选择 Windows PowerShell 或 终端。 - 输入以下命令列出所有本地用户及其上次登录时间:
Get-LocalUser | Select-Object Name, LastLogon
- 如果只想看特定用户:
Get-LocalUser -Name "username" | Select-Object Name, LastLogon
3. 使用事件查看器查看安全日志(最详尽)
Windows 会将所有交互式和网络登录记录在安全日志中。这是追踪历史登录记录的核心工具。
- 按
Windows 键 + R,输入eventvwr.msc打开事件查看器。 - 依次展开 Windows 日志 > 安全。
- 在右侧点击 筛选当前日志,在“事件 ID”中输入
4624(代表成功登录),点击确定。 - 注意辨别 Logon Type(登录类型):在筛选出的日志详情中,查看“登录类型”:
- Type 2:交互式登录(本地键盘鼠标登录)
- Type 10:远程桌面登录 (RDP)
- *(忽略 Type 5,那是系统服务后台登录)*
4. 使用 quser 查看当前活跃会话
如果你只想知道当前哪些用户在线以及他们是什么时候登录的,可以使用此命令。
- 打开命令提示符。
- 输入
quser并回车。 - *注意:此命令只能显示当前仍在活动中的用户会话,无法查看已经注销的用户的“上一次”登录时间。*
5. 通过任务管理器查看(当前在线用户)
- 按
Ctrl + Shift + Esc打开任务管理器。 - 切换到 用户 选项卡(Win11 中在左侧栏)。
- 这里会显示当前已登录的所有用户及其会话状态和登录时间。
二、 企业域环境(Active Directory / Azure AD)
如果你处于使用域控制器的企业网络中,登录信息通常存储在域控制器(DC)或云端。
6. 使用 PowerShell 查询域用户 (Get-ADUser)
- 打开 Windows PowerShell(需安装 RSAT 工具或直接在域控上运行)。
- 查询单个用户的上次登录时间(此属性会跨域控制器同步,可能有几小时的延迟):
Get-ADUser -Identity "username" -Properties LastLogonDate | Select Name, LastLogonDate
7. 查询所有域控制器的最精确登录时间(高级)
由于 LastLogon 属性(非带Date后缀的)不会在域控间复制,若要获取绝对精确的最后一次登录时间,需遍历所有 DC:
$User = "username"$DomainControllers = Get-ADDomainController -Filter *
foreach ($DC in$DomainControllers) {
Get-ADUser -Identity $User -Server$DC.Name -Properties LastLogon |
Select-Object Name, @{Name="LastLogonTime";Expression={[datetime]::FromFileTime($_.LastLogon)}}, @{Name="DomainController";Expression={$DC.Name}}
}
8. 通过 Azure 门户查看云端登录历史
对于使用 Azure AD (Entra ID) 的环境:
- 登录到 Azure 门户。
- 导航至 Azure Active Directory > 用户 > 选择目标用户 > 登录日志。
- 这里会显示每次登录的时间、IP 地址、设备和应用程序等极其详细的信息。
三、 远程与网络登录追踪
9. 查看 RDP(远程桌面)登录时间
除了在安全日志中查看 Event ID 4624 (Logon Type 10) 外,还可以查看专用的 RDP 日志:
- 打开 事件查看器。
- 导航至 应用程序和服务日志 > Microsoft > Windows > TerminalServices-LocalSessionManager > Operational。
- 查找 事件 ID 21(会话登录)和 22(会话注销)。
10. 查看 SMB 网络共享访问记录
如果用户通过网络共享文件夹访问服务器:
- 打开 事件查看器。
- 导航至 应用程序和服务日志 > Microsoft > Windows > SMBServer > Operational(需提前开启审核策略)。
- 查找与登录和访问资源相关的事件。
11. 监控登录失败尝试(安全审计)
为了防范暴力破解,查看登录失败记录非常重要:
- 打开事件查看器 > Windows 日志 > 安全。
- 筛选 事件 ID 4625(失败登录)。
- 详情中会显示尝试登录的账户名和失败原因(如密码错误、账户锁定等)。
四、 第三方工具与辅助方法
12. 使用 NirSoft LastActivityView
如果你需要查看本地计算机上用户的详细活动轨迹(不仅是登录,还包括运行程序、打开文件的时间),可以使用 NirSoft 提供的免费工具 LastActivityView。它提供直观的图形界面,能读取系统底层记录,恢复出比安全日志更长久的活动历史。
13. 利用组策略开启登录审核(管理员预备工作)
如果发现事件查看器中没有 4624/4625 日志,说明系统未开启审核策略:
- 运行
secpol.msc(本地安全策略)。 - 导航至 本地策略 > 审核策略 > 审核登录事件。
- 勾选“成功”和“失败”。此后,系统才会开始记录详细的登录日志。
14. 借助任务计划程序记录未来登录(自定义监控)
如果你希望系统以后在每次有人登录时,主动发邮件或写入特定的自定义日志:
- 打开 任务计划程序。
- 创建基本任务,触发器选择 当用户登录时。
- 操作可以设置为运行一个 PowerShell 脚本(例如记录当前时间并写入指定的 txt 文件或数据库)。
对于日常快速查询,net user 和 Get-LocalUser 是最佳选择;对于安全审计和故障排查,**事件查看器(Event ID 4624/4625)**是核心武器;在域环境中,则依赖 Get-ADUser 和 Azure 登录日志。请根据你的具体需求选择合适的方法。
五、 高级脚本与自动化查询
15. 使用 PowerShell 深度解析 4624 安全日志
直接在事件查看器中翻找 4624 事件往往不够直观,因为包含大量系统后台的登录(Logon Type 5)。你可以使用 PowerShell 直接将安全日志解析为结构化表格,筛选出用户的交互式登录(Type 2)或远程登录(Type 10)。
运行脚本:
$events = Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4624} -MaxEvents 100
foreach ($event in$events) {
$xml = [xml]$event.ToXml()
# 提取 XML 中的目标用户名和登录类型
$user = ($xml.Event.EventData.Data | Where-Object {$_.Name -eq 'TargetUserName'}).'#text'
$logonType = ($xml.Event.EventData.Data | Where-Object {$_.Name -eq 'LogonType'}).'#text'
# 只显示真实用户(排除系统账户$结尾的)且为本地(2)或远程(10)登录
if ($user -and -not$user.EndsWith('$') -and ($logonType -eq '2' -or $logonType -eq '10')) {
[PSCustomObject]@{
Time = $event.TimeCreated
User = $user
LogonType = $logonType
}
}
}
这种方法非常适合需要导出近期所有真实用户登录历史进行安全审计的场景。
16. 使用 Get-CimInstance 替代已弃用的 wmic
微软已宣布弃用 wmic。如果习惯于使用 WMI 查询,可以使用 Get-CimInstance 来替代。
- 命令:
Get-CimInstance -ClassName Win32_NetworkLoginProfile | Select-Object Name, LastLogon
- 注意: 返回的
LastLogon时间格式是 WMI 专用的日期格式(如20240520103000.000000+480),需要在脚本中通过[System.Management.ManagementDateTimeConverter]::ToDateTime()进行转换才能正常阅读。因此,日常使用依然推荐Get-LocalUser。
六、 特定网络环境登录追踪
17. VPN / RADIUS (NPS) 登录记录
如果用户通过 VPN 连接到公司网络,登录认证通常由 Windows Server 的网络策略服务器(NPS / RADIUS)处理。
- 操作方法:
- 登录到运行 NPS 服务的服务器。
- 打开事件查看器,导航至 Windows 日志 > 系统。
- 筛选 事件 ID 6272(网络策略服务器授予用户访问权限)。
- 该事件会详细记录 VPN 登录的时间、用户名、拨入的 IP 地址以及连接的会话参数。
18. IIS 日志(Web 服务器 Windows 身份验证)
如果公司内部有使用 IIS 承载的 Web 应用,并且开启了 Windows 集成身份验证,用户通过浏览器访问该网站时,也会在 IIS 日志中留下登录记录。
- 操作方法:
- 默认情况下,IIS 日志存储在
C:\inetpub\logs\LogFiles\W3SVC<站点ID>\目录下。 - 日志文件是文本格式(.log),可以直接用记事本或 Log Parser 查看。
- 查找
cs-username字段不为空的记录,结合date和time字段,即可知道该用户何时通过 Web 方式进行了身份验证。
- 默认情况下,IIS 日志存储在
七、 Active Directory 属性深度理解
在域环境中查询用户登录时间时,很多管理员会对 AD 用户属性中的三个字段感到困惑。理解它们对于获取准确的登录时间至关重要:
19. 区分 LastLogon、LastLogonTimeStamp 和 LastLogonDate
LastLogon:这是最准确的最后登录时间。但它不会在域控之间复制。这意味着用户如果在 DC-A 上登录,DC-B 上不会有记录。要获取绝对准确的时间,必须像前面第7点那样,编写脚本遍历所有域控制器,取最大值。LastLogonTimeStamp:这个属性会在所有域控之间复制,但它不是实时的。默认情况下,系统只有当用户登录时间与上次记录的时间相差超过 14 天时,才会更新这个值。这个属性的设计初衷是为了让管理员清理长期不活跃的账户,不适合用于查案或精确的近期登录审计。LastLogonDate:这是 PowerShell(Get-ADUser)特有的一个计算属性,它实际上显示的就是LastLogonTimeStamp转换后的本地时间。由于存在 14 天的延迟,你可能会发现某些刚刚登录的用户,这个时间仍然显示的是十几天前。
八、 系统底层与第三方安全监控
20. 使用 Sysmon 记录底层登录活动
Sysmon(System Monitor)是微软 Sysinternals 套件中的高级监控工具。它可以记录系统底层的活动,常用于高级威胁狩猎(APT 防御)。
- 原理: 虽然Sysmon本身没有专门的“用户登录”事件,但可以通过配置规则,监控特定的进程创建(Event ID 1,如
Userinit.exe或explorer.exe的启动)。当这些进程以特定用户身份启动时,Sysmon 会记录详细的时间戳、用户 SID 和登录会话 GUID。 - 适用场景: 极端安全溯源场景,当 Windows 原生安全日志(4624)被攻击者清除或篡改时,Sysmon 的日志通常独立存储,能提供关键的补充证据。
21. 查看用户配置文件的加载时间
当用户交互式登录系统时,Windows 会加载或创建其用户配置文件(User Profile)。虽然这不直接等同于“登录时间”,但配置文件的加载时间非常接近用户的登录瞬间。
- 操作方法: 打开注册表编辑器,导航至
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList。 - 找到对应用户的 SID 文件夹,查看
ProfileImagePath确认用户。 - 查看注册表项的 最后写入时间,但这需要使用特殊的第三方注册表工具(如 RegRipper 或 Nirlauncher 中的 RegLastWrite)才能读取。这通常作为数字取证的补充手段。
更深度的安全审计或排查特定管理行为,还可以从以下几个特殊维度来追踪用户的登录与认证时间线:
九、 特殊登录行为与会话状态追踪
22. 追踪“显式凭据”登录(事件 ID 4648)
当用户使用“以管理员身份运行”、runas 命令,或者在连接网络共享时手动输入了不同的用户名和密码时,系统会产生一个显式凭据登录事件。这在安全审计中非常重要,因为可能意味着有人试图提权。
- 操作方法:
- 打开事件查看器 -> Windows 日志 -> 安全。
- 筛选 事件 ID 4648(试图使用显式凭据登录)。
- 在日志详情中,不仅会显示“主体用户”(执行该操作的用户),还会显示“目标服务器”和“目标用户名”(被借用的凭据),以及确切的操作时间。
23. 计算会话时长:查看注销时间(事件 ID 4634)
只知道登录时间是不够的,结合注销时间可以计算出用户在系统上停留的时长。
- 操作方法:
- 在事件查看器的安全日志中,筛选 事件 ID 4634(账户注销)。
- 结合之前的 4624 事件:
- 4624 (Logon Type 2 或 10) + 4634 (Logon Type 2 或 10) = 一次完整的交互式登录到注销的周期。
- *补充技巧*:你也可以查看 系统日志 中的 事件 ID 7001(User Logon Notification for Customer Experience Improvement Program)和 事件 ID 7002(User Logoff),这两个 Winlogon 事件通常更易于阅读,专门记录交互式用户的登录和注销瞬间。
24. 账户锁定与解锁历史(事件 ID 4740 / 4767)
当用户忘记密码连续输错,或者遭到暴力破解时,账户会被锁定。查看这些时间点有助于还原用户的登录困境或发现攻击行为。
- 操作方法:
- 在安全日志中筛选 事件 ID 4740(用户账户被锁定)。
- 筛选 事件 ID 4767(用户账户被解锁)。
- 这两个事件会显示锁定的确切时间、调用者(是谁或什么程序触发的解锁)。
25. 追踪 Kerberos 认证时间(事件 ID 4768)
在域环境中,当用户输入密码登录时,第一步实际上是向域控制器(DC)请求一个 Kerberos 票据授予票据(TGT)。这个事件通常比客户端生成 4624 事件还要早一瞬。
- 操作方法:
- 在域控制器的事件查看器 -> 安全日志中,筛选 事件 ID 4768(已请求 Kerberos 身份验证票据)。
- 这个日志记录了用户在域层面进行认证的确切时间,以及发起请求的客户端 IP 地址。对于排查“用户到底是从哪台机器登录的”非常有帮助。
十、 远程管理与后台服务登录
26. WinRM / 远程 PowerShell 登录日志
管理员经常使用 Enter-PSSession 或 Windows Remote Management (WinRM) 来远程管理服务器。这种登录属于网络登录(Logon Type 3),但在专用的 WinRM 日志中有详细记录。
- 操作方法:
- 打开事件查看器。
- 导航至 应用程序和服务日志 -> Microsoft -> Windows -> WinRM -> Operational。
- 查找连接建立相关的事件(如事件 ID 169 表示用户成功连接到远程 Shell)。
- 同时,在安全日志中,这种登录通常会表现为 事件 ID 4624 (Logon Type 3),且身份验证数据包为“Kerberos”或“Negotiate”。
27. 追踪计划任务与服务账户登录
系统和应用程序经常使用特定服务账户(如 NETWORK SERVICE、LOCAL SERVICE 或自定义服务账户)在后台进行“登录”。虽然这不是人类用户的交互式登录,但在排查服务异常启动时间时有用。
- 操作方法:
- 打开事件查看器 -> Windows 日志 -> 系统。
- 筛选 事件 ID 7036(服务进入正在运行状态)或 7040(服务启动类型更改)。
- 查看是哪个服务在特定时间点启动。如果是使用特定域账户运行的计划任务,还可以在 任务计划程序 的“历史记录”中看到该任务以该账户身份触发的确切时间。
十一、 边缘与云端服务联动
28. 查看组策略首选项/登录脚本执行时间
如果企业配置了用户登录时自动运行的脚本(如映射网络驱动器的 .bat 或 .ps1 脚本),脚本执行的时间戳可以作为用户登录时间的有力佐证。
- 操作方法:
- 检查脚本自身是否有日志输出(高级管理员通常会在脚本开头加上
echo %date% %time% %username% >> C:\login_log.txt的代码)。 - 如果没有,可以通过查看用户重定向文件夹(如桌面、文档)的 NTFS 最后修改时间 或 缓存同步时间 来间接判断。
- 检查脚本自身是否有日志输出(高级管理员通常会在脚本开头加上
终极总结:
从 net user 的一行简单输出,到事件查看器中错综复杂的 4624/4648/4768 日志链路,Windows 系统的设计确保了每一次身份验证都在系统深处留下痕迹。在实际的 IT 运维和安全取证中,通常不是单一使用某一种方法,而是根据环境(本地/域/云)、登录方式(交互/网络/RDP/VPN)将多种方法结合使用,交叉比对时间戳,从而还原出最真实的用户活动轨迹。
Windows 查询用户登录时间完整整理(修正原文错误 + 分类优化 + 避坑说明)
一、本地单机快速查询(无需管理员 / 需管理员区分)
1. quser(当前在线会话,普通用户可用)
quser
qwinsta2. net user 用户名(本地账户最后登录,需管理员)
net user Administrator
3. WMIC 查询单用户末次登录(管理员)
wmic useraccount where name="Administrator" get name,lastlogon
4. PowerShell 读取本地所有账户 LastLogon(管理员)
Get-LocalUser | Select Name, LastLogon
5. 任务管理器 - 用户面板(仅在线会话)
Ctrl+Shift+Esc → 用户,仅展示当前登录会话,无历史记录。6. 系统启动时间(间接参考)
systeminfo | find "System Boot Time"
(Get-CimInstance Win32_OperatingSystem).LastBootUpTime
二、事件日志(最完整登录历史,核心方案,必须开启安全审核)
前置条件(否则无 4624 日志)
secpol.msc
关键事件 ID 修正(原文多处 ID 写错)
| 事件 ID | 含义 |
|---|---|
| 4624 | 账户成功登录(本地 / 远程 / RDP/SMB) |
| 4625 | 登录失败(暴力破解溯源) |
| 4634 | 账户注销 |
| 4647 | 用户主动注销 |
| 21/22 | RDP 会话连接 / 断开(TerminalServices 日志) |
| 3005/3010 | SMB 共享访问登录日志 |
方式 1:图形界面 事件查看器
- Win+R →
eventvwr.msc - Windows 日志 → 安全 → 筛选当前日志 → 事件 ID 填 4624
- 双击日志,详细信息可查看:账户名、登录 IP、登录类型(2 本地交互式 / 10 RDP 远程)
方式 2:PowerShell 批量导出登录历史(推荐)
1)指定时间段成功登录
$start = (Get-Date).AddDays(-7) # 近7天日志
Get-WinEvent -FilterHashtable @{LogName='Security';Id=4624;StartTime=$start} |
Select TimeCreated, Id, Message | Sort TimeCreated -Descending
2)只筛选 RDP 远程登录(登录类型 10)
Get-WinEvent -FilterHashtable @{LogName='Security';Id=4624} | Where-Object {
$_.Message -match '登录类型:\s+10'
} | Select TimeCreated
3)RDP 独立日志(单独查远程桌面)
4)SMB 共享访问日志
日志文件本地存储路径
C:\Windows\System32\winevt\Logs\Security.evtx
三、域环境 AD 专用(企业域控,区分 LastLogon / LastLogonDate)
重要概念区分(原文关键漏洞)
LastLogon:仅存储在当前登录的域控,多域控环境数据不同步,不准;LastLogonDate:域复制同步属性,所有域控统一,日常查询用这个。
1. AD 用户图形界面查看
2. PowerShell AD 模块(需安装 RSAT-AD-PowerShell)
查询单个用户
Get-ADUser testuser -Properties LastLogonDate,LastLogon | Select Name,LastLogonDate
批量导出所有域用户末次登录
Get-ADUser -Filter * -Properties LastLogonDate | Select Name,SamAccountName,LastLogonDate | Export-Csv C:\AD_Login.csv -NoType
遍历所有域控取精准 LastLogon(高精度审计)
$u = "testuser"
$dcs = Get-ADDomainController -Filter *
foreach ($dc in $dcs) {
Get-ADUser $u -Server $dc -Properties LastLogon | Select Name,LastLogon,@{n="域控";e={$dc.Name}}
}
3. Azure AD 云端登录日志
Get-AzureADSignInLog -Filter "UserPrincipalName eq 'user@shturl.'"
四、注册表方式(局限性极大,不推荐查登录时间)
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUILastLoggedOnUser:仅记录最后一次开机登录用户名,无时间戳;- 无法查看历史登录、切换用户登录记录,仅作辅助,不能作为审计依据。
五、持久化自动记录登录(主动留存日志)
1. 任务计划程序
$log = "C:\LoginRecord.log"
$info = "$(Get-Date) | $env:USERNAME | $env:COMPUTERNAME"
Add-Content -Path $log -Value $info
2. Sysmon(微软官方高级日志工具)
六、第三方轻量工具(免命令,可视化)
- LastActivityView(NirSoft)
本地一键展示:登录、文件打开、程序运行、开关机全时间线;
- LastLogonView(NirSoft)
批量读取本地 / 域控所有用户末次登录;
- Log Parser Studio:批量解析 evtx 日志文件,支持 SQL 语法筛选日志。
七、数据库登录日志(业务层登录,非系统登录)
SQL Server 当前会话登录
SELECT login_name,login_time,host_name FROM sys.dm_exec_sessions WHERE login_name IS NOT NULL
八、原文错误修正汇总
- AD 登录事件 ID 4720/4722 错误:4720 是创建用户,4722 是启用账户,登录统一 4624;
- Perfmon 性能监视器不能监控登录事件,原文描述错误;
Win32_NetworkLoginProfileWMI 类现代 Windows 已废弃,返回数据异常,不建议使用;- 注册表无登录时间戳,原文误导;
net user无法准确查询域用户登录时间;- 域环境混淆 LastLogon 与 LastLogonDate,未说明多域控同步差异。
九、场景快速选型建议
- 本机看当前谁在线:
quser/ 任务管理器用户 - 本机查历史所有登录记录:事件查看器 4624 日志
- 批量导出本地账户末次登录:
Get-LocalUser - 企业域内查员工登录:
Get-ADUser LastLogonDate - 查远程桌面 RDP 登录记录:TerminalServices 日志 ID21/22
- 可视化一键查看所有活动:LastActivityView
- 长期安全审计:Sysmon + 日志平台、组策略开启登录审核
在 Windows 系统上,有多种方法可以查看上一次登录的时间。以下是几种常见的方法:
1. 使用事件查看器
Windows 系统记录了所有登录事件,可以通过事件查看器来查看最后的登录时间。
步骤:
- 按 Windows 键 + R,打开运行对话框。
- 输入
eventvwr.msc,按 Enter 打开事件查看器。 - 在左侧栏中,依次展开 Windows 日志 > 安全。
- 在右侧,点击 筛选当前日志。
- 在弹出的窗口中,选择 事件 ID 为 4624(这代表成功的登录事件)。
- 点击 确定,然后浏览筛选后的日志,找到最新的登录事件。在事件详情中,你可以看到登录的时间和其他详细信息。
2. 通过命令行(CMD)使用 quser 命令
quser 命令可以显示当前用户会话的详细信息,包括登录时间。
步骤:
- 按 Windows 键 + R,输入
cmd,并按 Enter 打开命令提示符。 - 输入以下命令并按 Enter:
cmdCopy Code
quser - 你将看到一个包含用户会话信息的列表,其中包括登录时间。查找你感兴趣的用户,然后查看其对应的登录时间。
3. 通过命令行(CMD)使用 net user 命令
net user 命令可以显示有关用户账户的信息,包括上次的登录时间。
步骤:
- 打开命令提示符。
- 输入以下命令并按 Enter(将
username替换为你想查看的用户的用户名):cmdCopy Codenet user username - 在返回的信息中,查找“最后登录时间”字段。
4. 使用 PowerShell
PowerShell 提供了更强大的脚本功能,可以查看用户的上次登录时间。
步骤:
- 按 Windows 键 + X,选择 Windows PowerShell(管理员)。
- 输入以下命令并按 Enter:
powershellCopy Code
Get-LocalUser | Select-Object Name, LastLogon - 这将列出所有本地用户及其上次登录时间。
5. 使用 wmic 命令
wmic 命令是一个用于查询系统信息的工具,可以查看用户的登录历史。
步骤:
- 打开命令提示符。
- 输入以下命令并按 Enter:
cmdCopy Code
其中,wmic useraccount where name='username' get lastlogonusername是你要查询的用户名。 - 这会显示指定用户的最后登录时间。
6. 通过注册表查看
Windows 注册表中也保存了与用户登录相关的信息,但这种方法需要小心操作,因为误操作可能会影响系统稳定性。
步骤:
- 按 Windows 键 + R,输入
regedit,并按 Enter 打开注册表编辑器。 - 导航到以下路径:
Copy Code
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI - 在右侧窗格中,查找
LastLoggedOnUser键,它显示了最后登录的用户名。 - 要查看详细的登录时间,你可能需要查看其他相关的日志和历史记录,或结合其他工具和命令来分析。
7. 使用 Windows 活动目录(AD)
如果你是在 Windows Server 环境中工作并使用了活动目录(Active Directory),你可以查看某个用户的上次登录时间。
步骤:
- 打开 Active Directory 用户和计算机。
- 找到并右键点击用户账户,选择 属性。
- 在 属性 窗口中,切换到 帐户 选项卡。
- 在这里,你可以看到 “最后登录时间” 字段,显示的是用户最后一次成功登录的时间。
8. 通过任务管理器查看
如果用户当前已登录,可以通过任务管理器查看他们的登录会话。
步骤:
- 按 Ctrl + Shift + Esc 打开任务管理器。
- 切换到 用户 选项卡。
- 在这里,你可以看到当前已登录的所有用户的会话,以及他们的登录时间。
不同的工具和方法可以提供不同层次的登录信息。从简单的命令行方法到复杂的事件查看器,都能帮助你获取用户上次登录的时间。你可以根据需要选择最合适的方法来获取相关信息。
补充一些更多查看上次登录时间的方法,这些方法也适用于不同的场景和需求:
9. 通过日志文件查看
如果你有权限访问系统的日志文件,Windows 会在系统的事件日志中记录许多关于用户登录的信息。这些日志文件存储在 C:\Windows\System32\winevt\Logs 目录下。你可以通过手动查看日志文件来获取详细的登录信息。
步骤:
- 进入
C:\Windows\System32\winevt\Logs目录。 - 打开 Security.evtx 文件,它包含了与安全相关的事件日志,其中也包含了用户登录和登出的信息。
- 使用 事件查看器 或第三方工具(如 Log Parser Studio)来查看这些日志内容。
10. 使用 Windows Performance Monitor
Windows Performance Monitor 是一种系统监控工具,尽管它的主要用途是性能分析,但它也可以用来监控用户登录事件。
步骤:
- 按 Windows 键 + R,输入
perfmon.msc,按 Enter 打开性能监视器。 - 在左侧栏选择 数据收集器集 > 系统 > 用户登录。
- 你可以设置一个新的数据收集器来记录用户登录事件并生成日志。
11. 使用第三方软件
如果你希望以更简洁、直观的方式查看用户的登录时间,你可以使用一些第三方软件,这些软件通常会提供图形化界面来显示用户活动。以下是一些常见的软件工具:
- LastActivityView:这是一款免费的第三方工具,可以显示 Windows 系统中所有用户的最后活动时间,包括登录、文件访问等。
- NirSoft's Last Logon:这是 NirSoft 提供的一个轻量级工具,可以查看本地计算机上所有用户的上次登录时间。
12. 查看登录历史记录文件(仅适用于 Windows Server)
在 Windows Server 环境中,系统会保存详细的登录历史记录,通常在域控制器上管理。这些登录记录可以通过以下步骤进行查看:
步骤:
- 打开 Active Directory 管理工具。
- 在左侧,选择 域控制器,右键点击并选择 查看事件日志。
- 导航至 安全日志,并查找 事件 ID 4720(用户账户登录) 和 4722(用户账户解锁) 事件。这些事件记录了用户登录的时间和详细信息。
13. 通过 PowerShell 查找多个用户的登录时间
如果你需要批量查看多个用户的登录时间,PowerShell 也是一个非常强大的工具。
步骤:
- 打开 Windows PowerShell(管理员)。
- 输入以下命令并按 Enter,它将列出所有用户的最后登录时间:
powershellCopy Code
Get-WinEvent -LogName Security | Where-Object {$_.Id -eq 4624} | Select-Object TimeCreated, Message | Sort-Object TimeCreated - 这将列出所有成功登录的事件,并显示登录时间。你可以通过其他过滤条件来获取更具体的信息。
14. 查看 RDP 登录时间(远程桌面登录)
如果你想查看用户通过远程桌面登录的时间,可以查看 RDP 相关的日志。Windows 会将远程桌面登录记录到事件日志中。
步骤:
- 打开 事件查看器。
- 导航至 Windows 日志 > 应用程序和服务日志 > Microsoft > Windows > TerminalServices-LocalSessionManager > Operational。
- 在日志中查找事件 ID 为 21 或 22 的记录,这些事件记录了远程桌面会话的建立和断开。
15. 使用域控制器查看域用户的登录历史
在域环境中,管理员可以通过域控制器查看域用户的登录历史。如果是管理公司网络的管理员,可以通过以下步骤查看用户的登录时间:
步骤:
- 在 域控制器 上,打开 Active Directory 用户和计算机。
- 右键点击目标用户账户,选择 属性。
- 在 属性 窗口的 属性编辑器 中,查看 lastLogon 属性,这个字段记录了用户在整个域中的最后一次登录时间。
16. 利用 SQL 查询数据库(高级)
在某些高级场景中,Windows 系统可能会将用户登录数据存储在数据库中(如使用 Microsoft SQL Server)。如果你有权限访问该数据库,可以使用 SQL 查询语句来检索登录历史记录。
步骤:
- 登录到 SQL Server 数据库。
- 使用 SQL 查询,如:
sqlCopy Code
SELECT * FROM UserLoginHistory WHERE UserName = 'username' ORDER BY LoginTime DESC - 这将列出指定用户的所有登录记录,并按时间顺序排列。
对于想要查询上次登录时间的用户,有很多方法可以选择,包括通过事件查看器、命令行工具、PowerShell 脚本、第三方工具等方式。选择适合自己需求的方法,有时也可能需要结合多个工具进行综合查看。管理员在 Windows Server 或企业环境中,通常会有更多高级的查询工具和权限,可以更加详细地追踪用户登录记录。
继续补充一些额外的方法来查看用户的登录时间,涵盖更多场景和需求:
17. 使用 Windows Task Scheduler 设置登录日志
如果你希望在每次用户登录时自动记录登录时间,可以使用 Windows 的任务计划程序(Task Scheduler)来创建一个触发器,在每次用户登录时执行某个脚本。
步骤:
- 打开 任务计划程序(按 Windows 键,搜索“任务计划程序”)。
- 在右侧面板中,点击 创建基本任务。
- 在向导中,选择 触发器 为 用户登录,然后设定所需的动作(例如,运行一个 PowerShell 脚本或记录日志到一个文件中)。
- 可以设置一个脚本来记录当前时间,写入到日志文件或数据库中。
18. 使用 WMI 查询用户登录
Windows Management Instrumentation (WMI) 提供了一种通过查询系统来获取详细信息的方法。你可以通过 WMI 查询来获取用户的登录信息。
步骤:
- 打开 PowerShell 或 命令提示符。
- 输入以下命令来查询最近的用户登录:
powershellCopy Code
该命令会显示所有用户的登录时间。Get-WmiObject -Class Win32_NetworkLoginProfile | Select-Object Name, LastLogon
19. 通过 Group Policy 查看登录时间(仅限域用户)
如果你在管理 Active Directory 中的用户,可以通过组策略(Group Policy)来设置登录审核。这会使得每次用户登录时,都会在安全日志中生成一个事件。
步骤:
- 打开 组策略管理(按 Windows 键,搜索“组策略”)。
- 导航至 计算机配置 > Windows 设置 > 安全设置 > 高级审计策略配置 > 登录/注销。
- 启用 审核账户登录事件。
- 这样,每次用户登录时都会生成一个事件,管理员可以通过事件查看器来查看这些记录。
20. 查看 SMB 登录记录(网络共享访问)
在有网络共享的环境中,Windows 也会记录通过 SMB (Server Message Block) 协议进行的登录和连接。如果用户通过共享文件夹访问资源,登录时间也会被记录下来。
步骤:
- 打开 事件查看器。
- 导航至 应用程序和服务日志 > Microsoft > Windows > SMBServer > Operational。
- 查找 事件 ID 3005 和 3010,这些记录了 SMB 登录和访问的时间。
21. 通过 Active Directory 使用 PowerShell 查询登录历史
在使用 Active Directory 的环境中,管理员可以通过 PowerShell 查询域用户的登录历史,甚至可以从多个域控制器中提取相关的日志信息。
步骤:
-
打开 PowerShell。
-
运行以下命令来获取域用户的上次登录时间:
powershellCopy CodeGet-ADUser -Identity <username> -Properties LastLogonDate该命令会返回指定用户的最后一次登录日期。
-
如果你有多个域控制器,并希望获得最新的登录时间,可以使用如下命令:
powershellCopy CodeGet-ADUser -Filter * -Properties LastLogonDate | Select-Object Name, LastLogonDate
22. 查看 Windows 系统的最后系统启动时间
有时候,虽然我们并不关心每个用户的登录时间,但可以查看系统的最后启动时间,间接了解用户是否活跃。
步骤:
- 打开 命令提示符 或 PowerShell。
- 输入以下命令来查看系统的最后启动时间:
powershellCopy Code
这将显示系统的最后启动时间,可以帮助你判断系统重新启动后的用户活动情况。systeminfo | find "System Boot Time"
23. 使用事件查看器的自定义筛选器查看用户登录
在事件查看器中,你可以创建自定义筛选器来查找特定的登录事件,这样可以更加高效地查看用户登录历史。
步骤:
- 打开 事件查看器。
- 导航至 Windows 日志 > 安全。
- 在右侧点击 筛选当前日志,在 事件 ID 中输入 4624(表示成功登录事件),然后点击 确定。
- 你可以选择只查看特定用户的登录记录,或者查看所有用户的登录记录。
24. 检查 Windows 服务的登录时间
如果用户使用服务账户或特定应用程序进行登录(例如使用某些系统服务时),也可以通过查看相关服务的启动时间来判断。
步骤:
- 打开 任务管理器,选择 服务 选项卡。
- 查看服务的状态和启动时间,尤其是与用户登录相关的服务(如 Windows Defender、Windows Update 等服务)。
25. 通过 Windows 注册表查询用户登录时间
Windows 注册表记录了很多系统信息,包括一些与登录相关的数据。尽管注册表并不直接保存每次登录的详细记录,但可以通过查询某些键值来获取相关信息。
步骤:
- 打开 注册表编辑器(按 Win+R,输入
regedit)。 - 导航到以下路径:
Copy Code
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI - 查找
LastLoggedOnUser键,它记录了上次登录的用户。
查看用户的登录时间,Windows 系统提供了多种方法。你可以根据实际需求选择最适合的工具或方法,从事件查看器到 PowerShell、组策略,甚至使用第三方软件和脚本,都可以帮助你高效地追踪用户活动。管理员在企业环境中,往往需要更多的集成工具和方法,以便实时监控和分析登录历史。
继续补充一些更加深入的方式来查看用户登录时间,涵盖更多细节与工具。
26. 通过 Active Directory 查询用户的最后登录时间(多个域控制器)
在大型企业环境中,用户的登录信息可能分布在多个域控制器中,因此可以通过 PowerShell 脚本查询所有域控制器上的登录时间。
步骤:
- 打开 PowerShell。
- 运行以下脚本,以获取域中每个域控制器上某个用户的最后登录时间:
powershellCopy Code
这个脚本会在多个域控制器中查询用户的登录信息,确保获取最新的登录时间。$User = "username" # 输入目标用户名 $DomainControllers = Get-ADDomainController -Filter * foreach ($DC in $DomainControllers) { Get-ADUser -Identity $User -Server $DC.Name -Properties LastLogonDate | Select Name, LastLogonDate, @{Name="DomainController";Expression={$DC.Name}} }
27. 通过事件查看器监控登录失败的尝试
除了记录用户的成功登录时间,还可以通过事件查看器监控登录失败的情况,尤其是当用户尝试多次输入错误密码时。监控这些失败的登录事件对于安全性非常重要。
步骤:
- 打开 事件查看器。
- 导航至 Windows 日志 > 安全。
- 在 筛选当前日志 中输入 事件 ID 4625,这是表示失败的登录事件。
- 通过分析这些事件,你可以了解用户在登录过程中遇到的问题,以及是否存在潜在的安全威胁。
28. 利用 Azure Active Directory 查看云端登录
如果你是 Azure AD 环境的管理员,Azure 提供了直接查看用户登录历史的功能。你可以通过 Azure 门户或者 PowerShell 来查询用户的登录记录。
步骤:
- 登录到 Azure 门户。
- 导航至 Azure Active Directory > Sign-ins。
- 在这里,你可以看到所有用户的登录历史,包括每次登录的时间、IP 地址、设备类型等详细信息。
通过 PowerShell 查询:
Get-AzureADSignInLogs -Filter "userPrincipalName eq 'username@domain.com'" | Select UserPrincipalName, CreatedDateTime, AppDisplayName
这将列出特定用户的所有登录记录。
29. 通过 PowerShell 获取特定时间范围内的所有登录活动
你可以通过 PowerShell 脚本在指定的时间范围内查询登录活动,帮助你进行详细的分析。
步骤:
- 打开 PowerShell。
- 运行以下脚本来获取特定时间段内的登录记录:
powershellCopy Code
这个脚本会列出指定时间段内的所有成功登录事件。$StartDate = (Get-Date "2025-01-01") $EndDate = (Get-Date "2025-01-26") Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4624; StartTime=$StartDate; EndTime=$EndDate} | Select TimeCreated, Message
30. 查看用户登录的计算机名
你不仅可以查看哪个用户登录了系统,还可以知道用户是在哪台计算机上登录的。这对于多个计算机的管理尤为重要。
步骤:
- 打开 事件查看器。
- 导航到 Windows 日志 > 安全。
- 查找 事件 ID 4624(成功登录)。
- 在事件的详细信息中,查找 工作站名称 或 计算机名 字段,显示的是用户登录的具体计算机。
31. 使用远程桌面会话查看登录时间
在有使用 远程桌面 服务的环境中,你可以查看到通过 RDP(远程桌面协议)进行的登录时间。
步骤:
- 打开 事件查看器。
- 导航至 Windows 日志 > 应用程序。
- 查找 事件 ID 21 和 22,这些记录了 RDP 会话的开始和结束时间。
- 你还可以通过以下 PowerShell 命令列出所有远程桌面会话:
powershellCopy Code
qwinsta
32. 利用系统日志查看已知用户会话
Windows 系统会为每个已登录的用户会话创建一个日志。你可以通过 系统日志 来查看用户登录会话的创建和结束。
步骤:
- 打开 事件查看器。
- 导航至 Windows 日志 > 系统。
- 查找 事件 ID 6005(表示系统启动)和 事件 ID 6006(表示系统关闭)。这些事件可以帮助你了解系统重启时哪些用户正在活跃,哪些会话正在运行。
33. 通过网络连接日志查看远程登录时间
如果你有网络设备(如防火墙、路由器)记录了远程登录的日志,可以从这些设备上查看用户是否通过网络进行过登录(例如,VPN 或其他远程方式)。
步骤:
- 登录到你的 网络设备管理控制台。
- 查看设备的 VPN 连接日志 或 远程登录日志。
- 确认每次连接的时间和使用的用户名。
34. 通过 SQL Server 记录数据库登录时间
如果你的系统中有使用 SQL Server 数据库,SQL Server 会记录所有数据库的连接事件,包括用户的登录时间。
步骤:
- 在 SQL Server 中,使用以下查询来查看登录记录:
sqlCopy Code
SELECT login_name, login_time FROM sys.dm_exec_sessions WHERE login_name IS NOT NULL; - 该查询将列出所有成功的数据库登录活动及其时间。
35. 设置 Windows 系统监控工具记录登录活动
可以使用一些第三方系统监控工具,如 Sysmon(System Monitor)或 Splunk,来详细记录和监控用户的登录活动。这些工具不仅可以记录登录事件,还能监控系统中的其他活动。
步骤:
- 下载并安装 Sysmon。
- 配置 Sysmon 以记录用户登录和其他重要事件。
- 配合 Splunk 等日志分析工具,可以方便地查询和分析登录活动。
Windows 系统提供了丰富的日志和工具,可以帮助管理员和用户跟踪和分析登录历史。根据不同的需求,你可以选择合适的方法,如 PowerShell 脚本、事件查看器、Active Directory 查询、远程桌面日志等。对于大型企业环境,还可以通过集成的监控工具进行全面的用户活动追踪,确保系统的安全性和合规性。
除了使用事件查看器之外,你还可以通过其他方式来查看 Windows 上一次登录的时间,以下是两种常见的方法:
方法一:使用命令提示符(Command Prompt)
打开命令提示符。你可以通过按下键盘上的"Win"键,然后输入"cmd",最后按下"Enter"键来打开它。
在命令提示符中,输入以下命令并按下"Enter"键:
shell
net user <用户名>
将 <用户名> 替换为你要查询的用户账户的名称。
在命令的输出中,找到 "最后一次登录"(Last Logon)的值。该值表示用户账户的上一次成功登录时间。
> 备注:此方法虽然有,不能显示最新信息
方法二:使用 PowerShell
打开 PowerShell。你可以通过按下键盘上的"Win"键,然后输入"PowerShell",最后按下"Enter"键来打开它。
在 PowerShell 中,输入以下命令并按下"Enter"键:
shell
Get-WinEvent -FilterHashtable @{Logname='Security';ID=4624} | Select-Object -First 1
这个命令将会从安全日志中提取登录成功事件(事件ID为4624),并选择最早的一条。
在输出中,找到 "TimeCreated"(创建时间)的值。该值表示用户账户的上一次成功登录时间。
无论使用哪种方法,你都可以查看到 Windows 上一次登录的时间。请注意,这些方法都是在本地计算机上查看登录时间,登录历史可能会因为安全策略或日志审计设置而有所不同。
要查看 Windows 上一次登录的时间,可以按照以下步骤进行操作:
按下 Win + R 键打开“运行”对话框。
输入"eventvwr.msc"并点击“确定”按钮,打开事件查看器。
在事件查看器的左侧导航窗格中选择“Windows 日志”,然后选择“系统”。
在右侧窗格中,您将看到一个事件列表,其中包含系统日志信息。
使用滚动条浏览列表,寻找事件ID为4624的事件。这是成功登录事件的ID。
单击该事件,在详细信息窗格中可以找到登录时间和用户名。
请注意,此方法只能查看本地计算机上的登录时间,且需要有管理员权限才能操作。
> 备注:此方法通过日志,能显示比较新的信息
还可以通过注册表编辑器来查看Windows上一次登录的时间。
以下是使用注册表编辑器的方法:
按下Win + R键打开“运行”对话框。
输入"regedit"并点击“确定”按钮,打开注册表编辑器。
在注册表编辑器中,导航到以下路径:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI
在右侧窗格中,找到"LastLoggedOnUser"和"LastLoggedOnSAMUser"两个键值。它们分别对应上一次登录的用户名和安全帐户管理器(SAM)的用户名。
将鼠标悬停在"LastLoggedOnUser"或"LastLoggedOnSAMUser"键值上,即可看到包含上一次登录时间的信息。

浙公网安备 33010602011771号