排查突然弹出的CMD窗口

网络相关 882 次阅读

我的电脑有时候什么也没动,但是突然会弹出个cmd框框不知道执行了什么,又里面消失了,怎么排查或者怎么监听下一次这种情况找到罪魁祸首?

查看过程

我先查看系统现有的进程审计设置和近期任务记录,确认有哪些线索,以及怎样记录下一次闪现窗口对应的程序和启动来源。

可以,最有效的办法是记录“进程启动时间、完整命令、父进程”。窗口即使只闪一下,也能留下是谁启动它的证据。

我刚检查了你的电脑,目前:

  • 进程创建审计未开启,命令行记录也未开启。
  • 任务计划程序的运行日志未开启
  • 有一些今天早些时候的进程事件,但目前不能据此确定闪窗来源。

这次只做了检查,没有修改系统设置。

1. 开启记录,等下次闪窗

管理员身份打开 PowerShell,依次执行:

# 开启进程创建审计,使用 GUID 避免系统语言差异
auditpol /set /subcategory:"{0CCE922B-69AE-11D9-BED3-505054503030}" /success:enable

# 在事件中记录完整命令行
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\Audit" /v ProcessCreationIncludeCmdLine_Enabled /t REG_DWORD /d 1 /f

# 开启任务计划程序历史,方便对照是谁定时启动的
wevtutil sl Microsoft-Windows-TaskScheduler/Operational /e:true

Windows 会在安全日志中记录 4688 事件,包含程序路径、父进程及启用后的命令行。这种方式能记录启动后马上退出的程序,无需一直开着 PowerShell。微软说明

注意:命令参数也会写入本机日志,可能包含令牌或密码,分享记录前需要打码。

2. 下次闪窗后,立即提取最近记录

记下大概时间,然后在管理员 PowerShell 中执行:

Get-WinEvent -FilterHashtable @{
    LogName  = 'Security'
    Id       = 4688
    StartTime = (Get-Date).AddMinutes(-10)
} | ForEach-Object {
    $eventXml = [xml]$_.ToXml()
    $fields = @{}
    foreach ($item in $eventXml.Event.EventData.Data) {
        $fields[$item.Name] = $item.InnerText
    }

    [pscustomobject]@{
        时间   = $_.TimeCreated
        程序   = $fields['NewProcessName']
        命令行 = $fields['CommandLine']
        父进程 = $fields['ParentProcessName']
        父PID  = $fields['ProcessId']
        PID    = $fields['NewProcessId']
    }
} | Where-Object {
    $_.程序 -match '\\(cmd|powershell|pwsh|conhost|OpenConsole|WindowsTerminal|wscript|cscript)\.exe$'
} | Format-List

重点看:

  • 命令行:例如 cmd.exe /c "某个目录\update.bat",直接指向运行的脚本。
  • 父进程:说明哪个程序启动了它,例如某个更新器或后台工具。
  • 时间:如果指向计划任务,打开“事件查看器 → 应用程序和服务日志 → Microsoft → Windows → TaskScheduler → Operational”,对照同一时间的任务名称。

黑框也可能是其他控制台程序。如果这段筛选没有结果,应继续查看同一时间的全部 4688 事件,不能因此排除闪窗。

下次出现后,尽快查询,并把对应时间附近的记录发给我,就能沿着启动关系继续定位。目前安全日志容量约 20 MB,记录较多时旧事件可能被覆盖。

终于又出现了,你快执行下看看发生了什么

查看过程

我马上查最近几分钟的进程启动记录和计划任务日志,找出刚才闪窗的程序及其启动来源。

黑框大约在几点几分出现?是在你打开 Codex 之前,还是打开之后?日志里 15:13:56 和 15:14:10 之后有两组不同的启动记录,需要对上时间。

查看过程

找到一条很明确的线索:15:13:56–15:13:57,夸克的桌面网盘组件在后台升级时调用了 tasklist.exereg.exe,两次都启动了控制台宿主。日志已经保存,我再核对它对应的计划任务和程序信息。

我忘记了,反正就1-2分钟,我打开Codex之前

基本定位到了:这次高度吻合夸克网盘桌面组件的后台升级。你确认是在打开 Codex 之前,正好与日志时间对应。

时间 实际发生的操作
15:09:39 夸克计划任务启动自动更新器
15:13:27 开始静默安装夸克 7.2.0.981
15:13:56–57 桌面组件调用 tasklist.exereg.exe,分别启动控制台宿主
15:13:59 更新后重新启动桌面组件
15:14:07 你打开 Codex

最关键的来源是:

D:\soft\Quark\components\clouddrive_desktop_widget\
new_clouddrive_desktop_widget.exe --upgrade

