5,667,575 members and growing! (15,400 online)
Email Password   helpLost your password?
Languages » C# » Applications     Intermediate License: The Code Project Open License (CPOL)

SwitchNetConfig - Laptop users, quickly switch network and proxy configuration in different places

By Omar Al Zabir

A handy utility for laptop users which stores network and proxy configuration as profiles and apply a profile very quickly whenever laptop goes to a different network
C#, Windows, .NET 1.1, .NETVisual Studio, VS.NET2003, Dev

Posted: 6 May 2004
Updated: 6 May 2004
Views: 135,081
Bookmarked: 102 times
Announcements
Loading...



Search    
Advanced Search
Sitemap
47 votes for this Article.
Popularity: 7.32 Rating: 4.38 out of 5
2 votes, 4.3%
1
0 votes, 0.0%
2
2 votes, 4.3%
3
7 votes, 14.9%
4
36 votes, 76.6%
5

Introduction

This is a tiny utility which stores multiple network and proxy configuration as profiles. You can apply a profile to set specific network setting and proxy from simple shortcuts.

Background

If you have a laptop, when you go to different places, you have to change Network configuration and browser proxy. I have to go to 4 different places everyday with my laptop; my university, my offices and my home. Everywhere I have to change my IP setting and IE Proxy. I could write a WMI Script to do all of them. Unfortunately, for some reason WMI is not working from VB Script in my laptop but somehow it is working from .NET. So, I have made a handy utility which I can use to store configuration profiles for different places and apply them very quickly just by pressing one key and a ENTER at system startup. This program automatically sets IP, Subnet, Gateway and DNS for my LAN card and also changes the IE Proxy setting.

Using the code

You can setup in 3 easy steps.

  • 1. Click New and enter a profile name.
  • 2. Set IP configuration
  • 3. Set IE Proxy configuration

It’s even easier to use:

  • 1. Press the first letter of your profile. For example, “h” for Home.
  • 2. Press ENTER and wait as it applies the profile.
  • 3. Press ESC to quit.

Points of Interest

It’s a very simple Winforms application written in C#. The key technologies are:

  • 1. WMI
  • 2. IE Registry tweaking
  • 3. XML Serialization

WMI

Windows Management Intrumentation (WMI) helps you work with Network configuration. For example, the following code retrieves Network Setting for a given Network Card.

/// <summary>

/// Returns the network card configuration of the specified NIC

/// </summary>

/// <PARAM name="nicName">Name of the NIC</PARAM>

/// <PARAM name="ipAdresses">Array of IP</PARAM>

/// <PARAM name="subnets">Array of subnet masks</PARAM>

/// <PARAM name="gateways">Array of gateways</PARAM>

/// <PARAM name="dnses">Array of DNS IP</PARAM>

public static void GetIP( string nicName, out string [] ipAdresses, 
  out string [] subnets, out string [] gateways, out string [] dnses )
{
  ipAdresses = null;
  subnets = null;
  gateways = null;
  dnses = null;

  ManagementClass mc = new ManagementClass(
    "Win32_NetworkAdapterConfiguration");
  ManagementObjectCollection moc = mc.GetInstances();

  foreach(ManagementObject mo in moc)
  {
    // Make sure this is a IP enabled device. 

    // Not something like memory card or VM Ware

    if( mo["ipEnabled"] as bool )
    {
      if( mo["Caption"].Equals( nicName ) )
      {
        ipAdresses = (string[]) mo["IPAddress"];
        subnets = (string[]) mo["IPSubnet"];
        gateways = (string[]) mo["DefaultIPGateway"];
        dnses = (string[]) mo["DNSServerSearchOrder"];

        break;
      }
    }
  }
}

“Win32_NetworkAdapterConfiguration” gives you the collection of network adapters installed. Be careful, all the entries in this list may not be your LAN card.

Similarly you can set Network configuration just by a couple of lines.

/// <summary>

/// Set IP for the specified network card name

/// </summary>

