存档

文章标签 ‘防火墙’

c# winform添加防火墙规则支持

2014年9月23日 没有评论

在最近的一个项目中,程序需要依赖第三方应用。所以在程序启动的时候,如果第三方应用没有运行,则主动调用起来。对于网络应用程序,或者一些需要用到自定义端口的程序,在启动的时候,可能会被系统防火墙给拦截,询问用户是否需要给与权限。

有的时候,这会让人很抓狂,特别是对于某xx程序,呵呵,我真的不是在黑360。

如果一个已经被用户授权获得管理员权限的应用,如果可以顺手把防火墙规则给加上去,至少看起来不用那么纠结了。

多的不说,下面是具体的静态类。

public class FirewallHelper
{
/// <summary>
/// 添加端口号到防火墙
/// </summary>
/// <param name=”name”></param>
/// <param name=”port”>端口号</param>
/// <param name=”protocol”>TCP/UDP/ANY</param>
public static void addPort(string name, int port, string protocol)
{
//创建防火墙管理类实例
INetFwMgr manager = (INetFwMgr)Activator.CreateInstance(Type.GetTypeFromProgID(“HNetCfg.FwMgr”));
//或者使用Type.GetTypeFromCLSID(new GUID(” {304CE942-6E39-40D8-943A-B913C40C9CD4}”)),
//其中, {304CE942-6E39-40D8-943A-B913C40C9CD4} 是防火墙的CLSID

INetFwOpenPort fwPort = (INetFwOpenPort)Activator.CreateInstance(Type.GetTypeFromProgID(“HNetCfg.FwOpenPort”));

fwPort.Name = name;
fwPort.Port = port;
if (protocol.ToUpper() == “TCP”)
{
fwPort.Protocol = NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP;
}
else if (protocol.ToUpper() == “ANY”)
{
fwPort.Protocol = NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_ANY;
}
else
{
fwPort.Protocol = NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_UDP;
}
fwPort.Scope = NET_FW_SCOPE_.NET_FW_SCOPE_ALL;
fwPort.Enabled = true;

bool exist = false;
//加入到防火墙的管理策略
foreach (INetFwOpenPort item in manager.LocalPolicy.CurrentProfile.GloballyOpenPorts)
{
if (fwPort == item)
{
exist = true;
break;
}
}
if (!exist) {
//不存在则添加
manager.LocalPolicy.CurrentProfile.GloballyOpenPorts.Add(fwPort);
}
}

/// <summary>
/// 添加应用程序到防火墙
/// </summary>
/// <param name=”name”></param>
/// <param name=”path”>应用程序的完整绝对路径,包含文件名</param>
public static void addApp(string name, string path)
{
INetFwMgr manager = (INetFwMgr)Activator.CreateInstance(Type.GetTypeFromProgID(“HNetCfg.FwMgr”));
INetFwAuthorizedApplication app = (INetFwAuthorizedApplication)Activator.CreateInstance(Type.GetTypeFromProgID(“HNetCfg.FwAuthorizedApplication”));

app.Name = name;
app.ProcessImageFileName = path;
app.Enabled = true;

bool exist = false;
foreach (INetFwAuthorizedApplication item in manager.LocalPolicy.CurrentProfile.AuthorizedApplications)
{
if (name == item.Name)
{
exist = true;
break;
}
}

if (!exist)
{
manager.LocalPolicy.CurrentProfile.AuthorizedApplications.Add(app);
}
}

/// <summary>
/// 从防火墙中删除端口号
/// </summary>
/// <param name=”port”></param>
/// <param name=”protocol”>TCP/UDP/ANY</param>
public static void delPort(int port, string protocol)
{
INetFwMgr manager = (INetFwMgr)Activator.CreateInstance(Type.GetTypeFromProgID(“HNetCfg.FwMgr”));

if (protocol.ToUpper() == “TCP”)
{
manager.LocalPolicy.CurrentProfile.GloballyOpenPorts.Remove(port, NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP);
}
else if (protocol.ToUpper() == “ANY”)
{
manager.LocalPolicy.CurrentProfile.GloballyOpenPorts.Remove(port, NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_ANY);
}
else
{
manager.LocalPolicy.CurrentProfile.GloballyOpenPorts.Remove(port, NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_UDP);
}
}

/// <summary>
/// 从防火墙中移除应用程序
/// </summary>
/// <param name=”path”>应用程序的完整绝对路径,包含文件名</param>
public static void delApp(string path)
{
INetFwMgr manager = (INetFwMgr)Activator.CreateInstance(Type.GetTypeFromProgID(“HNetCfg.FwMgr”));

manager.LocalPolicy.CurrentProfile.AuthorizedApplications.Remove(path);
}
}

 

因为都是静态类,要使用的时候,直接调用就可以了。

分类: 日常 标签: , ,