GTweak 命令执行器 CommandExecutor 完整解析:上百项 Windows 系统优化背后的统一执行层
【免费下载链接】GTweakPortable Tool for an Ideal Windows Setup项目地址: https://gitcode.com/GitHub_Trending/gt/GTweak
GTweak 是一款免安装的 Windows 系统优化与定制工具,它最不起眼却最关键的公共设施,是命令执行器 CommandExecutor——把激活、清理内存、开关服务等上百个功能按钮翻译成一条条安静、有序的系统命令。下文只讲这套执行层内部如何分工、哪两处实现最值得抄,读完你能把同样的"统一执行层"思路用到任何需要调用外部进程的工具里。
从一个真实操作说起
你点击"激活 Windows",屏幕上只出现一层覆盖进度,最后弹出一条成功提示,全程没有黑框闪动。再点"清理内存",连窗口都看不见,临时文件却已经没了。前者背后其实是slmgr.vbs密钥注入、许可服务重启、受保护注册表项修改这一整套命令在顺序执行;后者则是 MemoryCleaner 调用 rd /s /q 与 attrib 清空 Temp 目录和图标缓存。别被"安静"的表象骗了——重点不是窗口藏得好,而是怎么跑的逻辑全部收敛到同一层,功能模块只负责说出"要跑什么"。
内部的分工图
调用关系很简单:功能模块说清楚想做什么,执行层决定怎么跑,辅助组件负责提权与失败兜底。
| 角色 | 职责 | 典型调用方 |
|---|---|---|
| 功能模块 | 拼命令、选权限、处理界面反馈 | WinLicenseHandler.cs 激活、AddonsViewModel.cs 自定义脚本 |
| 执行层 | 隐藏窗口、统一编码、异步等待、捕获输出 | CommandExecutor,被 19 个源文件、87 处调用点引用 |
| 辅助组件 | 最高权限提权通道、失败静默记录 | TrustedInstaller.cs、ErrorLogger.cs |
这是教科书式的门面模式(Facade):把 C# Process 类的全部复杂性关进一个文件,对外只留 6 个入口——查询、静默、等待、可见、提权、编码执行。选型时只需回答两个问题:要不要看输出,要不要提权或可见窗口?
💡 类里还有一个
PID静态字段,专门记录 TrustedInstaller 服务的进程号。不起眼,但它是提权链能闭环的枢纽,下一节细说。
两个关键实现拆解
提权链:让子进程"出生"在 TrustedInstaller 名下
解决什么问题:很多注册表键和系统文件,连普通管理员都动不了。怎么实现:TrustedInstaller.cs 先启用调试与模拟特权,复制 winlogon 令牌模拟 SYSTEM 身份,调用 CreateProcess 时再用 PROC_THREAD_ATTRIBUTE_PARENT_PROCESS 属性把 TrustedInstaller 进程写成父进程。效果:子进程以最高权限出生,用完 RevertToSelf() 立即还原身份。
命令清洗:多行脚本先"压平"再执行
解决什么问题:用户脚本参数常带换行和多余空格,直接拼进命令行会执行失败。怎么实现:CleanCommand 方法按行拆分、逐行去空白、压缩连续空格,再根据原文内容推断用 && 还是 & 拼接回单行。效果:多行命令变成一行安全命令,.reg、.ps1、.bat、.cmd 全部能走同一条执行链。
一条完整链路走一遍
以 Windows 激活为例,全程四步,每条命令都由同一个执行层吞下:
- 用户点激活,入口在 WinLicenseHandler.cs:从注册表读产品名,匹配出 HWID 或 KMS 密钥。
- Win10 上先改两项注册表(VBS 文件关联),走 RunCommandAsTrustedInstaller——该键受保护,必须交给 TrustedInstaller.cs 通道执行。
- 核心注入命令 slmgr.vbs /ipk 走 CommandExecutor.cs 的静默等待入口 InvokeRunCommand:窗口隐藏,进程真正退出后才放行下一步。
- 回到 WinLicenseHandler:sc config && sc start 连环重启许可服务,clipup 上传真票,最后再跑一次 LicenseStatus() 校验并弹出结果。
💡 同一条链路里,slmgr.vbs 用"等待退出",清票缓存却用"发后即忘"——选哪个入口,看后续步骤是否依赖结果,而不是个人习惯。
能直接搬走的 2–3 个做法
- 把"执行方式"做成有限集合:工具要调几十条系统命令时,按"要不要看输出 × 要不要提权"组合出 6 个入口,功能模块里禁止再 new Process,加功能只挑入口。
- 旧 API 的异步化模板:.NET 4.x 没有异步等待时,照抄
WaitForExitAsync的 TaskCompletionSource + Exited 事件组合,完成后自动解绑事件,不留内存泄漏。 - 多行输入先压平:把用户输入拼进命令行前,模仿"按行拆分、去空白、推断分隔符"的清洗流程,避免换行和空格直接导致执行失败。
CommandExecutor 用 185 行代码、6 个对外入口,把查询、静默、提权、可见、等待、编码六种执行方式装进同一个文件,19 个功能模块的 87 处调用说同一种语言。下次做"替用户跑命令"的工具,先别急着写功能——先画出这个统一执行层。
【免费下载链接】GTweakPortable Tool for an Ideal Windows Setup项目地址: https://gitcode.com/GitHub_Trending/gt/GTweak
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考