• C# 操作系统防火墙


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

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

    using NetFwTypeLib

    image

    代码如下

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Text;
      4 using NetFwTypeLib;
      5 
      6 namespace FireWallTest
      7 {
      8     public  class FireWallHelp
      9     {
     10         /// <summary>
     11         /// 添加防火墙例外端口
     12         /// </summary>
     13         /// <param name="name">名称</param>
     14         /// <param name="port">端口</param>
     15         /// <param name="protocol">协议(TCP、UDP)</param>
     16         public static void NetFwAddPorts(string name, int port, string protocol)
     17         {
     18             //创建firewall管理类的实例
     19             INetFwMgr netFwMgr = (INetFwMgr)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwMgr"));
     20 
     21             INetFwOpenPort objPort = (INetFwOpenPort)Activator.CreateInstance(
     22                 Type.GetTypeFromProgID("HNetCfg.FwOpenPort"));
     23 
     24             objPort.Name = name;
     25             objPort.Port = port;
     26             if (protocol.ToUpper() == "TCP")
     27             {
     28                 objPort.Protocol = NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP;
     29             }
     30             else
     31             {
     32                 objPort.Protocol = NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_UDP;
     33             }
     34             objPort.Scope = NET_FW_SCOPE_.NET_FW_SCOPE_ALL;
     35             objPort.Enabled = true;
     36 
     37             bool exist = false;
     38             //加入到防火墙的管理策略
     39             foreach (INetFwOpenPort mPort in netFwMgr.LocalPolicy.CurrentProfile.GloballyOpenPorts)
     40             {
     41 
     42                 if (objPort == mPort)
     43                 {
     44                     exist = true;
     45                     break;
     46                 }
     47             }
     48             if (exist)
     49             {
     50                 System.Windows.Forms.MessageBox.Show("exist"); 
     51             }
     52             if (!exist) netFwMgr.LocalPolicy.CurrentProfile.GloballyOpenPorts.Add(objPort);
     53         }
     54         /// <summary>
     55         /// 将应用程序添加到防火墙例外
     56         /// </summary>
     57         /// <param name="name">应用程序名称</param>
     58         /// <param name="executablePath">应用程序可执行文件全路径</param>
     59         public static void NetFwAddApps(string name, string executablePath)
     60         {
     61             //创建firewall管理类的实例
     62             INetFwMgr netFwMgr = (INetFwMgr)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwMgr"));
     63 
     64             INetFwAuthorizedApplication app = (INetFwAuthorizedApplication)Activator.CreateInstance(
     65                 Type.GetTypeFromProgID("HNetCfg.FwAuthorizedApplication"));
     66 
     67             //在例外列表里,程序显示的名称
     68             app.Name = name;
     69 
     70             //程序的路径及文件名
     71             app.ProcessImageFileName = executablePath;
     72 
     73             //是否启用该规则
     74             app.Enabled = true;
     75 
     76             //加入到防火墙的管理策略
     77             netFwMgr.LocalPolicy.CurrentProfile.AuthorizedApplications.Add(app);
     78 
     79             bool exist = false;
     80             //加入到防火墙的管理策略
     81             foreach (INetFwAuthorizedApplication mApp in netFwMgr.LocalPolicy.CurrentProfile.AuthorizedApplications)
     82             {
     83                 if (app == mApp)
     84                 {
     85                     exist = true;
     86                     break;
     87                 }
     88             }
     89             if (!exist) netFwMgr.LocalPolicy.CurrentProfile.AuthorizedApplications.Add(app);
     90         }
     91         /// <summary>
     92         /// 删除防火墙例外端口
     93         /// </summary>
     94         /// <param name="port">端口</param>
     95         /// <param name="protocol">协议(TCP、UDP)</param>
     96         public static void NetFwDelApps(int port, string protocol)
     97         {
     98             INetFwMgr netFwMgr = (INetFwMgr)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwMgr"));
     99             if (protocol == "TCP")
    100             {
    101                 netFwMgr.LocalPolicy.CurrentProfile.GloballyOpenPorts.Remove(port, NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP);
    102             }
    103             else
    104             {
    105                 netFwMgr.LocalPolicy.CurrentProfile.GloballyOpenPorts.Remove(port, NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_UDP);
    106             }
    107         }
    108         /// <summary>
    109         /// 删除防火墙例外中应用程序
    110         /// </summary>
    111         /// <param name="executablePath">程序的绝对路径</param>
    112         public static void NetFwDelApps(string executablePath)
    113         {
    114             INetFwMgr netFwMgr = (INetFwMgr)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwMgr"));
    115 
    116             netFwMgr.LocalPolicy.CurrentProfile.AuthorizedApplications.Remove(executablePath);
    117 
    118         }
    119     }
    120 }

    转载地址:http://www.cnblogs.com/ITBread/archive/2012/04/29/2476170.html

    作者:牛弟弟
    出处:http://www.cnblogs.com/dj-smile/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    文件上传中的错误文件上传及其命名
    播放音乐
    文件的读取与写入ASP.NET中常用代码之四(转载)
    Spring中文在线文档
    Css 图形
    离职进行时
    又面试了
    在Spring应用中创建全局获取ApplicationContext对象
    开始研究WEKA,一个开源java的数据挖掘工具
    收到SZ科技的录取通知,纠结是不是要去
  • 原文地址:https://www.cnblogs.com/dj-smile/p/5403203.html
Copyright © 2020-2023  润新知