C# 防火牆操作之特定端口


  針對將特定端口加入到windows系統的防火牆中,使其允許或禁止通過防火牆。其大概思路是:

 /// <summary>
 /// 添加防火牆例外端口
 /// </summary>
 /// <param name="name">名稱</param>
 /// <param name="port">端口</param>
 /// <param name="protocol">協議(TCP、UDP)</param>
 /// <param name="scope">范圍類型</param>
 /// <param name="remoteAddresses">自定義范圍時的IP地址范圍</param>
 public static void AllowPortsUseFirewall(string name, int port, string protocol, NET_FW_SCOPE_ scope,string remoteAddresses)
 {
     //創建firewall管理類的實例: Type的GetTypeFromProgID是通過注冊表信息項目創建實例類型
     INetFwMgr netFwMgr = (INetFwMgr)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwMgr"));

     //判斷網絡類型,是TCP還是UDP
     NET_FW_IP_PROTOCOL_ protocolType = NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_UDP;
     if (protocol.ToUpper() == "TCP")
     {
         protocolType = NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP;
     }
     //查找以前是否有相同的規則創建,如果有則不再創建新的規則
     foreach (INetFwOpenPort mPort in netFwMgr.LocalPolicy.CurrentProfile.GloballyOpenPorts)
     {
         if (mPort.Protocol == protocolType && mPort.Port == port)
         {
             return;
         }
     }
     //創建一個防火牆端口管理實例
     INetFwOpenPort objPort = (INetFwOpenPort)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwOpenPort"));
     //設置端口實例名稱
     objPort.Name = name;
     //設置端口信息
     objPort.Port = port;
     //端口管理的網絡類型
     objPort.Protocol = protocolType;
     /*
      *      NET_FW_SCOPE_ALL  范圍是所有地址。 
      *      NET_FW_SCOPE_CUSTOM 自定義范圍。 
      *      NET_FW_SCOPE_LOCAL_SUBNET 范圍是本地子網。
      *      NET_FW_SCOPE_MAX  使用僅用於測試。不意味着為應用程序實現。 
      */
      //端口的范圍,針對哪類或哪個IP地址
     objPort.Scope = scope;
     //此處可以指定IP地址版本信息
     //objPort.IpVersion = NET_FW_IP_VERSION_.NET_FW_IP_VERSION_V4;
     //自定義IP地址范圍
     if (objPort.Scope == NET_FW_SCOPE_.NET_FW_SCOPE_CUSTOM)
     {
         //這而需要移除多個地址之間的空白字符串,有空白字符串會出現設置異常
         objPort.RemoteAddresses = remoteAddresses.Replace(" ", ""); ;//"192.168.1.10,192.168.1.12.......";
     }
     //是否啟用規則
     objPort.Enabled = true;
     //加入到本地防火牆管理規則中。
     netFwMgr.LocalPolicy.CurrentProfile.GloballyOpenPorts.Add(objPort);
 }

  刪除規則比較簡單:創建防火牆實例,直接移除某種通信類型的端口就行。

/// <summary>
 /// 刪除防火牆例外端口
 /// </summary>
 /// <param name="port">端口</param>
 /// <param name="protocol">協議(TCP、UDP)</param>
public static void DeletePortsUseFirewall(int port, string protocol)
{
    //創建firewall管理類的實例: Type的GetTypeFromProgID是通過注冊表信息項目創建實例類型
    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);
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM