有啥方法可以使用 c# 在 Windows 中关闭“互联网”?

Posted

技术标签:

【中文标题】有啥方法可以使用 c# 在 Windows 中关闭“互联网”?【英文标题】:Any way to turn the "internet off" in windows using c#?有什么方法可以使用 c# 在 Windows 中关闭“互联网”? 【发布时间】:2009-08-07 02:16:34 【问题描述】:

我正在寻找指向 c# 中 API 的指针,这将允许我通过打开和关闭连接来控制我的 Internet 连接。

我想编写一个小控制台应用程序,它可以让我打开和关闭我的访问权限,从而提高生产力:)(以及在此过程中学习一些东西)

谢谢!!

【问题讨论】:

“让生产力飙升”....谁的生产力?当然,我在 intarwebs 上浪费了大量时间,但由于根本无法访问,我无法查找语言、库或框架的重要参考资料。 今天我们的连接中断了大约一个小时,我真的陷入了困境。无法访问客户站点进行更新,也无法访问任何参考资料。如果您发现自己因轻松访问互联网而分心,请尝试将您的任务分解为更小的子任务。基本上使用 David Allen 的“Getting Things Done”方法。如果您有一个可以推动工作向前发展的小增量步骤列表,那么它确实有助于激发动力。 “让生产力飙升”的评论应该是个笑话:) 【参考方案1】:

如果您使用的是 Windows Vista,则可以使用内置防火墙来阻止任何互联网访问。

以下代码创建一个防火墙规则,阻止所有网络适配器上的任何传出连接:

using NetFwTypeLib; // Located in FirewallAPI.dll
...
INetFwRule firewallRule = (INetFwRule)Activator.CreateInstance(
    Type.GetTypeFromProgID("HNetCfg.FWRule"));
firewallRule.Action = NET_FW_ACTION_.NET_FW_ACTION_BLOCK;
firewallRule.Description = "Used to block all internet access.";
firewallRule.Direction = NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_OUT;
firewallRule.Enabled = true;
firewallRule.InterfaceTypes = "All";
firewallRule.Name = "Block Internet";

INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(
    Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
firewallPolicy.Rules.Add(firewallRule);

然后在您想再次允许互联网访问时删除该规则:

INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(
    Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
firewallPolicy.Rules.Remove("Block Internet");

这是对我使用的其他一些代码的轻微修改,所以我不能保证它会起作用。再次提醒您,您需要 Windows Vista(或更高版本)和管理权限才能使其正常工作。

链接到firewall API 文档。

【讨论】:

要添加 FirewallAPI.dll,您必须浏览到 c:\windows\system32 一些错误将 firewallPolicy.Rules 声明为 readony... 无法添加规则 Windows 10、Visual Studio 2019 C# - 完美运行!应用程序必须以管理员身份运行才能生效,否则您会从 HRESULT 获得异常。谢谢大佬!【参考方案2】:

这是我目前正在使用的(我的想法,不是 api):

System.Diagnostics;    

void InternetConnection(string str)

    ProcessStartInfo internet = new ProcessStartInfo()
    
        FileName = "cmd.exe",
        Arguments = "/C ipconfig /" + str,
        WindowStyle = ProcessWindowStyle.Hidden
    ;  
    Process.Start(internet);

断开互联网连接: InternetConnection("release");连接互联网: InternetConnection("renew");

断开连接只会删除对互联网的访问(它会在 wifi 图标中显示一个警告图标)。 连接可能需要五秒钟或更长时间。

题外话: 在任何情况下,您可能都想检查您是否已连接(当您使用上面的代码时),我最好建议这样做:

System.Net.NetworkInformation;

public static bool CheckInternetConnection()

   try
   
       Ping myPing = new Ping();
       String host = "google.com";
       byte[] buffer = new byte[32];
       int timeout = 1000;
       PingOptions pingOptions = new PingOptions();
       PingReply reply = myPing.Send(host, timeout, buffer, pingOptions);
            return (reply.Status == IPStatus.Success);
    
    catch (Exception)
    
       return false;
    

【讨论】:

【参考方案3】:

实际上有无数种方法可以关闭(阅读:中断)您的互联网访问,但我认为最简单的方法是关闭将您连接到互联网的网络接口。

这是一个帮助您入门的链接: Identifying active network interface

【讨论】:

如果您有一个活动的本地网络连接,它可能会将您连接到互联网。我认为没有任何方法可以在不阻止所有网络访问的情况下阻止互联网访问(毕竟互联网只是网络的集合)。 其实你通常可以通过查看路由表找到连接互联网的接口。默认路由(0.0.0.0)几乎总是指向连接到互联网的接口(我猜 95% 的配置都是这样设置的)【参考方案4】:

这是一个使用 WMI 管理对象的示例程序。

在示例中,我通过查找名称中包含“无线”的网络适配器来定位我的无线适配器。您可以找出一些子字符串来标识您所针对的适配器的名称(您可以通过在命令行中执行ipconfig /all 来获取名称)。不传递子字符串会导致它通过所有适配器,这有点严重。您需要在项目中添加对 System.Management 的引用。

using System;
using System.Management;

namespace ConsoleAdapterEnabler

    public static class NetworkAdapterEnabler
    
        public static ManagementObjectSearcher GetWMINetworkAdapters(String filterExpression = "")
        
            String queryString = "SELECT * FROM Win32_NetworkAdapter";
            if (filterExpression.Length > 0)
            
                queryString += String.Format(" WHERE Name LIKE '%0%' ", filterExpression);
            
            WqlObjectQuery query = new WqlObjectQuery(queryString);
            ManagementObjectSearcher objectSearcher = new ManagementObjectSearcher(query);
            return objectSearcher;
        

        public static void EnableWMINetworkAdapters(String filterExpression = "")
        
            foreach (ManagementObject adapter in GetWMINetworkAdapters(filterExpression).Get())
            
                //only enable if not already enabled
                if (((bool)adapter.Properties["NetEnabled"].Value) != true)
                
                    adapter.InvokeMethod("Enable", null);
                
            
        

        public static void DisableWMINetworkAdapters(String filterExpression = "")
        
            foreach (ManagementObject adapter in GetWMINetworkAdapters(filterExpression).Get())
            
                //If enabled, then disable
                if (((bool)adapter.Properties["NetEnabled"].Value)==true)
                
                    adapter.InvokeMethod("Disable", null);
                
            
        

    
    class Program
    
        public static int Main(string[] args)
        
            NetworkAdapterEnabler.DisableWMINetworkAdapters("Wireless");

            Console.WriteLine("Press any key to continue");
            var key = Console.ReadKey();

            NetworkAdapterEnabler.EnableWMINetworkAdapters("Wireless");

            Console.WriteLine("Press any key to continue");
            key = Console.ReadKey();
            return 0;
        
    

【讨论】:

【参考方案5】:
public static void BlockingOfData()

    INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));

    firewallPolicy.set_DefaultOutboundAction(NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_DOMAIN, NET_FW_ACTION_.NET_FW_ACTION_BLOCK);
    firewallPolicy.set_DefaultOutboundAction(NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_PRIVATE, NET_FW_ACTION_.NET_FW_ACTION_BLOCK);
    firewallPolicy.set_DefaultOutboundAction(NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_PUBLIC, NET_FW_ACTION_.NET_FW_ACTION_BLOCK);

【讨论】:

添加这个引用 dll "FirewallAPI.dll" 你会在 system32 中找到这个。这组代码将阻止您系统的所有出站连接。 也许这个答案并没有帮助 OP 实现他们的意图,但老实说,我很快就能够读取所有配置文件(公共/私有/域)的连接的防火墙状态。不幸的是,为了我自己的利益,我不能赞成这个答案。不过,我很感激这个帖子和回答者。

以上是关于有啥方法可以使用 c# 在 Windows 中关闭“互联网”?的主要内容,如果未能解决你的问题,请参考以下文章

在 .NET 应用程序中关闭 MySQL 连接是不是重要? (准确地说,C#)

如何在c#中关闭xmldocument

在 C# 中的窗口窗体应用程序中关闭窗口时发出警报 [重复]

如何在 Windows 的 package.json 中的 NPM 脚本中关闭终端?

如何在 C# 中关闭这个循环二维数组?

C#中关闭子窗口的同时刷新父窗口的办法?