/// <PARAM name="nicName">Caption of the network card</PARAM>

/// <PARAM name="IpAddresses">Comma delimited string 

///           containing one or more IP</PARAM>

/// <PARAM name="SubnetMask">Subnet mask</PARAM>

/// <PARAM name="Gateway">Gateway IP</PARAM>

/// <PARAM name="DnsSearchOrder">Comma delimited DNS IP</PARAM>

public static void SetIP( string nicName, string IpAddresses, 
  string SubnetMask, string Gateway, string DnsSearchOrder)
{
  ManagementClass mc = new ManagementClass(
    "Win32_NetworkAdapterConfiguration");
  ManagementObjectCollection moc = mc.GetInstances();

  foreach(ManagementObject mo in moc)
  {
    // Make sure this is a IP enabled device. 

    // Not something like memory card or VM Ware

    if( mo["IPEnabled"] as bool )
    {
      if( mo["Caption"].Equals( nicName ) )
      {

        ManagementBaseObject newIP = 
          mo.GetMethodParameters( "EnableStatic" );
        ManagementBaseObject newGate = 
          mo.GetMethodParameters( "SetGateways" );
        ManagementBaseObject newDNS = 
          mo.GetMethodParameters( "SetDNSServerSearchOrder" );
            
        newGate[ "DefaultIPGateway" ] = new string[] { Gateway };
        newGate[ "GatewayCostMetric" ] = new int[] { 1 };

        newIP[ "IPAddress" ] = IpAddresses.Split( ',' );
        newIP[ "SubnetMask" ] = new string[] { SubnetMask };

        newDNS[ "DNSServerSearchOrder" ] = DnsSearchOrder.Split(',');

        ManagementBaseObject setIP = mo.InvokeMethod( 
          "EnableStatic", newIP, null);
        ManagementBaseObject setGateways = mo.InvokeMethod( 
          "SetGateways", newGate, null);
        ManagementBaseObject setDNS = mo.InvokeMethod( 
          "SetDNSServerSearchOrder", newDNS, null);

        break;
      }
    }
  }
}

Internet Explorer Proxy

Changing Internet Explorer Proxy setting is a tricky job. There are 3 registry keys that you need to handle:

CURRENT_USER\ Software\Microsoft\Windows\CurrentVersion\Internet Settings

  • ProxyServer – string – Name of proxy server
  • ProxyEnable – integer – 1 for enabled, 0 for disabled
  • ProxyOverride – string – a list of hosts that you need to directly access without proxy

XML Serialization

XML Serialization makes it very easy to persist object graph in human readable form. For example, this is the XML that the program generates:

<?xml version="1.0"?>
<ConfigWrapper xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Profiles>
    <anyType xsi:type="Profile">
      <Name>Home</Name>
      <NICProfiles>
        <anyType xsi:type="NICProfile">
          <Name>[00000001] Intel(R) PRO/100 
             VE Network Connection</Name>
          <IP>192.168.2.43</IP>
          <Subnet>255.255.255.0</Subnet>
          <Gateway>192.168.2.1</Gateway>
          <DNS>202.141.190.2,202.141.190.3</DNS>
        </anyType>
      </NICProfiles>
      <IEProfile>
        <UseProxy>true</UseProxy>
        <ProxyName>192.168.2.1:3128</ProxyName>
        <BypassLocal>true</BypassLocal>
        <BypassAddresses />
      </IEProfile>
    </anyType>

It makes it very easy to modify the file manually. You can save an entire object graph just by writing 3 lines of code:

// Use XML Serializer to serialize the content of the specified array list

XmlSerializer serializer = new XmlSerializer( typeof( ConfigWrapper ) );
// open the profile file

StreamWriter writer = new StreamWriter( PROFILE_FILE_NAME, false );        
// Serialize the array list to the file

serializer.Serialize( writer.BaseStream, wrapper );

History

  • Ver 1.0 - Store multiple profiles, multiple NIC setting, IE Proxy
  • (Planning) Ver 2.0 - Execute batch file before and after profile setting

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Omar Al Zabir


