C# 实现对windows防火墙的常规操作管理白名单、黑名单

编程开发
413
c#
windows防火墙状态
打开防火墙
白名单
黑名单

C# 实现对windows防火墙的常规操作管理白名单、黑名单

日常人工配置防火墙

日常部署接口服务后经常需要人工配置防火墙的特定端口(也可能多个)开放给程序调用,人工操作起来就比较繁琐,其实也是可以偷懒交给程序来执行 以下是c#自动设置防火墙端口白名单的一段代码,可简化服务器配置防火墙端口的操作。

C#设置防火墙代码

 /// 
    /// 防火墙管理
    /// 
    public class FirewallManager
    {
        /// 
        /// 防火墙管理
        /// 
        private static NetFwTypeLib.INetFwMgr NetFwMgr
        {
            get
            {
                return (INetFwMgr)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwMgr"));
            }
        }

        /// 
        /// 防火墙策略
        /// 
        private static NetFwTypeLib.INetFwPolicy2 FirewallPolicy
        {
            get
            {
                return (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
            }
        }
 
        /// 
        /// 防火墙启用状态
        /// 
        public static bool FirewallEnabled
        {
            get
            {
                return NetFwMgr.LocalPolicy.CurrentProfile.FirewallEnabled;
            }
        }
        /// 
        /// 开启防火墙
        /// 
        /// 
        public static bool OpenFirewall() {
            try
            {
                //INetFwPolicy2 firewallPolicy =
				(INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
                // 启用<高级安全Windows防火墙> - 专有配置文件的防火墙
                FirewallPolicy.set_FirewallEnabled(NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_PRIVATE, true);
                // 启用<高级安全Windows防火墙> - 公用配置文件的防火墙
                FirewallPolicy.set_FirewallEnabled(NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_PUBLIC, true);
                // 启用<高级安全Windows防火墙> - 域配置文件的防火墙
                FirewallPolicy.set_FirewallEnabled(NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_DOMAIN, true);
                return true;
            }
            catch (Exception e)
            {
                string error = $"防火墙修改出错:{e.Message}";
                throw new Exception(error);
            }
        }

        /// 
        /// 通用规则命名 方便查询
        /// 
        /// 
        /// 
        private static string DesignAppRuleName(string appPath)
        {
            string ruleName = $"通信权限_{System.IO.Path.GetFileNameWithoutExtension(appPath)}";
            return ruleName;
        }
     
        /// 
        /// 允许应用程序通过防火墙
        /// 
        /// 应用程序的绝对路径
        /// 未找到程序文件
        public static void AllowAppUseFirewall(string appPath)
        {
            if (System.IO.File.Exists(appPath) == false)
            {
                throw new System.IO.FileNotFoundException("未找到程序文件");
            }
            //创建firewall管理类的实例: Type的GetTypeFromProgID是通过注册表信息项目创建实例类型
          
            //以程序名为规则名创建规则,以便查询
            string name = DesignAppRuleName(appPath);
            INetFwAuthorizedApplication appAuthorized = FindFirewallRule(appPath);
           if (appAuthorized != null)
            {
                RemoveAppUseFirewall(name);
            }
            //创建一个认证程序类的实例
            INetFwAuthorizedApplication app =
(INetFwAuthorizedApplication)Activator.CreateInstance
(Type.GetTypeFromProgID("HNetCfg.FwAuthorizedApplication"));

            //在例外列表里,程序显示的名称
            app.Name = name;

            //程序的绝对路径,这里使用程序本身
            app.ProcessImageFileName = appPath;

            //端口的范围,针对哪类或哪个IP地址
            //objPort.Scope = NET_FW_SCOPE_.NET_FW_SCOPE_ALL;
            //此处可以指定IP地址版本信息
            //objPort.IpVersion = NET_FW_IP_VERSION_.NET_FW_IP_VERSION_V4;
            //是否启用该规则
            app.Enabled = true;

            //加入到防火墙的管理策略
            NetFwMgr.LocalPolicy.CurrentProfile.AuthorizedApplications.Add(app);
        }

        /// 
        /// 查找特定程序防火墙对应规则
        /// 
        /// 
        /// 
        public static INetFwAuthorizedApplication FindFirewallRule(string appPath) 
		{
            NET_FW_PROFILE_TYPE_ currentProfileType = NetFwMgr.CurrentProfileType;
            //查找防火墙规则中是否已有同名规则存在
            foreach (INetFwAuthorizedApplication item in
			NetFwMgr.LocalPolicy.GetProfileByType(currentProfileType).AuthorizedApplications)
            {
                if (item.Name == DesignAppRuleName(appPath))
                {
                    return item;
                }
            }
            return null;
        }

        /// 
        /// 移除应用程序通过防火墙
        /// 
        /// 应用程序的绝对路径
        public static void RemoveAppUseFirewall(string appPath)
        {
            //参数为程序的绝对路径
            NetFwMgr.LocalPolicy.CurrentProfile.AuthorizedApplications.Remove(appPath);
        }


        /// 
        /// 通用规则命名 方便查询
        /// 
        /// 
        /// 
        private static string DesignPortRuleName(int Port)
        {
            string ruleName = $"管理通信权限_{Port} 端口";
            return ruleName;
        }
        /// 
        /// 添加防火墙例外端口
        /// 
        /// 名称
        /// 端口
        public static void AllowPortUseFirewall(int port)
        {
            string name = DesignPortRuleName(port);
            INetFwOpenPort objPort =
			(INetFwOpenPort)Activator.CreateInstance(
                Type.GetTypeFromProgID("HNetCfg.FwOpenPort"));
            objPort.Name = name;
            objPort.Port = port;

            objPort.Protocol = NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP;

            objPort.Scope = NET_FW_SCOPE_.NET_FW_SCOPE_ALL;
            objPort.Enabled = true;
            INetFwOpenPort openPort = FindFirewallRule(port);
            if (openPort != null)
            {
                RemovePortUseFirewall(port);
            }
            NetFwMgr.LocalPolicy.CurrentProfile.GloballyOpenPorts.Add(objPort);
        }

        /// 
        /// 删除防火墙例外端口
        /// 
        /// 端口
        public static void RemovePortUseFirewall(int port)
        {
            NetFwMgr.LocalPolicy.CurrentProfile.GloballyOpenPorts.Remove
			(port, NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP);
        }

        /// 
        /// 查找特定端口防火墙对应规则
        /// 
        /// 
        /// 
        public static INetFwOpenPort FindFirewallRule(int Port)
        {
            foreach (INetFwOpenPort mPort in NetFwMgr.LocalPolicy.CurrentProfile.GloballyOpenPorts)
            {
                if (mPort.Name== DesignPortRuleName(Port))
                {
                    return mPort;
                }
            }
            return null;
        }
    }
C#控制台程序右上角的关闭按钮怎么屏蔽
使用C#为MP3文件添加封面、专辑和歌手信息的实例教程
多线程使用Image.FromFile 加载图片时出现图片文件被锁定无法更新
C# 将数组分组进行平均拆分成多个数组 代码如何实现
vs编译时报错 不安全代码只会在使用 /unsafe 编译的情况下出现
.NET5框架下使用HttpListener类实现http接口监听替代OWIN自我寄宿
C# 二维码生成源码|使用ThoughtWorks.QRCode 实现根据文本内容生成二维码
 C# 实现 Rsa字符串非对称加密简单例子
VS错误提示无法嵌入互操作类型“IWshShell_ClassClass”,请改用适用的接口的解决方法
C# 操作DOS添加端口防火墙名单
C#实现查询某个端口是被哪个程序进程占用
C# 中使用const 常量可能会出现的版本更新问题!
暂无相关内容...
基于.NET4.0实现的目录文件新增监视并自动化上传至ftp完整流程工具源码
[人脸检测]基于C#OpenCvSharp+haarcascade人脸、人眼模型实现人脸检测源码
.NET5+C# WPF实现图片添加倾斜文字平铺水印工具源码
C#基于OpenCVSharp实现图片对比相似度百分比源码下载
C#结合虫洞软件(Wormhole)实现自动登录到手机版百度网盘的流程源码
免责声明 部分转载分享内容若侵犯您的权益,还请 邮件联系 侵删