Windows 无窗口进程启动与黑框排障
Overview
Windows 上"程序弹黑色 CMD 窗口、一闪而过"(尤其是不定时、重启后、登录后)是高频烦人问题。本 skill 沉淀:
1. 根因模型:CREATE_NO_WINDOW(0x08000000) 只对"不主动创建 console 的程序"有效;Go/原生程序(如 cpolar)会自建 conhost 控制台宿主,隧道活动/重连时窗口闪现。
2. 正确启动法:NO_WINDOW | DETACHED_PROCESS(0x00000008) 彻底脱离控制台。
3. cpolar 特殊陷阱:-log <文件> 需创建 symlink(非管理员失败退出);必须 -log stdout + stdout 重定向到日志文件 + DETACHED_PROCESS。
4. 排查方法:查进程树里 conhost.exe 子进程 = 有控制台宿主;查计划任务里 console 类程序。
When To Use
- 用户说"不定时弹黑框" / "闪一个黑框" / "开机弹窗一闪"
- 用户要写看门狗/常驻脚本拉起 cpolar、update.exe 等 console 程序
- 用户部署了 cpolar / frp 等内网穿透工具,出现窗口闪现
- 排查计划任务里每 N 小时/登录时触发的 console 程序
Three hard rules
- 拉起原生/Go 程序:
NO_WINDOW不够,必须叠DETACHED_PROCESS(见scripts/headless_start.py)。 - cpolar 绝不
-log <文件>:文件日志模式创建 symlink,非管理员直接退出;用-log stdout+ 把 stdout/stderr 重定向到日志文件(见scripts/cpolar_headless.py)。 - 排查黑框先查 conhost:
cpolar.exe带conhost.exe子进程 = 它关联了控制台 = 会闪窗;无 conhost = 干净。
Workflow
- 定位:
Get-CimInstance Win32_Process查可疑程序(cpolar/update/updater)是否带 conhost 子进程。 - 计划任务扫描:
schtasks /query /fo LIST /v找 console 类周期任务(360ZipUpdaterLoop 每3小时、登录触发的 cmd.exe)。 - 修复启动:按
scripts/headless_start.py改creationflags=NO_WINDOW | DETACHED_PROCESS。 - cpolar 特殊处理:按
scripts/cpolar_headless.py(-log stdout+ 重定向)。 - 改后重启常驻进程(如 watchdog.py),验证无 conhost。
- 管理员锁定的任务(删除拒绝访问):
schtasks /delete /tn <task> /f需管理员运行。
Resources
scripts/headless_start.py— 无窗口启动模板(NO_WINDOW|DETACHED_PROCESS),可运行scripts/cpolar_headless.py— cpolar 无窗口启动(-log stdout + 重定向),可运行references/postmortem.md— 黑框排障全过程 + 检查清单