Argus 提供默认关闭的系统任务管理器替换。界面入口在“设置 → 权限”,只在发布版且特权服务授权给当前账户时允许开启。开启需要管理员授权;关闭优先使用特权服务,服务不可用时使用管理员维护助手。
启动路径
固定修改 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\taskmgr.exe 的 Debugger 值,类型为 REG_SZ,内容是带引号的独立启动器绝对路径及 --task-manager。不修改其他值、键权限或系统可执行文件;发现已有 Debugger(包括空值)、UseFilter 或子项时拒绝启用。此时状态说明写明发现的是哪一项(Debugger 的值、UseFilter、前几个子项的名称及总数),诊断日志只记类别(Debugger 指向 Argus 的启动器、其他程序、为空或为非文本类型,UseFilter,子项数量及其中是否有 PerfOptions),不记值。
IFEO 将调试器前缀加到以 taskmgr.exe 为目标的启动命令上,影响整台电脑的所有入口,包括快捷键与直接运行。Windows 11 在 WOW64 视图间共享该注册表分支。见 IFEO 启动说明和 WOW64 注册表规则。
启动器与独立恢复程序从 Argus 发布程序中提取,安装到仅限管理员和 SYSTEM 写入的 Argus Privileged 目录。通过 IFEO 自检后,将界面程序按版本复制到同一目录。启用失败时清理本次副本,后续维护仅清理已退出且未被恢复记录引用的副本。登录启动项指向已安装的 argus.exe。安装版启动时也会修正旧版写入的副本路径。
启动器只为授权账户尝试启动 Argus;其他账户直接尝试原生任务管理器。启动入口先在调用者会话中以标准权限运行;已开启管理员运行时,入口在创建单实例和主窗口之前转交同账户、同会话的管理员任务。未开启时沿用普通权限:未提升的启动器直接创建界面;提升后的启动器(例如从管理员身份的命令提示符运行 taskmgr)把界面创建为桌面外壳(资源管理器)的子进程(PROC_THREAD_ATTRIBUTE_PARENT_PROCESS),界面继承外壳的标准令牌;找不到外壳或外壳不属于同一账户时回到原生路径。账户没有拆分令牌(关闭 UAC、内置 Administrator 账户)时只有一种令牌,界面与平时一样以它运行。界面的环境变量按当前账户重新生成,不沿用创建者的环境。
提升令牌的关联令牌(TokenLinkedToken)受 SeTcbPrivilege 限制:缺少该权限时取得的是识别级令牌,Windows 拒绝据此创建主令牌(ERROR_BAD_IMPERSONATION_LEVEL,在普通权限下对受限令牌的关联令牌实测);没有拆分令牌的账户则没有关联令牌可取。
界面自检按 PID、创建时间、账户与会话验证发起进程,再以该进程为父进程创建自检实例并继承令牌。即使 UAC 使用另一账户的凭据,交互界面也在原账户运行。维护助手按需启用 SeDebugPrivilege 打开发起进程,查询令牌以核对账户。
界面唤起有独立的就绪握手,进程创建成功不算完成。界面绘制出首批数据后或收到唤起事件时确认,启动器等待 10 秒,再给显示确认 2 秒。握手使用随机名称、账户 ACL、父进程创建时间及固定启动器路径;父进程退出后,迟到的请求不显示窗口。单实例仍显示已有窗口,不切换为隐藏;超时也不结束已有 Argus。专为此次请求创建、始终未显示的界面实例在 15 秒后退出。
单实例交接支持标准权限进程连接已运行的管理员实例:互斥锁仅申请 SYNCHRONIZE,专用消息窗口仅允许 WM_COPYDATA 穿过 UIPI;参数长度、格式和握手身份仍需校验。交接进程以 0 退出后继续等待原窗口确认,非零退出立即报告退出码;交接失败的握手进程记录原因并退出,不另弹出阻塞自检的对话框。
开启与恢复记录
- 锁定专用安装目录,检查授权账户和现有 IFEO 配置。
- 删除不再使用的界面副本,准备启动器和恢复程序。
- 在管理员维护助手中创建随机名称的无窗口启动器副本,分别检查普通启动,以及带调试标志创建、脱离并恢复运行后的正常退出。自检不创建或写入临时 IFEO 条目;对随机程序的重定向许可不能代表对 taskmgr.exe 的修改许可。清理完成后复制界面副本和
taskmgr-recovery.txt应急说明,再以发起者标准权限完成界面就绪检查。任何启动或清理失败均不写入 taskmgr.exe 的 Debugger。自检失败与清理失败分别报告,保留原始错误。 - 将
taskmgr-recovery.json的 Prepared 记录写入受保护的新文件、同步并替换;记录原值的存在性、类型与原始字节、本次写入值、账户和界面副本名。第一版拒绝接管已有 Debugger,因此有效原值为不存在。 - 再读一次当前状态,写入 Debugger、刷新注册表并读回核验,最后将记录改为 Active。
恢复先检查当前值仍与本次写入值完全一致,再记录 Restoring、恢复原值、刷新并核验,最后记录 Restored。实际状态已经是原状态时,恢复是幂等的;第三方修改或不可信备份会中止自动恢复并保留文件。只删除 Debugger 值,不删除整个 taskmgr.exe 键;新建后留下空键不影响 Windows 启动行为。
注册表值与记录文件分阶段写入,通过 Prepared / Restoring 记录衔接恢复流程;任意阶段断电后,下次服务启动或恢复操作可继续还原。恢复记录损坏时须人工核对。安装锁串行化 Argus 自己的操作;为检测第三方管理员工具同时修改注册表的情况,每次写入前后都会重新核验,发现冲突便停止。
启动自检先将测试程序名写入独立记录 taskmgr-probe.txt;恢复、下次自检或服务启动时会清理中断留下的临时文件。旧版本可能还留有对应的 IFEO 条目:仅在名称与记录一致、Debugger 仍是旧版自检值且没有过滤配置时清理;被其他程序改动的条目保留并报错。新自检只创建文件,旧条目不存在时不发起注册表删除操作。taskmgr.exe 的替换值不因自检而临时增删。
注册表访问按操作申请权限:读取状态只需查询值与枚举子项,写入只需设置值与刷新键所需的查询权限,不申请通知等无关权限。自检条目或 taskmgr.exe 条目的调用以 ERROR_ACCESS_DENIED 被拒时,维护助手用 AccessCheck 只读地核对当前令牌及该调用实际所需的权限;仅创建尚不存在的条目时,检查 IFEO 父键的创建子项权限。DACL 检查通过不能说明拒绝一定来自防护软件:句柄权限、令牌限制、完整性级别、系统策略及注册表过滤都可能影响调用,需结合具体失败的 API、错误码及相关记录判断;检查未通过只说明 DACL 未授予所检查的访问权限,不推断权限曾被谁修改。Argus 不修改注册表权限或绕过访问限制。
原生回退与应急恢复
原生路径使用系统目录的固定 taskmgr.exe,不执行 IFEO 附带的任意路径或把附带参数转发给 Argus。先以 DEBUG_ONLY_THIS_PROCESS | CREATE_SUSPENDED 创建,再设置退出时不结束被调试进程、脱离调试并恢复线程,避免再次进入 IFEO。脱离失败会清理本次新建的进程并报错,不结束其他进程。API 行为见 DebugActiveProcessStop 和 DebugSetProcessKillOnExit。
此路径独立于服务和 Argus 界面。原生启动受系统策略、令牌限制或文件损坏影响而失败时,启动器会提示错误;启动器自身损坏或被删除时,需按应急说明恢复。
独立恢复程序为受保护目录中的 argus-taskmgr-recover.exe,直接运行会请求管理员权限,不要求 Argus 界面或服务可用。如果它也损坏,可从 Win+R 打开管理员注册表编辑器,核对 Debugger 确实指向此安装的启动器,且可信恢复记录的原值不存在,再只删除该 Debugger 值。已有第三方值不得删除;备份缺失时先人工确认归属。
更新和卸载
卸载特权服务前须先恢复任务管理器。更新服务时,若恢复记录为 Active、Debugger 与 Argus 写入值一致且未设置过滤,则先更新界面副本,再更新服务,保留已启用的替换和 IFEO 配置。其他未完成的状态先执行恢复。第三方冲突、记录损坏或写入失败时中止维护。记录已为 Restored 表示本次替换已还原,此后出现的第三方 Debugger、UseFilter 和子项由对应工具管理。
安装程序更新 Argus 时,先由新安装的 argus.exe --argus-close-copies 结束正在运行的任务管理器替换界面副本,再以同样的方式更新服务(安装后钩子,见特权服务)。即使服务已卸载,也会关闭这些副本,避免升级后的启动被转交给旧版本。让替换跟上新版本的步骤:先把发起更新的 argus.exe(安装程序更新时为新安装的程序)复制为新名称的界面副本,再原地替换启动器和恢复程序,然后把恢复记录改为指向新副本,最后更新应急说明并删除旧副本。IFEO 的值只指向启动器,保持不变,因此不改动系统入口,也不重新自检。界面副本正在运行时既不能替换也不能删除,所以新版本使用新名称,旧副本退出后在下次清理时删除;启动器正在运行时替换失败,本次的新副本随之删除,记录和原来的副本保持不变,服务也不更新,提示稍后重试或先恢复再更新。这一步不重新做界面就绪检查;新版界面未能就绪时,启动器照常改为打开 Windows 任务管理器,并把原因写入 taskmgr.log。替换已关闭、尚未完成或已被其他程序改写时这一步不做改动,按上一段处理。
直接更换免安装程序,或安装时服务更新失败,Ctrl+Shift+Esc 会继续打开已有副本。设置按主、次、修订版本比较副本并提示“更新服务”。手动更新后,请从托盘退出仍在运行的旧实例,让下次启动使用新副本。
installer-hooks.nsh 在卸载前调用 argus.exe --argus-close-copies 释放界面副本,再询问是否一并卸载特权服务。随后优先调用独立恢复程序,缺失时使用 Argus 的早期维护模式。取消授权或恢复失败时停止卸载。钩子识别升级期间的就地卸载,保留服务目录中的替换文件。清理仅处理已退出的界面副本,保留恢复程序和备份。
代码与验证
crates/argus-service/src/taskmgr/ 包含状态机、注册表适配、自检、启动与令牌处理及界面握手。发布构建先编译两个 argus-taskmgr-* 辅助程序,再嵌入 Argus。替换入口仅在发布构建开放。
服务协议第 4 版只新增无参数的 RestoreTaskManager,没有通用写注册表、任意命令或路径接口。开启仍走明确授权的管理员维护助手。恢复失败时允许独立助手重新核验后重试,这个恢复动作按记录幂等。
普通测试使用内存注册表和自己创建的子进程,覆盖备份失败、提交失败回退、中断阶段恢复、重复恢复、第三方冲突、过滤键拒绝、恢复失败保留记录、恢复后出现的第三方值不阻止服务维护、更新服务时哪些状态让替换跟上新版本、保持开启,更新替换文件的顺序与失败回退、命令行转义、真实调试创建后的脱离和运行结束,以及指定父进程时的令牌继承(中完整性创建者指定低完整性父进程时,子进程继承父进程的低完整性)。启动自检覆盖普通启动与调试启动失败、无注册表写权限时仍能检查启动器、临时文件清理、旧版 IFEO 条目清理和第三方配置保留;发布启动器另在普通权限下验证两种启动方式。注册表项权限的判断在 HKCU 下的临时键上验证,测完删除。它们不写入真实 IFEO,也不运行系统任务管理器。
维护助手出错时,把出错的步骤、提示文字、错误分类和注册表调用信息写入服务目录中的 taskmgr-error.json。发起操作的界面读回后在设置页显示提示文字;诊断日志只记固定的步骤名、错误分类、API 名、访问掩码、Windows 错误码及 DACL 检查结果,不记提示文字或路径。自检与清理同时失败时,分别保留两次失败的调用和权限检查结果,避免清理错误覆盖原始错误。助手每次运行前清掉上一次的记录(包括 0.1.0 的 taskmgr-error.txt),写不进去时才弹出消息框。启动器没有窗口:没能打开 Argus、改为打开 Windows 任务管理器时,或者开启时的界面自检失败时,它把原因追加到当前账户日志文件夹中的 taskmgr.log(超过 256 KB 时重新开始)。
taskmgr.log 同时记录早期单实例交接的失败 API、HRESULT、双方完整性级别及耗时,以及界面握手的具体阶段、启动器权限、子进程是否仍运行和退出码。接收方验证父进程、启动器映像或事件失败时记录对应检查;不记录进程路径、账户名或启动参数。