2009-08-07 6 views
24

Ich suche nach Hinweisen zu APIs in C#, die es mir ermöglichen, meine Internetverbindung zu steuern, indem ich die Verbindung ein- und ausschalte.Eine Möglichkeit, das "Internet" in Windows mit C# auszuschalten?

Ich möchte eine kleine Konsolenanwendung schreiben, die mir erlauben, meinen Zugang ein- und ausschalten, um die Produktivität ermöglicht

Dank in die Höhe schnellen :) (etwas in den Prozess sowie das Lernen) !!

+1

"so dass die Produktivität in die Höhe schnellen" .... wer Produktivität? Sicher, ich verschwende viel Zeit damit, die IntarWebs zu trollen, aber ohne Zugang, kann ich keine kritischen Referenzen für Sprache, Bibliothek oder Frameworks nachschlagen. – SingleNegationElimination

+1

Wir hatten unsere Verbindung heute für ungefähr eine Stunde unterbrochen und ich war wirklich in einer Klemme. Kein Zugriff auf die Kundensite für ein Update und kein Zugriff auf Referenzmaterial. Wenn Sie feststellen, dass Sie durch den einfachen Zugang zum Internet zu sehr abgelenkt sind, versuchen Sie, Ihre Aufgaben in kleinere Teilaufgaben aufzuteilen. Verwenden Sie grundsätzlich die Methode "Getting Things Done" von David Allen. Wenn Sie eine Liste kleiner inkrementeller Schritte haben, die die Arbeit voranbringen, hilft es wirklich bei der Motivation. –

+3

Das "Erlauben von Produktivität zu explodieren" Kommentar sollte ein Witz sein Jungs :) – sundeep

Antwort

43

Wenn Sie Windows Vista verwenden Sie die integrierte Firewall verwenden können jeden Internetzugang zu blockieren.

Der folgende Code erstellt eine Firewall-Regel blockiert alle abgehenden Verbindungen auf allen Netzwerkadapter:

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

Dann die Regel entfernen, wenn Sie wieder den Internet-Zugang ermöglichen wollen:

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

Dies ist eine geringfügige Änderung von anderem Code, den ich verwendet habe, so kann ich keine Garantien geben, dass es funktioniert. Vergessen Sie nicht, dass Sie Windows Vista (oder höher) und Administratorrechte benötigen, damit dies funktioniert.

Link zur Dokumentation firewall API.

+7

Um die FirewallAPI.dll hinzuzufügen, müssen Sie nach c suchen : \ windows \ system32 – Gyuri

+0

Einige Fehler, die firewallPolicy.Rules als Readony ... angeben, können die Regeln nicht hinzufügen – KoolKabin

4

Es gibt tatsächlich eine Vielzahl von Möglichkeiten, um Ihren Internet-Zugang abzuschalten (lesen: brechen), aber ich denke, die einfachste wäre, von der Netzwerkschnittstelle zu schalten, die Sie mit dem Internet verbindet.

Hier ist ein Link Sie zu erhalten begonnen: Identifying active network interface

+0

Wenn Sie eine aktive lokale Netzwerkverbindung haben, könnte es Sie mit dem Internet verbinden. Ich glaube nicht, dass es eine Möglichkeit gibt, den Internetzugang zu blockieren, ohne den gesamten Netzwerkzugang zu blockieren (schließlich ist das Internet nur eine Ansammlung von Netzwerken). – Richard

+0

Eigentlich können Sie normalerweise die Schnittstelle finden, die Sie mit dem Internet verbindet, indem Sie auf die Routing-Tabelle schauen. Die Standardroute (0.0.0.0) zeigt fast immer auf die Schnittstelle, die mit dem Internet verbunden ist (ich würde raten, dass 95% der Konfigurationen auf diese Weise eingerichtet sind) – HiredMind

2

Dies ist, was ich bin derzeit mit (meine Idee, nicht ein api):

System.Diagnostics;  

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

Disconnect aus dem Internet:InternetConnection("release");
eine Verbindung zum Internet:InternetConnection("renew");

Disconnecting wird nur Entfernen Sie den Zugriff auf das Internet (es wird ein Warnsymbol im Wifi-Symbol angezeigt). Die Verbindung kann fünf Sekunden oder länger dauern.

Aus Thema:
In allen Fällen finden Sie überprüfen möchten, ob Sie verbunden sind oder nicht (wenn Sie den Code oben verwenden), habe ich dies besser vorschlagen:

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

hier ein ist Beispielprogramm, das es WMI-Verwaltungsobjekte verwendet.

Im Beispiel ziele ich auf meinen drahtlosen Adapter, indem ich nach Netzwerkadaptern suche, die "Wireless" in ihrem Namen haben. Sie könnten einen Teilstring herausfinden, der den Namen des Adapters angibt, auf den Sie zielen (Sie können die Namen erhalten, indem Sie ipconfig /all in einer Befehlszeile ausführen). Das Übergeben einer Teilzeichenfolge würde dazu führen, dass dies durch alle Adapter geht, was ziemlich streng ist. Sie müssen Ihrem Projekt einen Verweis auf System.Management hinzufügen.

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

Fügen Sie diese Referenzdll "FirewallAPI.dll" hinzu Sie finden diese in System32. Dieser Codecode blockiert die gesamte ausgehende Verbindung für Ihr System. –

Verwandte Themen