2009-08-07 7 views
24

Je suis à la recherche de pointeurs vers les API en C# qui me permettront de contrôler ma connexion Internet en activant et désactivant la connexion.Un moyen d'éteindre "internet" dans Windows en utilisant C#?

Je veux écrire une petite application de la console qui va me permettre de tourner mon accès sur et en dehors, en améliorant la productivité de monter en flèche :) (ainsi que l'apprentissage de quelque chose dans le processus)

Merci !!

+1

"en améliorant la productivité de monter en flèche" .... qui est la productivité? Bien sûr, je perds beaucoup de temps à troller les intarwebs, mais sans accès du tout, je suis incapable de rechercher des références critiques pour le langage, la bibliothèque ou les frameworks. – SingleNegationElimination

+1

Nous avons perdu notre connexion pendant environ une heure aujourd'hui, et j'étais vraiment coincé. Pas d'accès au site client pour une mise à jour, et aucun accès à aucun matériel de référence. Si vous trouvez que vous êtes trop distrait par un accès facile à Internet, essayez de décomposer vos tâches en sous-tâches plus petites. Fondamentalement, utilisez la méthode "Getting Things Done" par David Allen. Si vous avez une liste de petites étapes progressives qui vont faire avancer le travail, cela aide vraiment à la motivation. –

+3

Le commentaire "Permettre la productivité de monter en flèche" était censé être une blague les gars :) – sundeep

Répondre

43

Si vous utilisez Windows Vista, vous pouvez utiliser le pare-feu intégré pour bloquer tout accès à Internet.

Le code suivant crée une règle de pare-feu qui bloque les connexions sortantes sur tous vos adaptateurs réseau:

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

Retirez ensuite la règle lorsque vous souhaitez autoriser à nouveau l'accès à Internet:

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

C'est une légère modification d'un autre code que j'ai utilisé, donc je ne peux pas garantir que ça marchera. Encore une fois, gardez à l'esprit que vous aurez besoin de Windows Vista (ou plus tard) et des privilèges administratifs pour que cela fonctionne.

Lien vers la documentation firewall API.

+7

Pour ajouter le FirewallAPI.dll, vous devez naviguer vers c : \ windows \ system32 – Gyuri

+0

Une erreur indiquant firewallPolicy.Rules comme readony ... ne peut pas ajouter les règles – KoolKabin

4

Il existe en fait une myriade de façons de désactiver (Read: break) votre accès à Internet, mais je pense que le plus simple serait de désactiver l'interface réseau qui vous connecte à Internet.

Voici un lien pour vous aider à démarrer: Identifying active network interface

+0

Si vous avez une connexion réseau local active, il peut vous connecter à Internet. Je ne pense pas qu'il existe un moyen de bloquer l'accès à Internet sans bloquer l'accès au réseau (après tout, Internet n'est qu'une collection de réseaux). – Richard

+0

En fait, vous pouvez généralement trouver l'interface qui vous relie à Internet en regardant la table de routage. La route par défaut (0.0.0.0) pointe presque toujours vers l'interface qui se connecte à Internet (je suppose que 95% des configurations sont configurées de cette façon) – HiredMind

2

C'est ce que je suis actuellement en utilisant (mon idée, pas une api):

System.Diagnostics;  

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

Se déconnecter d'internet:InternetConnection("release");
Se connecter à internet:InternetConnection("renew");

Disconnecting contenterai supprimer l'accès à internet (il affichera une icône d'avertissement dans l'icône wifi). La connexion peut prendre cinq secondes ou plus.

Sur le sujet:
Dans tous les cas, vous pouvez vérifier si vous êtes connecté ou non (lorsque vous utilisez le code ci-dessus), je ferais mieux de suggérer ceci:

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

est ici un exemple de programme qui le fait en utilisant des objets de gestion WMI.

Dans cet exemple, je cible mon adaptateur sans fil en recherchant des cartes réseau portant le nom «Sans fil». Vous pouvez trouver une sous-chaîne qui identifie le nom de l'adaptateur que vous ciblez (vous pouvez obtenir les noms en faisant ipconfig /all sur une ligne de commande). Ne pas passer une sous-chaîne entraînerait le passage de tous les adaptateurs, ce qui est assez sévère. Vous devrez ajouter une référence à System.Management à votre projet.

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

Ajouter cette référence dll "FirewallAPI.dll", vous trouverez cela dans system32. Cet ensemble de code bloquera toutes les connexions sortantes pour votre système. –

Questions connexes