LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C#如何判断Windows系统防火墙服务已经开启并在使用中,如果不在使用中如何重新开启

admin
2025年3月14日 12:12 本文热度 188

在C#中判断Windows防火墙服务是否运行并启用,可以通过以下步骤实现:

  1. 检查防火墙服务状态:确认Windows Firewall服务(MpsSvc)是否正在运行。

  2. 检查防火墙配置:通过COM接口INetFwPolicy2查询各网络配置文件的防火墙启用状态。

以下是实现代码:

using System;
using System.ServiceProcess;
using System.Runtime.InteropServices;


public class FirewallStatusChecker
{
    public static bool IsFirewallEnabledAndRunning()
    {
        // 检查防火墙服务是否运行
        if (!IsFirewallServiceRunning())
            return false;


        // 检查防火墙是否启用
        try
        {
            return IsFirewallEnabled();
        }
        catch (COMException)
        {
            // 处理COM异常(如权限不足)
            return false;
        }
    }


    private static bool IsFirewallServiceRunning()
    {
        try
        {
            using (ServiceController sc = new ServiceController("MpsSvc"))
            {
                return sc.Status == ServiceControllerStatus.Running;
            }
        }
        catch (InvalidOperationException)
        {
            // 服务不存在或无法访问
            return false;
        }
    }


    private static bool IsFirewallEnabled()
    {
        INetFwPolicy2 firewallPolicy = null;
        try
        {
            // 创建防火墙策略实例
            Type type = Type.GetTypeFromProgID("HNetCfg.FwPolicy2");
            firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(type);


            // 检查各配置文件的启用状态
            bool domain = firewallPolicy.FirewallEnabled(NET_FW_PROFILE_TYPE2.NET_FW_PROFILE2_DOMAIN);
            bool privateProfile = firewallPolicy.FirewallEnabled(NET_FW_PROFILE_TYPE2.NET_FW_PROFILE2_PRIVATE);
            bool publicProfile = firewallPolicy.FirewallEnabled(NET_FW_PROFILE_TYPE2.NET_FW_PROFILE2_PUBLIC);


            return domain || privateProfile || publicProfile;
        }
        finally
        {
            if (firewallPolicy != null)
                Marshal.ReleaseComObject(firewallPolicy);
        }
    }


    [ComImport]
    [Guid("E2B3C97F-6AE1-41AC-817A-F6F92166D7DD")]
    private interface INetFwPolicy2
    {
        [DispId(7)]
        bool FirewallEnabled(NET_FW_PROFILE_TYPE2 profileType);
    }


    private enum NET_FW_PROFILE_TYPE2
    {
        NET_FW_PROFILE2_DOMAIN = 0x1,
        NET_FW_PROFILE2_PRIVATE = 0x2,
        NET_FW_PROFILE2_PUBLIC = 0x4,
        NET_FW_PROFILE2_ALL = 0x7FFFFFFF
    }
}

代码说明

  1. 服务状态检查:使用ServiceController类检查“MpsSvc”服务的运行状态。

  2. COM接口调用:通过HNetCfg.FwPolicy2创建防火墙策略对象,查询各网络配置文件(域、专用、公共)的防火墙启用状态。

  3. 异常处理:捕获可能的异常,如服务不存在或权限不足。

注意事项

  • 管理员权限:访问防火墙设置可能需要以管理员身份运行程序。

  • 系统兼容性INetFwPolicy2接口适用于Windows Vista及以上版本。

调用IsFirewallEnabledAndRunning()方法,返回true表示防火墙服务已启用并运行。


如果检测到不在使用,开启防火墙服务并且启动使用代码如下:

using System;
using System.ServiceProcess;
using System.Runtime.InteropServices;
using System.Security.Principal;


