☰
GTweak 系统优化命令引擎 CommandExecutor 详解
2026/10/23 2:06:09 网站建设 项目流程

GTweak 系统优化命令引擎 CommandExecutor 详解

【免费下载链接】GTweakPortable Tool for an Ideal Windows Setup项目地址: https://gitcode.com/GitHub_Trending/gt/GTweak

GTweak 是一款免安装的 Windows 优化工具,把激活、清理、隐私、服务停启等上百项调整做成了界面按钮。这些按钮背后是slmgr.vbs、sc config、reg add等系统命令,如果每个功能各自处理进程启动、等待退出、权限提升和异常,代码会迅速失控。CommandExecutor.cs 用约 185 行把这些细节全部收进一个internal static类:调用方只声明"执行什么",执行器决定"怎么执行"。

一个类如何替上百个按钮管住进程

打开任何一个功能模块——MemoryCleaner.cs 清缓存、ServicesTweaks.cs 停启服务、SystemRestoreService.cs 建还原点——会发现进程相关代码几乎为零。CommandExecutor扮演的是进程层门面:Process的所有琐碎参数——WindowStyle、Verb = "runas"、RedirectStandardOutput、编码、工作目录——都封在类内部,对外只留 6 个入口加 2 个工具方法。

人话版:以前每个按钮都要自己造一遍"点火"流程,现在点火台只有一个,按钮只管递命令。

CommandExecutor 六个执行入口的职责划分

选哪个方法,看三个维度:要不要拿回输出、要不要等进程结束、以什么身份跑。

查询类:GetCommandOutput(command, isPowerShell)静默执行并捕获 stdout/stderr,UTF-8 编码,工作目录定在System32,PowerShell 侧默认挂上-NoLogo -NonInteractive -NoProfile -ExecutionPolicy Bypass;退出码非 0 就返回空串,调用方拿空串当失败信号。HardwareProvider.cs 读硬件信息、激活前查状态,走的都是它。

静默类:RunCommand(command)启动即返回,不等待,靠Verb = "runas"触发 UAC。适合"发出去就完事"的命令;调用方若依赖其结果,只能自己补延迟。

同步类:InvokeRunCommand(command)与前者参数一致,但await到进程退出才继续,用于"下一步依赖上一步"的编排。

高权限类:RunCommandAsTrustedInstaller(command)把命令交给 TrustedInstaller.cs。它先启TrustedInstaller服务并记录其进程号到类里的volatile int PID字段,再经SeDebugPrivilege+ winlogon 令牌复制完成 SYSTEM 伪装,最后借PROC_THREAD_ATTRIBUTE_PARENT_PROCESS把新进程的父级挂到 TrustedInstaller 名下——普通管理员也动不了的受保护注册表项,就靠这条通道写入。

可见类:InvokeRunVisibleProcess(fileName, arguments, isElevationRequired)以正常窗口跑外部程序,供用户脚本使用;第三个参数为 true 时改走 TrustedInstaller 通道。

编码类:RunEncodedPowerShell(command)把命令做 Base64 后交给-EncodedCommand,引号和特殊字符不再需要层层转义。

如何从按钮走到 slmgr.vbs:激活链路完整走读

激活模块 WinLicenseHandler.cs 是最能说明分层价值的样本,StartActivation一条链里四种入口各就各位:

  1. 查状态:LicenseStatus先用 WMI 查SoftwareLicensingProduct,失败则回退到GetCommandOutput跑slmgr.vbs /ato,用 PowerShell 退出码换算bool;
  2. Win10 上先两次RunCommandAsTrustedInstaller改.vbs的注册表文件关联,绕开系统对脚本的拦截,Task.Delay(1000)给写入留时间;
  3. await InvokeRunCommand("/c slmgr.vbs //b /ipk {keyWinHWID}")导入密钥并等它执行完;
  4. 删旧票据 XML、临时把系统地区写成US、再await InvokeRunCommand批量重启ClipSVC、sppsvc等六个服务;
  5. 写入伪造的GenuineTicket.xml,clipup -v -o收尾验证。

整条链的同步关系全靠await串起来。RunCommand因为不等结果,绝不能出现在这种"步骤 B 依赖步骤 A"的位置——这就是"等不等退出"这个维度在实际编排里的分量。

两个容易翻车的机制:异步等待与命令清洗

WaitForExitAsync:不等不卡 UI 的异步配方

.NET 4.x 的Process没有原生异步等待,硬调WaitForExit()会卡死 WPF 线程。CommandExecutor里的WaitForExitAsync扩展方法约 20 行:进程未退出时挂TaskCompletionSource和Exited事件,一退出就TrySetResult;ContinueWith在任务完成后自动解绑事件,避免处理器泄漏;进程已退出的分支直接返回Task.CompletedTask。GetCommandOutput和InvokeRunCommand都靠它await,这也是激活流程敢在 UI 线程上编排的前提。

CleanCommand 与用户自定义脚本入口

用户粘贴的脚本参数常带换行和缩进,直接拼进命令行会解析失败。CleanCommand(rawCommand)的处理顺序:按\r\n拆行、Trim并丢掉空行、正则压缩连续空白,再按原文是否出现过&&或&选对应分隔符合并回单行——原命令是顺序依赖就用&&,互不相干就用&,语义保持不变。

用户脚本的执行入口在 AddonsViewModel.cs 的RunFile:.reg交给reg.exe import,.ps1交给 PowerShell 加-ExecutionPolicy Bypass,其余(.bat、.cmd)走cmd /k保持窗口可见、让用户亲眼看输出;参数先过CleanCommand,再进InvokeRunVisibleProcess;脚本标记RequiresElevation时改走 TrustedInstaller 通道。

从 GTweak 抽象出的三条可复用经验

先定执行契约,再写功能。把 可见/静默、同步/异步、普通/UAC/TrustedInstaller 排列成有限个方法签名,调用方按语义选入口,而不是到处new ProcessStartInfo拼参数。GTweak 上百个功能零散落的进程代码,就是这套契约的回报。

TCS + 事件回调是旧 API 异步化的通用配方。WaitForExitAsync这段可以直接搬进任何需要等待Process退出的项目,记得保留ContinueWith里的解绑。

失败降级为日志,不升级为异常。每个执行入口都用try/catch包住并交给 ErrorLogger 的LogDebug,UAC 被拒、进程起不来这类失败只留日志,界面继续可用。代价是部分失败要翻日志才能发现——批量清理场景下,这通常正是想要的行为。

【免费下载链接】GTweakPortable Tool for an Ideal Windows Setup项目地址: https://gitcode.com/GitHub_Trending/gt/GTweak

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询