针对将特定端口加入到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);
}
}

最新文章

  1. HttpWebRequest的GetResponse或GetRequestStream偶尔超时 + 总结各种超时死掉的可能和相应的解决办法
  2. 使用命令行 Subversion 访问项目源文件(SVN)
  3. mac本用WTG(Windows To Go)安装Win10到移动硬盘
  4. iOS10新特性之CallKit开发详解:锁屏接听和来电识别
  5. 推荐一个很棒的JS绘图库Flot
  6. USACO 5.4 Character Recognition(DP)
  7. JavaSPI机制学习笔记
  8. iOS - Alamofire 网络请求
  9. 配置VNCserver
  10. Centos7 安装 zabbix3.2
  11. iOS代码处理横屏问题
  12. Java的get、post请求
  13. 《算法》BEYOND 部分程序 part 2
  14. CentOS 7安装配置Samba服务器(挂载共享文件夹)
  15. 747. Largest Number At Least Twice of Others
  16. 2018/03/30 每日一个Linux命令 之 创建用户/密码
  17. border-radius 移动之伤
  18. 【贪心算法】POJ-3190 区间问题
  19. [Backbone] Parse not formatted JSON code
  20. 海思NB-IOT模块HI2115芯片I2C通信

热门文章

  1. P1049装箱问题
  2. php 操作Redis发送短信
  3. mysql简单命令
  4. unittest生成报告
  5. Ubuntu 18.04机器学习环境安装
  6. R语言multiplot函数绘制多张图像
  7. springboot+HttpInvoke 实现RPC调用
  8. Spring AOP注解配置demo
  9. 给虚拟机CentOS7扩容(lvm方式)
  10. NTC电阻Rt与温度T关系