public class FirewallController
{
    // 主方法:开启防火墙服务并启用策略
    public static void EnableFirewall()
    {
        if (!IsRunAsAdmin())
        {
            Console.WriteLine("需要以管理员权限运行!");
            return;
        }


        try
        {
            // 1. 启动防火墙服务
            StartFirewallService();


            // 2. 启用防火墙策略
            SetFirewallStatus(true);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"操作失败: {ex.Message}");
        }
    }


    // 检查管理员权限
    private static bool IsRunAsAdmin()
    {
        WindowsIdentity identity = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(identity);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }


    // 启动Windows防火墙服务
    private static void StartFirewallService()
    {
        using (ServiceController sc = new ServiceController("MpsSvc"))
        {
            if (sc.Status != ServiceControllerStatus.Running)
            {
                Console.WriteLine("正在启动防火墙服务...");
                sc.Start();
                sc.WaitForStatus(ServiceControllerStatus.Running, TimeSpan.FromSeconds(30));
                Console.WriteLine("服务已启动");
            }
        }
    }


    // 设置防火墙启用状态
    private static void SetFirewallStatus(bool enable)
    {
        INetFwPolicy2 firewallPolicy = null;
        try
        {
            Type type = Type.GetTypeFromProgID("HNetCfg.FwPolicy2");
            firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(type);


            // 设置所有配置文件的状态
            firewallPolicy.FirewallEnabled[NET_FW_PROFILE_TYPE2.NET_FW_PROFILE2_DOMAIN] = enable;
            firewallPolicy.FirewallEnabled[NET_FW_PROFILE_TYPE2.NET_FW_PROFILE2_PRIVATE] = enable;
            firewallPolicy.FirewallEnabled[NET_FW_PROFILE_TYPE2.NET_FW_PROFILE2_PUBLIC] = enable;


            Console.WriteLine(enable ? "防火墙已启用" : "防火墙已禁用");
        }
        finally
        {
            if (firewallPolicy != null)
                Marshal.ReleaseComObject(firewallPolicy);
        }
    }


    // COM接口定义
    [ComImport]
    [Guid("E2B3C97F-6AE1-41AC-817A-F6F92166D7DD")]
    private interface INetFwPolicy2
    {
        [DispId(7)]
        bool FirewallEnabled(NET_FW_PROFILE_TYPE2 profileType);


        [DispId(7)]
        void FirewallEnabled(NET_FW_PROFILE_TYPE2 profileType, [MarshalAs(UnmanagedType.Bool)] bool enabled);
    }


    private enum NET_FW_PROFILE_TYPE2
    {
        NET_FW_PROFILE2_DOMAIN = 0x1,
        NET_FW_PROFILE2_PRIVATE = 0x2,
        NET_FW_PROFILE2_PUBLIC = 0x4,
        NET_FW_PROFILE2_ALL = 0x7FFFFFFF
    }
}

使用说明:

  1. 需要以管理员权限运行程序(右键 -> 以管理员身份运行)

  2. 调用入口方法:

FirewallController.EnableFirewall();

代码功能分解:

  1. 权限验证

    • IsRunAsAdmin() 方法验证当前是否以管理员权限运行

  2. 服务控制

    • 使用ServiceController启动"MpsSvc"服务

    • 设置30秒超时等待服务启动

  3. 防火墙策略控制

    • 通过COM接口INetFwPolicy2设置三个网络配置文件的启用状态

    • 同时启用:域网络、专用网络、公用网络配置

  4. 错误处理

    • 捕获服务操作和COM接口异常

    • 输出明确的错误信息

注意事项:

  1. 系统兼容性

    • 仅支持Windows Vista及更新版本

    • 需要.NET Framework 3.5+

  2. 依赖项

    • 需要防火墙服务存在且未被禁用

    • 需要Windows防火墙组件未被卸载

  3. 权限要求

    • 需要SeLoadDriverPrivilegeSeSecurityPrivilege权限

    • 需要UAC管理员批准模式

如果需要更细粒度的控制(如单独设置某个配置文件),可以修改SetFirewallStatus方法,添加参数指定具体配置文件类型。


该文章在 2025/3/14 12:12:44 编辑过
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved