2009-08-07 48 views
24

Estoy buscando punteros hacia las API en C# que me permitirán controlar mi conexión a Internet activando y desactivando la conexión.¿Alguna manera de apagar el "internet" en Windows usando C#?

Quiero escribir una pequeña aplicación de consola que permitirá que encienda mi acceso y salida, lo que permite la productividad a dispararse :) (así como aprender algo en el proceso)

Gracias !!

+1

"teniendo en cuenta la productividad a dispararse" .... que es la productividad? Claro, pierdo mucho tiempo revisando los intarwebs, pero sin acceso alguno, no puedo buscar referencias críticas para el idioma, la biblioteca o los marcos. – SingleNegationElimination

+1

Tuvimos nuestra conexión caída durante aproximadamente una hora hoy, y realmente estaba en un aprieto. Sin acceso al sitio del cliente para una actualización, y sin acceso a ningún material de referencia. Si descubre que está distraído por el acceso fácil a Internet demasiado, intente dividir sus tareas en subtareas más pequeñas. Básicamente use el método "Getting Things Done" de David Allen. Si tiene una lista de pequeños pasos incrementales que impulsarán el trabajo hacia adelante, realmente ayuda con la motivación. –

+3

El "teniendo en cuenta la productividad a dispararse" comentario se supone que es una broma chicos :) – sundeep

Respuesta

43

Si está utilizando Windows Vista, puede utilizar el cortafuegos incorporado para bloquear cualquier acceso a Internet.

El siguiente código crea una regla de firewall que bloquea todas las conexiones salientes en todos los adaptadores de red:

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); 

A continuación, retire la regla cuando se desea permitir el acceso a Internet de nuevo:

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

Esta es una pequeña modificación de algún otro código que he usado, por lo que no puedo garantizar que funcione. Una vez más, tenga en cuenta que necesitará Windows Vista (o posterior) y privilegios administrativos para que esto funcione.

Enlace a la documentación de firewall API.

+7

Para añadir el FirewallAPI.dll, tendrá que vaya a C : \ windows \ system32 – Gyuri

+0

Algunos de error que indica firewallPolicy.Rules como readony ... no se puede agregar las normas – KoolKabin

4

En realidad, hay una infinidad de formas de desactivar (Leer: interrumpir) su acceso a Internet, pero creo que la más simple sería cambiar la interfaz de red que lo conecta a Internet.

Aquí hay un enlace para que pueda empezar: Identifying active network interface

+0

Si usted tiene una conexión de red local activa, puede ser que se conecta a internet. No creo que haya ninguna forma de bloquear el acceso a Internet sin bloquear todo el acceso a la red (después de todo, Internet es solo una colección de redes). – Richard

+0

En realidad, normalmente puede encontrar la interfaz que lo conecta a Internet mirando la tabla de enrutamiento. La ruta por defecto (0.0.0.0) casi siempre apunta a la interfaz que se conecta a Internet (supongo que el 95% de las configuraciones se configuran de esta manera) – HiredMind

2

Esto es lo que actualmente estoy usando (mi idea, no una API):

System.Diagnostics;  

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

Desconectar de internet:InternetConnection("release");
Conectarse a Internet:InternetConnection("renew");

Desconexión se acaba elimine el acceso a internet (mostrará un ícono de precaución en el ícono de wifi). La conexión puede demorar cinco segundos o más.

Fuera de tema:
En ningún caso es posible que desee comprobar si está conectado o no (cuando se utiliza el código anterior), es mejor que sugiero esto:

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; 
    } 
} 
1

Aquí hay una programa de ejemplo que lo hace usando objetos de gestión WMI.

En el ejemplo, apuntar a mi adaptador inalámbrico buscando adaptadores de red que tengan "Wireless" en su nombre. Podría averiguar alguna subcadena que identifique el nombre del adaptador al que se dirige (puede obtener los nombres haciendo ipconfig /all en una línea de comando). Si no se pasa una subcadena, esto pasará por todos los adaptadores, lo que es bastante grave. Deberá agregar una referencia a System.Management para su proyecto.

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; 
     } 
    } 
} 
-3
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); 
} 
+0

Añadir esta DLL de referencia "FirewallAPI.dll" se encuentra esta en system32. este conjunto de código bloqueará toda la conexión de salida para su sistema. –

Cuestiones relacionadas