它执行了两条命令:

tasklist /fi "imagename eq clouddrive_desktop_widget.exe" /fo csv /nh
reg query HKCU\Software\Microsoft\Windows\CurrentVersion\Run /v CloudDriveDesktopWidget

分别是在检查桌面组件是否运行、查询它的开机启动项。这两次控制台启动是本次闪窗的最强线索;日志本身不记录窗口是否可见,因此还不能百分之百断定。

相关更新器和当前桌面组件的数字签名均有效,签名方为阿里巴巴。目前证据指向夸克更新过程。

我已保存排查结果和完整时间线,没有禁用或修改任何任务。

就是这个,我要如何把这个夸克自动运行禁用掉

查看过程

我先检查夸克有哪些自动启动入口,区分后台更新和桌面组件的开机启动,再给你对应的禁用方法。

查看过程

当前启用的是夸克 1.0.0.21 的自动更新计划任务,旧版任务已经禁用。我会先备份,再禁用这个触发后台更新的任务;你仍可以手动打开夸克。

已经帮你禁用了触发这次闪窗的夸克自动更新计划任务,并确认状态为 Disabled

  • 该任务不会再按计划启动后台更新。
  • 仍然可以手动打开夸克。
  • 原任务已备份。

以后需要恢复,可在“任务计划程序 → 任务计划程序库 → QuarkUpdaterUser → QuarkUpdater”中启用 1.0.0.21 那项。

这次禁用的是已确认的触发入口;以后重新安装或更新夸克,可能会重新创建任务。

我记得windows电脑可以在哪设置 启动项,禁用,你现在直接改动的是Quark 文件?我想走正常设置流程可以吗?我自己操作

可以,你自己通过 Windows 界面操作就行。我没有修改夸克的程序文件,只是在 Windows“任务计划程序”里把它的自动更新任务设为“禁用”,相当于你在界面中右键点“禁用”。

你记得的“启动项”在这里:

  • Windows 10:右键任务栏 → 任务管理器 → 详细信息 → 启动
  • Windows 11:右键开始菜单 → 任务管理器 → 启动应用
  • 也可以到 设置 → 应用 → 启动

找到夸克相关项目后禁用即可。这主要控制登录时自动启动

这次闪窗来自定时更新任务,对应的正常操作入口是:

  1. Win + R,输入 taskschd.msc,回车。
  2. 左侧展开 任务计划程序库 → QuarkUpdaterUser → QuarkUpdater
  3. 找到名称包含 1.0.0.21 的任务。
  4. 右键 → 禁用

这一项我已经设为禁用,你现在打开可以直接核对;如果想恢复后亲自操作,右键“启用”,再右键“禁用”即可。

为什么我执行你的PowerShell 没有看见夸克相关的,你却能查出来?

因为我之前给你的 PowerShell 筛选范围太窄,只显示几种常见命令行程序,没有直接显示夸克进程。这是那段脚本的局限,我之前应该说明得更清楚。

脚本最后这段筛选:

Where-Object {
    $_.程序 -match '\\(cmd|powershell|pwsh|conhost|OpenConsole|WindowsTerminal|wscript|cscript)\.exe$'
}

会排除夸克程序,也会排除这次真正执行命令的 tasklist.exereg.exe。即使显示了 conhost.exe,它的父进程也只是这两个 Windows 工具,看起来没有夸克。

我这次继续查询了同一时间的全部进程记录,按父进程 PID 逐级追溯,才还原出:

夸克自动更新器
  → 夸克安装程序
    → 夸克桌面组件升级程序
      → tasklist.exe / reg.exe
        → conhost.exe(控制台宿主)

再用计划任务日志确认,是夸克的定时更新触发了这条链。

你和我读的是同一份 Windows 日志,区别在于我扩大了查询范围并追查了上级进程。以后把脚本中的整个 Where-Object { ... } 部分去掉,保留最后的 | Format-List,就能查看全部程序的启动记录。

服务里面压根没看见Quark 相关的

你截图里打开的是任务管理器 → 服务。夸克这次用的是 Windows 计划任务,所以在服务列表里找不到;我之前检查时也没发现夸克相关服务。

请按这个路径查看:

  1. Win + R
  2. 输入 taskschd.msc,回车,打开“任务计划程序”。
  3. 左侧依次展开:
    任务计划程序库
      → QuarkUpdaterUser
        → QuarkUpdater
  4. 中间找到名称包含 1.0.0.21 的任务,它现在应该显示为 “已禁用”,这就是我改的那一项。

“服务”“启动项”“计划任务”是三个不同入口。这次需要看的是计划任务