zoukankan      html  css  js  c++  java
  • 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);
    
            }
        }
    }

  • 相关阅读:
    QT 信号槽 异步事件驱动 单线程 多并发
    Qt 静态库与共享库(动态库)共享配置的一个小办法
    关于:有符号与无符号整数的大小比较
    QT信号槽 中的对象野指针
    Qt程序打包发布
    Qt程序打包发布
    SQL Server 2012 sa 用户登录 18456 错误 (转)
    QtCreator常用之快捷键
    opengl中相关的计算机图形变换矩阵之:模型视图几何变换
    opengl中相关的计算机图形变换矩阵之:齐次坐标 (摘编)
  • 原文地址:https://www.cnblogs.com/ITBread/p/2476170.html
Copyright © 2011-2022 走看看