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

在C#中如何检测是否存在其他.msi与.exe安装进程

在C#中检测并处理前置安装进程(MSI/EXE)

核心思路

启动MSI安装前,先扫描系统中是否存在正在运行的安装相关进程(如msiexec.exe、常见的setup.exe等),根据需求选择等待进程结束或强制终止后再执行自身安装。

1. 检测安装相关进程

通过System.Diagnostics.Process类枚举系统进程,筛选出目标进程:

using System.Diagnostics;

public static List<Process> GetRunningInstallProcesses()
{
    // 定义需要检测的安装进程名(可根据实际需求扩展)
    var targetProcessNames = new List<string> { "msiexec", "setup" };
    var installProcesses = new List<Process>();

    foreach (var process in Process.GetProcesses())
    {
        try
        {
            // 忽略进程名大小写,匹配目标进程
            if (targetProcessNames.Contains(process.ProcessName.ToLower()))
            {
                installProcesses.Add(process);
            }
        }
        catch (Exception ex)
        {
            // 跳过无权限访问的进程(如系统核心进程)
            Debug.WriteLine($"无法访问进程: {ex.Message}");
        }
    }

    return installProcesses;
}

2. 等待安装进程完成

如果选择等待而非终止,可通过WaitForExit方法阻塞当前线程,直到目标进程结束:

public static void WaitForInstallProcessesToFinish(List<Process> processes)
{
    foreach (var process in processes)
    {
        try
        {
            Console.WriteLine($"等待进程 {process.ProcessName} (PID: {process.Id}) 完成...");
            process.WaitForExit();
            Console.WriteLine($"进程 {process.ProcessName} 已结束");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"等待进程失败: {ex.Message}");
        }
    }
}

3. 强制终止安装进程

若需要主动终止进程,需注意必须以管理员权限运行程序,否则可能无法终止系统级进程:

public static void KillInstallProcesses(List<Process> processes)
{
    foreach (var process in processes)
    {
        try
        {
            Console.WriteLine($"正在终止进程 {process.ProcessName} (PID: {process.Id})...");
            process.Kill();
            process.WaitForExit(5000); // 等待5秒确认终止
            if (!process.HasExited)
            {
                Console.WriteLine($"进程 {process.ProcessName} 无法正常终止");
            }
            else
            {
                Console.WriteLine($"进程 {process.ProcessName} 已终止");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"终止进程失败: {ex.Message}");
        }
    }
}

4. 整合到安装流程

将上述逻辑整合,在启动MSI安装前完成检测与处理:

public static void InstallMsi(string msiPath)
{
    // 检测运行中的安装进程
    var runningInstallProcesses = GetRunningInstallProcesses();

    if (runningInstallProcesses.Any())
    {
        Console.WriteLine($"检测到 {runningInstallProcesses.Count} 个正在运行的安装进程");
        
        // 这里可根据需求选择等待或终止,示例中选择等待
        WaitForInstallProcessesToFinish(runningInstallProcesses);
        // 若选择终止则调用:KillInstallProcesses(runningInstallProcesses);
    }

    // 启动MSI安装
    try
    {
        Console.WriteLine($"开始安装MSI: {msiPath}");
        using var installProcess = Process.Start(new ProcessStartInfo
        {
            FileName = "msiexec.exe",
            Arguments = $"/i \"{msiPath}\" /qn", // /qn 静默安装,可根据需求修改参数
            UseShellExecute = false,
            CreateNoWindow = true
        });
        installProcess?.WaitForExit();
        Console.WriteLine("MSI安装完成");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"MSI安装失败: {ex.Message}");
    }
}

注意事项

  • 权限问题:终止进程或静默安装MSI通常需要管理员权限,可在项目属性中设置RequireAdministrator权限级别。
  • 进程扩展:可根据实际场景扩展targetProcessNames列表,添加其他常见的安装程序进程名。
  • 静默安装参数:msiexec的参数可根据需求调整,如/qb显示简化界面,/qn完全静默。

内容的提问来源于stack exchange,提问作者Shree

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 04:34:59