You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 01:50:25