I: Co-founder and CTO of www.pageflakes.com and Visual C# MVP.

My Blog: http://msmvps.com/blogs/omar/
My Specialization: Web 2.0 Rich AJAX Applications.
My Book: Building a Web 2.0 portal using ASP.NET 3.5. Also on Amazon
My Site: www.oazabir.com
My Email: OmarALZabir at gmail dot com
My Interest: Travel, Performance and Scalability Challenges.

My Projects:

Open Source Web 2.0 AJAX Portal
Smart UML - Freehand UML Designer
RSS Aggregator both Outlook and Standalone
Store Front in JSP but ASP.NET style

My Articles:

10 ASP.NET Performance and Scalability Secrets
ASP.NET AJAX under the hood secrets
UFrame: goodness of UpdatePanel and IFRAME combined
Fast ASP.NET web page loading
Fast, Scalable, Streaming AJAX Proxy
Using COM safely inside "using" block without requiring interop assembly
Implementing Word Like Automation Model
Distributed Command Pattern
StickOut - .NET 2.0, VSTS, Outlook Addin, MS Word/Excel integration
Deployment made simple with Powershell
Build Google IG like Ajax Start Page in 7 days
Occupation: Chief Technology Officer
Company: Pageflakes Inc
Location: Bangladesh Bangladesh

Other popular C# articles:

Article Top
Sign Up to vote for this article
You must Sign In to use this message board.
FAQ FAQ Noise ToleranceSearch Search Messages 
 Layout  Per page   
 Msgs 1 to 25 of 50 (Total in Forum: 50) (Refresh)FirstPrevNext
GeneralSuggested update - Profile file locationmemberTimothyP21:42 14 Oct '08  
GeneralSwitchNetConfig a super prog - THANKSmemberpisoft11:56 22 May '08  
GeneralAmazingmemberJonathan C Dickinson21:36 13 May '08  
GeneralI guess you have still have lot more things to share..memberjavedahassan10:05 6 Feb '08  
GeneralVista BusinessmemberEdcel Kahayon22:36 23 Jan '08  
GeneralRe: Vista BusinessmemberNordin Rahman23:42 4 Mar '08  
GeneralHello!memberadri68ro19:32 12 Dec '07  
QuestionNOT WORKING WITH VISTAmemberoussamaghanem22:29 21 Oct '07  
AnswerRe: NOT WORKING WITH VISTAmemberTimothyP21:38 14 Oct '08  
AnswerRe: NOT WORKING WITH VISTAmemberOmar Al Zabir21:59 14 Oct '08  
Generalimplementationmembereabidi7712:06 5 Sep '07  
GeneralRe: implementationmemberOmar Al Zabir17:40 5 Sep '07  
GeneralHelpfulmembererwin satrya4:38 20 Aug '07  
QuestionDHCP IP/Static DNSmemberDavid Dreggors17:30 5 Feb '07  
GeneralProblem with multiple IP addressesmemberp0rkskratchin23:59 25 Jan '07  
AnswerRe: Problem with multiple IP addressesmemberChris Tynes20:56 6 Feb '07  
GeneralLittle suggestmemberThomas.Mueller67:32 6 Sep '06  
GeneralConvert this to VB.NETmembermrodriguezc9:00 1 Jun '06  
GeneralApplication Errormemberroundi2:34 21 May '06  
GeneralWonderfulmembertuca.ssa2:07 13 Mar '06  
GeneralSetIP only works for Gatewaymembermystique20007:36 28 Sep '05  
GeneralAlternative network setting causes problemmemberFrank Esser0:50 25 Aug '05  
GeneralVB 6 VersionmemberJeiel Borner9:31 22 Aug '05  
GeneralCould u post a vc6 demo?memberTcpip200523:45 21 Aug '05  
GeneralRe: Could u post a vc6 demo?memberTcpip200523:49 21 Aug '05  

General General    News News    Question Question    Answer Answer