開發者詢問如何編寫一個「任務管理器關不掉」的程序。這類需求常見於工控看門狗、數字標牌播放端、考試客戶端等必須持續運行的場景。
| 方案 | 原理 | 優點 | 缺點/風險 |
|---|---|---|---|
| 全局 Hook (SetWindowsHookEx) | 攔截 `WM_CLOSE`、`TerminateProcess` 等消息/調用 | 用戶態實現,無需驅動簽名 | 易被殺毒軟件攔截,Windows 8+ 限制較多,維護成本高 |
| ACL 權限控制 | 修改進程安全描述符,拒絕 `PROCESS_TERMINATE` 訪問 | 原生安全機制,無侵入代碼 | 管理員仍可提權覆蓋,需配合 UAC 虛擬化 |
| 系統服務 | 以 `LocalSystem` 身份運行,配置 `SERVICE_NOT_STOPPABLE` | 最高權限,任務管理器默認不顯示/無法結束 | 安裝需管理員,開發調試複雜,攻擊面大 |
| 雙進程守護 | 兩進程互相監視,一方退出即拉起 | 純用戶態,邏輯簡單 | 仍可被同時結束,體驗差,易被判定為流氓行為 |
首選方案:編寫 Windows Service。使用 C# `BackgroundService` 或 C++ `CreateService`,設置恢復選項(失敗重啟),配合「啟動類型:自動」。對於桌面交互需求,採用「服務 + 前端 UI 進程」架構,服務負責核心邏輯與自啟動,UI 進程通過 IPC 與服務通信,即使 UI 被關閉,服務仍在後台運行。
// C# .NET 6+ Worker Service 範本
public class WatchdogService : BackgroundService {
protected override async Task ExecuteAsync(CancellationToken stoppingToken) {
while (!stoppingToken.IsCancellationRequested) {
// 核心業務邏輯
await Task.Delay(1000, stoppingToken);
}
}
}
// Program.cs
IHost host = Host.CreateDefaultBuilder(args)
.UseWindowsService() // 關鍵:註冊為 Windows 服務
.ConfigureServices(s => s.AddHostedService())
.Build();
host.Run();
任何防關閉技術均不應用於惡意軟件、勒索軟件或繞過用戶授權。企業級應用應通過「設備管理員/MDM 策略」或「指派訪問模式」實現合規的單應用鎖定體驗。