2009-08-07 14 views
24

Sto cercando i puntatori verso le API in C# che mi consentiranno di controllare la mia connessione Internet accendendo e spegnendo la connessione.Un modo per disattivare "Internet off" in windows usando C#?

Voglio scrivere una piccola applicazione console che mi permetterà di trasformare il mio accesso on e off, permettendo per la produttività a salire alle stelle :) (così come imparare qualcosa nel processo)

Grazie !!

+1

"che permette per la produttività a salire alle stelle" .... chi è la produttività? Certo, spreco un sacco di tempo a traina l'intarweb, ma senza alcun accesso, non sono in grado di cercare riferimenti critici per linguaggio, libreria o framework. – SingleNegationElimination

+1

Abbiamo interrotto la nostra connessione per circa un'ora oggi, ed ero davvero in un vicolo cieco. Nessun accesso al sito del cliente per un aggiornamento e nessun accesso a qualsiasi materiale di riferimento. Se stai scoprendo che sei distratto da un facile accesso a Internet troppo, prova a suddividere le tue attività in sotto-attività più piccole. Praticamente usa il metodo "Getting Things Done" di David Allen. Se hai una lista di piccoli passi incrementali che guideranno il lavoro in avanti, ti aiuterà davvero con la motivazione. –

+3

Il commento di "consentire la produttività per salire alle stelle" doveva essere uno scherzo ragazzi :) – sundeep

risposta

43

Se si utilizza Windows Vista è possibile utilizzare il built-in firewall per bloccare qualsiasi accesso a internet.

Il codice seguente crea una regola del firewall che blocca tutte le connessioni in uscita su tutte le schede di rete:

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

Quindi rimuovere la regola quando si desidera consentire di nuovo l'accesso a Internet:

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

Questa è una leggera modifica di qualche altro codice che ho usato, quindi non posso dare alcuna garanzia che funzioni. Ancora una volta, tieni presente che avrai bisogno di Windows Vista (o versioni successive) e privilegi amministrativi per farlo funzionare.

Collegamento alla documentazione firewall API.

+7

Per aggiungere FirewallAPI.dll, è necessario sfogliare in c : \ windows \ system32 – Gyuri

+0

Alcuni errori che indicano firewallPolicy.Rules come readony ... impossibile aggiungere le regole – KoolKabin

4

Esistono in realtà una miriade di modi per disattivare (Leggi: interrompi) l'accesso a Internet, ma penso che il più semplice sarebbe quello di trasformare l'interfaccia di rete che ti connette a Internet.

Ecco un link per iniziare: Identifying active network interface

+0

Se si dispone di una connessione di rete locale attiva, potrebbe connettersi a Internet. Non penso che ci sia un modo per bloccare l'accesso a internet senza bloccare tutti gli accessi alla rete (dopotutto Internet è solo un insieme di reti). – Richard

+0

In realtà di solito puoi trovare l'interfaccia che ti connette a Internet guardando la tabella di routing. La route predefinita (0.0.0.0) punta quasi sempre all'interfaccia che si connette a Internet (direi che il 95% delle configurazioni sono configurate in questo modo) – HiredMind

2

Questo è quello che sto attualmente in uso (la mia idea, non un'API):

System.Diagnostics;  

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

Disconnetti da internet:InternetConnection("release");
Connettersi a internet:InternetConnection("renew");

scollegamento sarà solo rimuovere l'accesso a Internet (verrà visualizzata un'icona di attenzione nell'icona Wi-Fi). La connessione potrebbe richiedere cinque o più secondi.

Fuori tema:
In ogni caso si potrebbe desiderare di controllare se si è connessi o meno (quando si utilizza il codice di cui sopra), è meglio che suggerisco questo:

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

Ecco un programma di esempio che lo fa utilizzando oggetti di gestione WMI.

Nell'esempio, sto prendendo di mira il mio adattatore wireless cercando gli adattatori di rete che hanno "Wireless" nel loro nome. È possibile capire una sottostringa che identifica il nome dell'adattatore a cui si sta mirando (è possibile ottenere i nomi eseguendo ipconfig /all da una riga di comando). Non passare una sottostringa causerebbe che questo passasse attraverso tutti gli adattatori, il che è piuttosto grave. Dovrai aggiungere un riferimento a System.Management al tuo progetto.

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

Aggiungi questa dll di riferimento "FirewallAPI.dll" lo troverai in system32. questo set di codice bloccherà tutte le connessioni in uscita per il tuo sistema. –

Problemi correlati