如何从Windows事件日志中确定崩溃应用的运行用户?
如何从Windows事件日志中确定崩溃应用的运行用户?
嘿,这个问题我之前帮人排查过不少,咱们一步步来解决:
先检查现有事件日志的隐藏用户信息
你当前看到的事件日志常规视图可能没直接展示用户信息,但其实大概率已经记录在里面了:
- 右键点击这条崩溃事件,选择「属性」,切换到「详细信息」标签页,再选择「XML视图」。在这里你可以找找类似
<Data Name="User">或者<Security UserID="...">的字段——其中UserID是用户的SID(安全标识符)。想要转换成实际用户名的话,你可以打开命令提示符执行whoami /user对比,或者用PowerShell命令ConvertFrom-Sid "你的SID"直接转换。 - 另外,部分Windows版本里,事件属性的「常规」标签页底部会直接显示「用户」字段,不妨仔细看看有没有遗漏。
若日志无用户信息,通过注册表开启详细日志
如果现有日志确实没包含用户上下文信息,可以通过修改注册表来启用相关日志:
- 打开注册表编辑器(按下Win+R,输入
regedit.exe回车)。 - 导航到路径:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting - 右键点击右侧空白处,新建一个「DWORD(32位)值」,命名为
EnableUserContextLogging,将它的数值数据设置为1。 - 重启Windows Error Reporting服务(命令行执行
net stop werSvc && net start werSvc)或者直接重启系统,之后再发生崩溃时,事件日志就会记录运行应用的用户信息了。
高效批量查询的小技巧
如果有大量崩溃日志要排查,用PowerShell命令批量提取用户信息会更高效:
Get-WinEvent -LogName Application -FilterXPath '*[System[EventID=1000]]' | Select-Object TimeCreated, Id, @{Name='UserName'; Expression={ (New-Object System.Security.Principal.SecurityIdentifier($_.UserId)).Translate([System.Security.Principal.NTAccount]).Value }}, Message
这个命令会列出所有Event ID 1000的应用崩溃事件,同时自动把SID转换成可读的用户名,一目了然。
备注:内容来源于stack exchange,提问作者Nacht




