User ID:
Password:
Remember Me:
Forgot Password?
Not a member?
Click here for more information and to register.

    How To Change Network Interface Card (NIC) Settings Programmatically



    by Stanley Fong


    Why?

    This comes about when I have to use my notebook outside my office where a hardwired LAN is available. I have 2 work locations where 2 LAN's are connected via a leased line. Changing my NIC settings was easy because with Windows XP you don't need to reboot and in my case I only have to change one digit at the IP address. This job could be tedious at my client's office with a completely different LAN setup.

    A NIC can only have one set of settings; if you can afford few NIC's for your notebook then you can skip this article.

    How?

    Being lazy I didn't want to enter IP address, gateway, WINS, etc. every time I changed location, therefore I scoured the Internet for a solution. I love the Internet. I usually find what I want and learn something along the way.

    Methods

    A. MCSEworld by Daniel Petri

    Some little tricks are available at MCSEworld by Daniel Petri, see http://www.petri.co.il. The basic trick is to use netsh.exe to dump your current setting to a text or a data file. This can be done by typing below:

    Netsh interface dump > text.txt
    

    The netsh scripting tool allows you to import the setting by "executing" a text or data file. To do the reverse, just type below

    Netsh exec text.txt
    

    The trouble of course is all these have to be done manually at command prompt within a DOS window. At first I did try this, to my surprise it didn't work and all I got is error message like below

    'register' is not a valid argument for this command.
    The syntax supplied for this command is not valid. Check help for the correct syntax.
    
    Usage: add dns [name=]<string. [addr=]<IP address> [[index=]<integer]
    
    Parameters:.........
    .
    .
    .
    .
    
    Dhcp is already enabled on this interface
    

    I have not copied everything I saw but you'll see it's not that simple after all. The point to note the last line "Dhcp is already enabled on this interface", I'll explain this later in the article.

    Netsh.exe is a command line scripting tool available on Windows 2000, XP and Windows server 2003. If you type netsh in Windows Help you'll get to know something basic about it.

    B. The Code Project - SwitchNetConfig by Omar Al Zabir

    This is a good one, see it at http://www.codeproject.com/search.aspx?q=SwitchNetConfig&sbo=kw

    This little utility is written in C# using functionalities available from WMI (Windows Management Instrumentation), again another powerful scripting tool for network administrators.

    I tried it, didn't like it 100% because I can't tweak the code to suit my taste. I don't use C# to earn a living just as simple as that. It surely should work fine.

    C. IPetC

    This is a little utility which is good for simple settings. You'll have to pay for it if you like it after trial for 28 days, see http://www.ipetc.com

    It looks like this:

    IPetC - Screen Capture
    Figure 1: IPetC - Screen Capture

    IPetC - Profile Configuration
    Figure 2: IPetC - Profile Configuration

    As you can see from screen shots above you could only set simple things only. This is handy enough for normal users.

    D. BATCH file

    I found the batch file solution in http://www.experts-exchange.com

    Someone asked a question similar to mine and expert "sirbounty" offered two solutions. The first is to use batch file to execute the required netsh commend with parameter fed to it. The second is to use VBScript to run from a command prompt via cscript. Again for the second solution WMI objects will be called.

    I liked the first solution. You can either have a simple batch file containing below

    @netsh int ip set addr local static 62.131.44.88 255.0.0.0 62.1.1.1
    

    or a batch file containing details of few locations you normally go:

    
    -------ConfigIP.bat----------------------------
    @echo off
    ::Run with
    if [%1]==[] goto error
    goto %1
    :work
    netsh int ip set addr local static 62.131.44.88 255.0.0.0 62.1.1.1
    goto :eof
    :school
    netsh int ip set addr local static 10.0.0.26 255.0.0.0 10.0.0.1
    goto :eof
    :home
    netsh int ip set addr local static 192.168.1.104 255.255.255.0 192.168.1.1
    goto :eof
    :error
    cls
    Echo. Valid parameters are Work, School, Home
    Echo. Example: ConfigIP Work
    

    My Solution

    I eventually decided on a combination of a few of the methods above. I want a batch file to be able to achieve:

    • Interactive with user, i.e. I don't need to remember what parameter to be fed after the batch file. This will require user input after batch file is executed.
    • Read from text files with parameters. With this I only need to change details in text file to fine tune NIC setting.
    • Be able to tweak all settings of the NIC, i.e. not just IP, subnet mask and gateways.
    • Leave setting of wireless LAN alone as you don't normally set it.

    Below is my batch file

    @echo off
    title Contribute $10 for every use please - Stanley Fong August 2004
    setlocal
    set OK=N
    :again
    	set /p choice=Please enter 1[Kowloon Bay], 2[Tai Po], 3[Ebara] or END ??
    	if /i [%choice%]==[END] endlocal&goto end
    	if [%choice%]==[] goto again
    	if [%choice%]==[1] goto 1
    	if [%choice%]==[2] goto 2
    	if [%choice%]==[3] goto 3
    	set /p xxx=wrong entry, press any key to exit.  
    	endlocal
    	goto end
    :1
    	echo NIC setting for Kowloon Bay being configured.....
    	@netsh exec kb.txt
    	set /p see=IP changed successfully for Kowloon Bay setting [9]see new setting [Enter]exit...
    	if [%see%]==[9] goto show
    	echo OK you don't want to see new setting, program ends
    	goto end
    :2
    	echo NIC setting for Tai Po being configured.....
    	@netsh exec tp.txt
    	set /p see=IP changed successfully for Tai Po setting [9]see new setting [Enter]exit...
    	if [%see%]==[9] goto show
    	echo OK you don't want to see new setting, program ends
    	goto end
    :3
    	echo NIC setting for Ebara Office being configured.....
    	@netsh exec ebara.txt
    	set /p see=IP changed successfully for Ebara office setting [9]see new setting [Enter]exit...
    	if [%see%]==[9] goto show
    	echo OK you don't want to see new setting, program ends
    	goto end
    :show
    @netsh int ip show config
    :end
    

    With the "/p" switch of the "SET" command I can get user input of the location. You don't have to remember what to enter, just enter a number of your choice. At the end when it's successfully executed you could see your NIC setting. This batch file will read text files containing NIC settings which must be in the same directory with the batch file.

    Why Method "A" Above Didn't Work

    If you follow the example in (A) above to dump your NIC setting to a text file named "text.txt" and edit "text.txt" with notepad you'll see:

    
    #========================
    # Interface configuration
    #========================
    pushd interface
    
    reset all
    
    popd
    # End of interface configuration
    
    #========================
    # Interface configuration
    #========================
    pushd interface ipv6
    
    uninstall
    
    popd
    # End of interface configuration
    
    # ----------------------------------
    # ISATAP Configuration
    # ----------------------------------
    pushd interface ipv6 isatap
    
    popd
    # End of ISATAP configuration
    
    # ----------------------------------
    # 6to4 Configuration
    # ----------------------------------
    pushd interface ipv6 6to4
    
    reset
    
    popd
    # End of 6to4 configuration
    
    #========================
    # Port Proxy configuration
    #========================
    pushd interface portproxy
    
    reset
    
    popd
    # End of Port Proxy configuration
    
    # ---------------------------------- 
    # Interface IP Configuration         
    # ---------------------------------- 
    pushd interface ip
    
    # Interface IP Configuration for "Local Area Connection"
    
    set address name="Local Area Connection" source=static addr=192.168.4.49 mask=255.255.255.0
    set address name="Local Area Connection" gateway=192.168.4.1 gwmetric=0
    add address name="Local Area Connection" gateway=192.168.32.1 gwmetric=0
    set dns name="Local Area Connection" source=static addr=192.168.1.218 register=PRIMARY
    set wins name="Local Area Connection" source=static addr=192.168.11.21
    add wins name="Local Area Connection" addr=192.168.13.21
    
    # Interface IP Configuration for "Wireless Network Connection"
    
    set address name="Wireless Network Connection" source=dhcp 
    set address name="Wireless Network Connection" gateway=10.0.1.1 gwmetric=0
    set dns name="Wireless Network Connection" source=dhcp register=PRIMARY
    set wins name="Wireless Network Connection" source=dhcp
    
    popd
    # End of interface IP configuration
    

    The above is your current NIC setting which includes something that you don't normally require to set such as ISATAP configuration and your wireless NIC. In fact this file contains a set of commands which will configure your NIC using netsh.exe, i.e. when you do the reverse by "executing" it using netsh.

    What you need is a bare minimum text file like below (line number added)

    1	# ---------------------------------- 
    2	# Interface IP Configuration         
    3	# ---------------------------------- 
    4	pushd interface ip
    
    
    5	# Interface IP Configuration for "Local Area Connection"
    
    6	set address name="Local Area Connection" source=static addr=192.168.32.49 mask=255.255.255.0
    7	set address name="Local Area Connection" gateway=192.168.4.1 gwmetric=0
    8	add address name="Local Area Connection" gateway=192.168.32.1 gwmetric=0
    9	set dns name="Local Area Connection" source=static addr=202.77.0.2 register=primary
    10	add dns name="Local Area Connection" addr=192.168.1.218 index=1
    11	add dns name="Local Area Connection" addr=202.77.0.1 index=2
    12	set wins name="Local Area Connection" source=static addr=192.168.11.21
    13	add wins name="Local Area Connection" addr=192.168.13.21
    
    14	# Interface IP Configuration for "Wireless Network Connection"
    
    15	# normally wireless LAN is not required to be set again
    
    16	# set address name="Wireless Network Connection" source=dhcp 
    17	# set address name="Wireless Network Connection" gateway=10.0.1.1 gwmetric=0
    18	# set dns name="Wireless Network Connection" source=dhcp register=primary
    19	# set wins name="Wireless Network Connection" source=dhcp
    
    
    20	popd
    21	# End of interface IP configuration
    

    Note "#" has remarked command lines which will be ignored by netsh but will help you next time when you want to put them back. This will get rid of the message "Dhcp is already enabled on this interface". This will also speed up execution of the text file.

    The funny thing is that "executing" the text file above (bare minimum) will get exactly the same setting at your NIC as in the long listing of the dumped "text.txt" above. Only Microsoft can explain why this happened. After few trials I just know how to put it right. The critical part is at line 9, 10 and 11 above.

    9	set dns name="Local Area Connection" source=static addr=202.77.0.2 register=primary
    10	add dns name="Local Area Connection" addr=192.168.1.218 index=1
    11	add dns name="Local Area Connection" addr=202.77.0.1 index=2
    
    

    From the "text.txt" listing, it has one line only

    set dns name="Local Area Connection" source=static addr=192.168.1.218 register=PRIMARY
    

    If you look up your NIC settings the normal way you'll see

    TCP/IP - WINS
    Figure 3: TCP/IP - General

    TCP/IP - DNS
    Figure 4: TCP/IP - DNS

    TCP/IP - Advanced
    Figure 5: TCP/IP - WINS

     TCP/IP - General
    Figure 6: TCP/IP - Advanced

    To do the setting right and if the DNS server addresses are really critical in your case you have to play around with the "register=primary" and "index=?" in the "SET" and "ADD" command lines respectively. You'll have to do few trials to get it right. Note you can't use "register=primary" in the "ADD" command. Microsoft has acknowledged this as a problem, see http://support.microsoft.com/default.aspx?scid=kb;en-us;818835 This is why Method A above didn't work.

    Dumping Your Settings To Text Files

    When finding out why text file dumped didn't work, it was discovered that the "dump" command is available at different context in the netsh scripting tool therefore you must be careful when using the dumped text file to reload your settings. You can use "dump" within the following context of netsh

    
    Netsh interface ip
    Netsh interface ipv6
    Netsh interface portproxy
    Netsh ras ip
    Netsh ras ipx
    Netsh ras aaaa
    Netsh ras appletalk
    Netsh ras appletalk
    Netsh routing ip
    Netsh routing ipx
    Netsh routing ipx netbios
    Netsh routing ipx rip
    Netsh routing ipx sap
    Netsh bridge
    Netsh diag
    Netsh firewall
    

    Give it a try you'll see the deeper you go in the context the more specific setting you'll see at the console by running "dump" at the prompt. Therefore it's safer to use bare minimum settings in a text file if you don't really want to mess around with other settings. I have tried using "exec" to reload text files dumped from the context of "netsh", "netsh interface" and "netsh interface ip" all resulted in error caused by the "register" switch.

    It's fun after all, for more information about netsh visit Microsoft sites at:


    Webmaster's Note: While this article isn't ASP-related and is therefore somewhat off topic for the site, I figured that enough of our readers are probably mobile professionals to warrant us publishing it anyway. The main reason I finally decided to publish this article is because I used to be in this very situation. Our office used to have static IPs and my home network was set up to use all DHCP private IPs. Continually swapping network settings was starting to give me a real headache until I went looking for a solution and found out about netsh. I then whipped up the following pair of batch files to swap settings back and forth. Hopefully the information above (or even the simple scripts below) will help make your network hopping easier.

    office.bat

    @Echo On
    rem
    rem Set Up Network:
    rem
    netsh interface ip set address "Local Area Connection" static aaa.bbb.166.230 255.255.255.240 aaa.bbb.166.225 1
    netsh interface ip set dns "Local Area Connection" static aaa.bbb.166.226
    netsh interface ip add dns "Local Area Connection" xxx.yyy.16.83
    netsh interface ip add dns "Local Area Connection" xxx.yyy.17.83
    
    rem
    rem Map Drives:
    rem
    net use i: \\server1\Installs /persistent:yes
    net use l: \\server1\Clients
    net use t: \\server1\Temp
    net use z: \\server2\Backup
    

    home.bat

    @Echo On
    rem
    rem Set Up Network:
    rem
    netsh interface ip set address "Local Area Connection" dhcp
    netsh interface ip set dns "Local Area Connection" dhcp
    
    rem
    rem Map Drives:
    rem
    net use i: /delete
    net use l: /delete
    net use t: /delete
    net use z: /delete
    

    Note: IPs and server names have been changed to protect the guilty!

    Keywords: NIC, TCP, NETWORK INTERFACE CARD,

    About the Author

    Articles originally posted on ASP101.com


    IT Offers


    Top Authors