如何用C#实现仅通过AppA.exe启动AppB.exe的安全机制
实现方案
要实现仅允许AppA.exe启动AppB.exe的需求,我们可以通过父进程校验+自定义秘密参数的双重验证方案,既保证易用性又提升安全性。以下是具体实现代码:
方法1:双重校验(推荐)
结合父进程验证与唯一参数验证,避免单一验证被绕过。
AppA.exe(启动器)代码
using System.Diagnostics; namespace AppA { class Program { static void Main(string[] args) { // 替换为你的AppB实际路径 string appBPath = @"C:\Your\Path\To\AppB.exe"; // 传递自定义的唯一验证参数 Process.Start(appBPath, "--auth-token=AppA_Launch_Secret_123"); } } }
AppB.exe(受保护程序)代码
using System; using System.Diagnostics; namespace AppB { class Program { static void Main(string[] args) { // 1. 检查是否携带合法验证参数 bool hasValidToken = false; foreach (var arg in args) { if (arg == "--auth-token=AppA_Launch_Secret_123") { hasValidToken = true; break; } } // 2. 检查父进程是否为AppA.exe bool isParentAppA = false; using (var currentProc = Process.GetCurrentProcess()) { try { using (var parentProc = currentProc.GetParentProcess()) { if (parentProc != null && parentProc.ProcessName.Equals("AppA", StringComparison.OrdinalIgnoreCase)) { isParentAppA = true; } } } catch { // 获取父进程失败,直接判定为非法启动 } } // 双重校验通过才执行正常逻辑 if (hasValidToken && isParentAppA) { // 这里写入AppB的正常业务代码 Console.WriteLine("AppB已正常启动"); } else { // 非法启动提示,WinForm/WPF可替换为MessageBox.Show Console.WriteLine("请通过AppA.exe打开"); Environment.Exit(1); } } } // 扩展方法:获取当前进程的父进程 public static class ProcessExtensions { public static Process GetParentProcess(this Process process) { using (var query = new System.Management.ManagementObjectSearcher( $"SELECT ParentProcessId FROM Win32_Process WHERE ProcessId = {process.Id}")) { foreach (var obj in query.Get()) { int parentId = Convert.ToInt32(obj["ParentProcessId"]); return Process.GetProcessById(parentId); } } return null; } } }
方法2:简易参数验证(快速实现)
如果不需要父进程校验,仅通过唯一参数验证也能满足基础需求:
AppA.exe代码
using System.Diagnostics; namespace AppA { class Program { static void Main(string[] args) { string appBPath = @"C:\Your\Path\To\AppB.exe"; Process.Start(appBPath, "APP_A_VALID_LAUNCH"); } } }
AppB.exe代码
using System; namespace AppB { class Program { static void Main(string[] args) { if (args.Length == 0 || args[0] != "APP_A_VALID_LAUNCH") { Console.WriteLine("请通过AppA.exe打开"); Environment.Exit(1); } // AppB正常业务逻辑 Console.WriteLine("AppB已正常启动"); } } }
注意事项
- 验证参数/密钥要设置得足够独特,避免被轻易猜测
- WinForm/WPF程序可将控制台提示替换为
MessageBox.Show - 使用父进程验证时,需要在项目中添加
System.Management程序集引用 - 该方案属于轻量级防护,若需更高安全性,可结合进程间通信(如命名管道)或数字签名验证
内容的提问来源于stack exchange,提问作者Goutham Jr
相关产品推荐
相关产品推荐

