C#操作防火墙控制电脑某些软件联网
问题:
目前公司软件刚由单机软件更改为联网软件,许多客户反映希望能够有一个功能来控制电脑上某些必用软件,如qq,公司软件联网,而其他不必要的如网页,游戏等软件不允许联网,于是向公司反映希望可以有一个功能能够实现这种需求。
开始思路:
刚开始接到任务的时候首先想到是控制防火墙来进行此项操作。于是打开自己电脑的防火墙,设置了出站规则——新建规则——禁用所有程序联网,然后单独设置两个例外,测试结果为所有程序都连不上网,于是这个思路放弃。
然后思考用c#写程序来监控任务管理器中程序的添加,如果不是qq或者是我们软件的话,就会kill程序,结果杀伤力巨大,就连打开我的电脑都打不开了,于是这个思路也走不通。
最后还是回到了防火墙的层面:首先新建规则—禁用1—65535的所有端口,然后开启qq所用的4000—4100端口和软件所用的8080端口。测试结果成功。
参考代码:
https://www.cnblogs.com/shenblogs/archive/2016/05/13/5489161.html 写的很全,并且有关闭防火墙的功能
c#程序:
主要添加引用:
1.com组件NetFwTypeLib
2.System.ServiceProcess
应注意:在添加禁用端口的规则时,应该注意要先添加规则的协议为TCP还是Udp,不然可能会报:值不在预期的范围内。
主要程序如下:
- using Microsoft.Win32;
- using NetFwTypeLib;
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.Linq;
- using System.ServiceProcess;
- using System.Text;
- using System.Threading.Tasks;
- namespace Control_Firewall
- {
- class Program
- {
- RegistryKey firekey;
- //获取防火墙名称
- string firewallname = "";
- //电脑名称
- string versionname = "";
- //获取电脑版本名称
- public string getsysversion()
- {
- RegistryKey rk = Registry.LocalMachine.OpenSubKey(@"Software\\Microsoft\\Windows NT\\CurrentVersion");
- versionname = rk.GetValue("ProductName").ToString();
- rk.Close();
- return versionname;
- }
- //根据电脑类型来操作防火墙打开
- public void openfire(string versionname)
- {
- if (versionname.Contains("XP"))
- {
- firewallname = "SharedAccess";
- firekey = Registry.LocalMachine.OpenSubKey(@"SYSTEM\\CurrentControlSet\\Services\\SharedAccess", true);
- }
- else
- {
- firewallname = "MpsSvc";
- firekey = Registry.LocalMachine.OpenSubKey(@"SYSTEM\\CurrentControlSet\\Services\\MpsSvc", true);
- }
- //获取启动类型为禁止还是自动
- string start = firekey.GetValue("Start").ToString();
- if (start == "") {
- ProcessStartInfo objProInfo = new ProcessStartInfo();
- objProInfo.FileName = "cmd.exe";
- objProInfo.CreateNoWindow = false;
- objProInfo.WindowStyle = ProcessWindowStyle.Hidden;
- objProInfo.Arguments = "/c sc config " + firewallname + " start= " + "auto";
- Process.Start(objProInfo);
- //挂起线程1s后启动服务
- System.Threading.Thread.Sleep();
- }
- firekey.Close();
- //判断防火墙是否启动了
- ServiceController sc = new ServiceController(firewallname);
- //如果防火墙未启动则启动
- if (sc.Status.Equals(ServiceControllerStatus.Stopped) || sc.Status.Equals(ServiceControllerStatus.StopPending))
- {
- sc.Start();
- }
- //暂时不用
- if (versionname.Contains("XP"))
- {
- RegistryKey rekey = Registry.LocalMachine.OpenSubKey(@"SYSTEM\\CurrentControlSet\\Services\\SharedAccess\\Parameters\\FirewallPolicy\\StandardProfile", true);
- var Enablefilewall = rekey.GetValue("EnableFirewall").ToString();
- if (Enablefilewall == "")
- {
- rekey.SetValue("EnableFirewall", );
- }
- rekey.Close();
- }
- else
- {
- 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);
- }
- }
- //为防火墙添加出站规则
- public void handle(string name)
- {
- //目前不用
- if (name.Contains("XP"))
- {
- INetFwAuthorizedApplication Fwapp = (INetFwAuthorizedApplication)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwAuthorizedApplication"));
- }
- else
- {
- // 1. 创建实例,阻止所有的出站连接
- INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
- //启用或禁用<高级安全Windows防火墙> - 专有配置文件的出站连接
- firewallPolicy.set_DefaultOutboundAction(NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_PRIVATE, NET_FW_ACTION_.NET_FW_ACTION_ALLOW);
- //启用或禁用<高级安全Windows防火墙> - 公用配置文件的出站连接
- firewallPolicy.set_DefaultOutboundAction(NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_PUBLIC, NET_FW_ACTION_.NET_FW_ACTION_ALLOW);
- //创建三个出站规则来控制程序联网
- INetFwRule2 qqRule = (INetFwRule2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FWRule"));
- INetFwRule2 conductRule = (INetFwRule2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FWRule"));
- INetFwRule2 stopallRule = (INetFwRule2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FWRule"));
- stopallRule.Name = "禁用所有端口号";
- stopallRule.Description = "关闭所有可用端口";
- stopallRule.Direction = NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_OUT;
- stopallRule.Action = NET_FW_ACTION_.NET_FW_ACTION_BLOCK;
- stopallRule.Protocol = (int)NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP;
- stopallRule.Enabled = true;
- stopallRule.RemotePorts = "1-65535";
- //开启qq端口
- qqRule.Name = "启用qq";
- qqRule.Description = "开启qq所用的4000-4100端口";
- qqRule.Direction = NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_OUT;
- qqRule.Action = NET_FW_ACTION_.NET_FW_ACTION_ALLOW;
- qqRule.Protocol = (int)NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP;
- qqRule.Enabled = true;
- qqRule.RemotePorts = "4000-4100";
- //开启所用软件端口
- conductRule.Name = "软件";
- conductRule.Description = "开启软件所用的8080端口";
- conductRule.Direction = NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_OUT;
- conductRule.Action = NET_FW_ACTION_.NET_FW_ACTION_ALLOW;
- conductRule.Enabled = true;
- conductRule.Protocol = (int)NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP;
- conductRule.RemotePorts = "";
- firewallPolicy.Rules.Add(stopallRule);
- firewallPolicy.Rules.Add(qqRule);
- firewallPolicy.Rules.Add(conductRule);
- //添加成功,显示成功标志
- Console.WriteLine("all done");
- }
- }
- static void Main(string[] args)
- {
- Program p = new Program();
- string sysversion = p.getsysversion();
- p.openfire(sysversion);
- p.handle(sysversion);
- }
- }
- }
代码写的比较急,所以有些地方写的不太好,并且目前所面向的系统主要是win7系统,因此只写了win7的情况(xp的情况与之不同),以后有时间再补齐吧。
文笔不太好,所以基本都是白话,望大家多多包涵,我的初心是大家可以从中学到知识,一起成长!
C#操作防火墙控制电脑某些软件联网的更多相关文章
- 如何使用Windows防火墙禁止软件联网
很多软件需要联网,当我们为了“某些目的”,不想让软件联网的时候,我们有没有办法做到呢?答案是肯定的,那就是使用Windows系统自带的防火墙来屏蔽软件的联网,禁止软件出站请求,这样就可以了,下面介绍具 ...
- Andy - 又一款速度流畅的免费安卓 Android 模拟器 (支持手机无线控制电脑模拟器)
随着 Genymotion.BlueStacks 等电脑上的 Android 模拟器流行起来之后,似乎很多人都发现在电脑上运行使用安卓APP软件.畅玩手机游戏确实很有乐趣. 今天我们又发现了一款全新免 ...
- 手机控制电脑,在WIFI局域网下(关机,重启,遥控)
这个软件叫百变遥控:http://blog.sina.com.cn/s/blog_9abc7dbc0101hmut.html 今天周末,在家里看电影,家里用的是台式电脑,我自己买了一个投影仪来专门看视 ...
- netsh命令操作防火墙
这里的netsh命令操作防火墙主要是在Windows 7及以上版本,以示例说明: 1.防火墙入方向添加一条规则,规则名字:RDP,协议tcp,动作为允许,端口号3389:简而言之,就是允许其他机器远程 ...
- 手机控制电脑定时关机,重启WiFi
需求 晚上上床,电脑开着WiFi让手机上网.要么上床之前就给电脑设置定时关机:要么就电脑开通宵:要么就待会下来关电脑.这3种情况都非常不好,要么麻烦,要么浪费. 最无奈的是电脑刚开好WiFi,上床后才 ...
- CentOS7 开放端口 通过 firewall-cmd 工具来操作防火墙
CentOS7 提供了 firewall-cmd 工具来操作防火墙. firewall-cmd --permanent:表示设置为持久,配置被写入配置文件,跨重启,不会立即生效,重新加载配置后生效.不 ...
- 用AutoHotkey的热字串功能启动常用电脑程序软件 Version 2 Build 20191214
; 用AutoHotkey的热字串功能启动常用电脑程序软件 Version 2 Build 20191214 ; 电脑上的快捷键太多了,记都记不住,容易冲突和搞混,所以做了个热字串启动; 用法:运行此 ...
- 关于C#操作防火墙,阻止程序联网
//开启服务.开启防火墙 public void OpenFileWall() { // 1. 判断当前系统为XP或Win7 RegistryKey rk = Registry.LocalMachin ...
- 【原创】.NET读写Excel工具Spire.Xls使用(4)对数据操作与控制
本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html .NET读写Excel工具Spire.Xls使用文章 ...
随机推荐
- 使用OLAMISDK实现一个语音输入数字进行24点计算的iOS程序
前言 在目前的软件应用中,输入方式还是以文字输入方式为主,但是语音输入的方式目前应用的越来越广泛.这是一个利用 Olami SDK 编写的一个24点iOS程序,是通过语音进行输入. Olami SDK ...
- web前端上传图片的几种方法
1.表单上传 最传统的图片上传方式是form表单上传,使用form表单的input[type=”file”]控件,打开系统的文件选择对话框,从而达到选择文件并上传的目的. form表单上传 表单上传需 ...
- asp.net mvc webapi 实用的接口加密方法
在很多项目中,因为webapi是对外开放的,这个时候,我们就要得考虑接口交换数据的安全性. 安全机制也比较多,如andriod与webapi 交换数据的时候,可以走双向证书方法,但是开发成本比较大, ...
- 项目总结二:模块管理之requireJS
项目开发前期,对究竟用requireJS 还是sea.js 进行讨论,最后采用requireJS,但是后期遇到了问题--当谷歌地图不能加载时,整个页面卡死的状况. requirejs 的作用: 防止j ...
- Java基础总结--流程控制
Java流程控制* 顺序结构--最常见的执行情况,语句按照出现的先后次序依次执行.* 判断结构--对条件进行判断,执行相应的语句.有三种常见的形式< if(判断条件){语句;}--为真执行语句, ...
- Unix/Linux僵尸进程
1. 僵尸进程的产生: 一个进程调用exit命令结束自己生命的时候,其实它并没有真正的被销毁,而是留下一个称为“僵尸进程”的数据结构.这时它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度 ...
- LeetCode 217. Contains Duplicate (包含重复项)
Given an array of integers, find if the array contains any duplicates. Your function should return t ...
- 正则和grep——再做正则就去死
grep 文本过滤工具 基本正则表达式 grep 语法 基本正则表达式的元字符 次数匹配 位置锚定 分组 扩展正则表达式 基本正则表达式的元字符 次数匹配 位置锚定 分组 或者 grep的介绍 lin ...
- Swift 之Protocol在cocoa中的使用范例搜集(一)
protocol Reusable: class { static var reuseIndentifier: String {get} static var nib: UINib? {get} } ...
- mongo+mongoose+express
直接上指令: //*代表自定义名字 //使用数据库 use * //检查当前数据库 db //查询数据库列表 show dbs //查询当前数据库集合 show collections //插入文档自 ...