2009-08-07 7 views
24

Poszukuję wskaźników w interfejsie API w języku C#, które pozwolą mi kontrolować połączenie z Internetem przez włączanie i wyłączanie połączenia.Jakikolwiek sposób, aby wyłączyć "internet off" w systemie Windows przy użyciu C#?

Chcę napisać małą aplikację konsoli, która pozwoli mi zawracać mi dostęp z przerwami, co pozwala na produktywność rakieta :) (jak również uczenie się czegoś w tym procesie)

Dzięki !!

+1

"pozwalające na produktywność rakieta" .... kto produktywność? Oczywiście, tracę mnóstwo czasu na śledzenie intarwebów, ale bez żadnego dostępu, nie jestem w stanie wyszukać krytycznych odniesień do języka, biblioteki lub frameworków. – SingleNegationElimination

+1

Mieliśmy dzisiaj zerwanie połączenia przez około godzinę, a ja naprawdę miałem kłopot. Brak dostępu do witryny klienta w celu aktualizacji i brak dostępu do jakichkolwiek materiałów referencyjnych. Jeśli zauważysz, że jesteś rozproszony przez łatwy dostęp do Internetu za dużo, spróbuj podzielić swoje zadania na mniejsze podzadania. Zasadniczo użyj metody "Getting Things Done" Davida Allena. Jeśli masz listę małych stopniowych kroków, które popchną pracę do przodu, to naprawdę pomaga z motywacją. –

+3

Komentarz "pozwalający na zwiększenie produktywności" miał być żartem :) – sundeep

Odpowiedz

43

Jeśli używasz systemu Windows Vista można użyć wbudowanej zapory blokujące żadnego dostępu do Internetu.

Poniższy kod tworzy reguły zapory, która blokuje wszystkie wychodzące połączenia na wszystkich kartach sieciowych:

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

Następnie usunąć regułę, jeśli chcesz, aby umożliwić dostęp do internetu znowu:

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

Jest to niewielka modyfikacja innego kodu, z którego korzystałem, więc nie mogę zagwarantować, że zadziała. Jeszcze raz pamiętaj, że będziesz potrzebować systemu Windows Vista (lub nowszego) i uprawnień administratora, aby to działało.

Link do dokumentacji firewall API.

+7

Aby dodać FirewallAPI.dll, musisz przejść do c : \ windows \ system32 – Gyuri

+0

Niektóre błędy określające firewallPolicy.Rules jako readony ... nie można dodać reguł. – KoolKabin

4

Istnieje wiele sposobów na wyłączenie (Czytaj: zepsuć) dostępu do Internetu, ale myślę, że najprościej byłoby zmienić interfejs sieciowy, który łączy cię z Internetem.

Oto link, aby zacząć: Identifying active network interface

+0

Jeśli masz aktywne połączenie z siecią lokalną, możesz połączyć się z Internetem. Nie sądzę, że istnieje sposób blokowania dostępu do Internetu bez blokowania dostępu do sieci (w końcu internet to tylko zbiór sieci). – Richard

+0

W rzeczywistości zwykle można znaleźć interfejs, który łączy Cię z Internetem, patrząc na tabelę routingu. Domyślna trasa (0.0.0.0) prawie zawsze wskazuje na interfejs, który łączy się z Internetem (domyślam się, że 95% konfiguracji jest skonfigurowanych w ten sposób). – HiredMind

2

To właśnie Obecnie używam (mój pomysł, a nie API):

System.Diagnostics;  

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

rozłączyć się z internetem:InternetConnection("release");
podłączenia do internetu:InternetConnection("renew");

odłączanie po prostu usunąć dostęp do Internetu (wyświetli ikonę ostrzeżenia na ikonie Wi-Fi). Łączenie może potrwać pięć sekund lub dłużej.

Spośród temacie:
We wszelkich przypadkach może chcesz sprawdzić, czy jesteś podłączony lub nie (w przypadku korzystania powyższy kod), lepiej zasugerować to:

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

Oto przykładowy program, który robi to za pomocą obiektów zarządzania WMI.

W tym przykładzie wybieram moją kartę sieci bezprzewodowej, szukając kart sieciowych z "Wireless" w nazwie. Można znaleźć podłańcuch identyfikujący nazwę adaptera, na który kierujesz cel (możesz uzyskać nazwy, wykonując ipconfig /all w wierszu poleceń). Nie przekazanie podciągu spowoduje, że przejdzie on przez wszystkie adaptery, co jest dość surowe. Będziesz musiał dodać odniesienie do System.Management do swojego projektu.

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

Dodaj tę referencyjną bibliotekę dll "FirewallAPI.dll", którą znajdziesz w systemie32. ten zestaw kodu zablokuje wszystkie połączenia wychodzące w systemie. –

Powiązane problemy