问题:

  目前公司软件刚由单机软件更改为联网软件,许多客户反映希望能够有一个功能来控制电脑上某些必用软件,如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#操作防火墙控制电脑某些软件联网的更多相关文章

  1. 如何使用Windows防火墙禁止软件联网

    很多软件需要联网,当我们为了“某些目的”,不想让软件联网的时候,我们有没有办法做到呢?答案是肯定的,那就是使用Windows系统自带的防火墙来屏蔽软件的联网,禁止软件出站请求,这样就可以了,下面介绍具 ...

  2. Andy - 又一款速度流畅的免费安卓 Android 模拟器 (支持手机无线控制电脑模拟器)

    随着 Genymotion.BlueStacks 等电脑上的 Android 模拟器流行起来之后,似乎很多人都发现在电脑上运行使用安卓APP软件.畅玩手机游戏确实很有乐趣. 今天我们又发现了一款全新免 ...

  3. 手机控制电脑,在WIFI局域网下(关机,重启,遥控)

    这个软件叫百变遥控:http://blog.sina.com.cn/s/blog_9abc7dbc0101hmut.html 今天周末,在家里看电影,家里用的是台式电脑,我自己买了一个投影仪来专门看视 ...

  4. netsh命令操作防火墙

    这里的netsh命令操作防火墙主要是在Windows 7及以上版本,以示例说明: 1.防火墙入方向添加一条规则,规则名字:RDP,协议tcp,动作为允许,端口号3389:简而言之,就是允许其他机器远程 ...

  5. 手机控制电脑定时关机,重启WiFi

    需求 晚上上床,电脑开着WiFi让手机上网.要么上床之前就给电脑设置定时关机:要么就电脑开通宵:要么就待会下来关电脑.这3种情况都非常不好,要么麻烦,要么浪费. 最无奈的是电脑刚开好WiFi,上床后才 ...

  6. CentOS7 开放端口 通过 firewall-cmd 工具来操作防火墙

    CentOS7 提供了 firewall-cmd 工具来操作防火墙. firewall-cmd --permanent:表示设置为持久,配置被写入配置文件,跨重启,不会立即生效,重新加载配置后生效.不 ...

  7. 用AutoHotkey的热字串功能启动常用电脑程序软件 Version 2 Build 20191214

    ; 用AutoHotkey的热字串功能启动常用电脑程序软件 Version 2 Build 20191214 ; 电脑上的快捷键太多了,记都记不住,容易冲突和搞混,所以做了个热字串启动; 用法:运行此 ...

  8. 关于C#操作防火墙,阻止程序联网

    //开启服务.开启防火墙 public void OpenFileWall() { // 1. 判断当前系统为XP或Win7 RegistryKey rk = Registry.LocalMachin ...

  9. 【原创】.NET读写Excel工具Spire.Xls使用(4)对数据操作与控制

                  本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html .NET读写Excel工具Spire.Xls使用文章 ...

随机推荐

  1. Echarts数据可视化series-scatter散点图,开发全解+完美注释

    全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...

  2. scala配置intellij IDEA15.0.3环境及hello world!

    1. Intellij IDEA Scala开发环境搭建 Intellij IDEA 15.0.3 默认配置里面没有Scala插件,需要手动安装,在Intellij IDEA 15.0.3 第一次运行 ...

  3. app启动页问题

    今天自己做的小作品准备提交,就差一个启动页,各种百度,各种搜,结果还好最后终于出来了,和大家分享一下,这个过程中遇到的各种小问题.(注XCode版本为7.2) 1.启动页一般都是图片,因为苹果有4,4 ...

  4. VS中Release模式下生成去掉生成pdb文件

    1.右键项目,选择属性 2.选择正确的配置,点击高级 3.调试信息选择 none,点击确定.

  5. [问题记录]父元素position:relative的深坑

    个人博客迁移至:https://blog.plcent.com/欢迎大家访问 今天在写全屏切换的时候,发现一个问题就是切换时只能滚动第一屏,其他屏死都不动, 全屏滚动的原理: 是每次滚动父元素向上滚动 ...

  6. 系统讲解CSS,前端开发最神奇的技术,新手的你一定不能错过

    前面小编带领大家重温了前端开发中最基本的HTML语言.如果你已经掌握了这门语言,那么恭喜你,可以去深入了解CSS技术了.CSS技术最主要的功能就是弥补HTML标记对在页面中显示外观的不足,对这些标记对 ...

  7. js 中 new fn与new fn()的区别

    在有些代码中,看见了let fn = new Fn()和let fn = new Fn,刚开始有些人或许和我一样感到些许疑惑,但潜意识的也会想到,这两者说不定就是一样的.没错!!在没有参数的情况下这两 ...

  8. Log4j各级别日志重复打印的问题

    今天在配置Log4j日志的时候,发现日志重复打印的问题.网上查了很多资料,发现介绍Log4j配置的文章数量不少,但提到这个问题的文章却寥寥,解决了自己的问题以后,赶紧记录一下. 原文地址:http:/ ...

  9. 217. Contains Duplicate (leetcode)

    Given an array of integers, find if the array contains any duplicates. Your function should return t ...

  10. ELK系列~对fluentd参数的理解

    这段时候一直在研究ELK框架,主要集成在对fluentd和nxlog的研究上,国内文章不多,主要看了一下官方的API,配合自己的理解,总结了一下,希望可以帮到刚入行的朋友们! Fluentd(日志收集 ...