C# 操作系统防火墙

很多时候,我们的程序是通过网络通信(如TCP或者UDP协议+端口),而将制作好的程序安装包给客户用时,发现会出现不能通信的现象(或者在这台电脑是可以的,却在另一台不可以),原因是防火墙阻止了,需要添加防火墙例外。现在将代码记录下来,方便以后备用。

在Visual studio 项目引用右键里面添加引用,选中COM然后找到NetFwTypeLib,确认,然后新建类FireWallHelp.cs添加

using NetFwTypeLib;

image

 

代码如下

using System;

using System.Collections.Generic;

using System.Text;

using NetFwTypeLib;



namespace FireWallTest

{

    public  class FireWallHelp

    {

        /// <summary>

        /// 添加防火墙例外端口

        /// </summary>

        /// <param name="name">名称</param>

        /// <param name="port">端口</param>

        /// <param name="protocol">协议(TCP、UDP)</param>

        public static void NetFwAddPorts(string name, int port, string protocol)

        {

            //创建firewall管理类的实例

            INetFwMgr netFwMgr = (INetFwMgr)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwMgr"));



            INetFwOpenPort objPort = (INetFwOpenPort)Activator.CreateInstance(

                Type.GetTypeFromProgID("HNetCfg.FwOpenPort"));



            objPort.Name = name;

            objPort.Port = port;

            if (protocol.ToUpper() == "TCP")

            {

                objPort.Protocol = NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP;

            }

            else

            {

                objPort.Protocol = NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_UDP;

            }

            objPort.Scope = NET_FW_SCOPE_.NET_FW_SCOPE_ALL;

            objPort.Enabled = true;



            bool exist = false;

            //加入到防火墙的管理策略

            foreach (INetFwOpenPort mPort in netFwMgr.LocalPolicy.CurrentProfile.GloballyOpenPorts)

            {



                if (objPort == mPort)

                {

                    exist = true;

                    break;

                }

            }

            if (exist)

            {

                System.Windows.Forms.MessageBox.Show("exist"); 

            }

            if (!exist) netFwMgr.LocalPolicy.CurrentProfile.GloballyOpenPorts.Add(objPort);

        }

        /// <summary>

        /// 将应用程序添加到防火墙例外

        /// </summary>

        /// <param name="name">应用程序名称</param>

        /// <param name="executablePath">应用程序可执行文件全路径</param>

        public static void NetFwAddApps(string name, string executablePath)

        {

            //创建firewall管理类的实例

            INetFwMgr netFwMgr = (INetFwMgr)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwMgr"));



            INetFwAuthorizedApplication app = (INetFwAuthorizedApplication)Activator.CreateInstance(

                Type.GetTypeFromProgID("HNetCfg.FwAuthorizedApplication"));



            //在例外列表里,程序显示的名称

            app.Name = name;



            //程序的路径及文件名

            app.ProcessImageFileName = executablePath;



            //是否启用该规则

            app.Enabled = true;



            //加入到防火墙的管理策略

            netFwMgr.LocalPolicy.CurrentProfile.AuthorizedApplications.Add(app);



            bool exist = false;

            //加入到防火墙的管理策略

            foreach (INetFwAuthorizedApplication mApp in netFwMgr.LocalPolicy.CurrentProfile.AuthorizedApplications)

            {

                if (app == mApp)

                {

                    exist = true;

                    break;

                }

            }

            if (!exist) netFwMgr.LocalPolicy.CurrentProfile.AuthorizedApplications.Add(app);

        }

        /// <summary>

        /// 删除防火墙例外端口

        /// </summary>

        /// <param name="port">端口</param>

        /// <param name="protocol">协议(TCP、UDP)</param>

        public static void NetFwDelApps(int port, string protocol)

        {

            INetFwMgr netFwMgr = (INetFwMgr)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwMgr"));

            if (protocol == "TCP")

            {

                netFwMgr.LocalPolicy.CurrentProfile.GloballyOpenPorts.Remove(port, NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP);

            }

            else

            {

                netFwMgr.LocalPolicy.CurrentProfile.GloballyOpenPorts.Remove(port, NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_UDP);

            }

        }

        /// <summary>

        /// 删除防火墙例外中应用程序

        /// </summary>

        /// <param name="executablePath">程序的绝对路径</param>

        public static void NetFwDelApps(string executablePath)

        {

            INetFwMgr netFwMgr = (INetFwMgr)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwMgr"));



            netFwMgr.LocalPolicy.CurrentProfile.AuthorizedApplications.Remove(executablePath);



        }

    }

}

你可能感兴趣的:(操作系统)