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

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

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

在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