发布:2021/12/20 9:08:03作者:管理员 来源:本站 浏览次数:921
很多时候,我们的程序是通过网络通信(如TCP或者UDP协议+端口),而将制作好的程序安装包给客户用时,发现会出现不能通信的现象(或者在这台电脑是可以的,却在另一台不可以),原因是防火墙阻止了,需要添加防火墙例外。现在将代码记录下来,方便以后备用。
在Visual studio 项目引用右键里面添加引用,选中COM然后找到NetFwTypeLib,确认,然后新建类FireWallHelp.cs添加
using NetFwTypeLib;
代码如下
-
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);
-
-
}
-
}
-
}
© Copyright 2014 - 2024 柏港建站平台 ejk5.com. 渝ICP备16000791号-4