Part 4: Scripting IP Address Allocation on Clients

At the heart of TCP/IP networking is the allocation of IP addresses. If your network uses Dynamic Host Configuration Protocol (DHCP), you are already using a form of automation to manage this critical function.

In the early days of TCP/IP networking, administrators assigned IP addresses manually. As networks grew and became more complex, this became impractical. Early efforts to automate this function, such as Reverse Address Resolution Protocol (RARP) and Bootstrap Protocol (BOOTP), still required considerable manual configuration. DHCP was developed to replace them and extend their functionality into a client/server protocol capable of managing an IP address pool and related client configuration parameters with much less administrative intervention.

Today, on most networks of any size, DHCP is the default way to automate the management of IP address configuration. Even when your network uses DHCP, though, you may still need to use static IP addresses in certain cases, such as exclusions. In addition, some smaller or older networks may use only static IP addresses.

DHCP servers and clients also interact with other TCP/IP components in significant ways. For example, when using DNS dynamic update, DHCP clients and servers update DNS servers with changes in IP addresses to ensure that name resolution remains accurate as IP address leases are released and renewed.

Here, as with most TCP/IP settings, you can manually make changes on a local computer by using the Windows interface. For example, as Figure 9 illustrates, you can configure DHCP settings on the IP Settings tab of the Advanced TCP/IP Settings dialog box.

Figure 9   Configuring DHCP Setting by Using the Windows Interface

Figure 9   Configuring DHCP Setting by Using the Windows Interface

As previously mentioned, you can also use the command-line tool Ipconfig.exe to retrieve DHCP client settings, release and renew leases, and perform other DHCP client tasks. For remote and multiple clients, though, as well as for complex local tasks that risk manual errors, scripting may be a more efficient alternative.

This section discusses how to script the management of IP address allocation by using both DHCP and static addressing. This paper covers only how to configure clients, although in some cases, the changes on clients also require changes on the DHCP servers. Management of DHCP servers is not covered in this paper.

On This Page

Managing DHCP on Clients
Managing Static IP Addresses
Scenario: Allocating IP Addresses on a Subnet
Scenario: Switching Between a Static IP Address and DHCP
Tools for IP Address Allocation on Clients

Managing DHCP on Clients

Although DHCP is already a form of automation, scripting can help you automate the configuration of groups of clients to take advantage of DHCP. Through the properties and methods provided by the WMI class Win32_NetworkAdapterConfiguration, you can enumerate DHCP settings, enable or disable DHCP, and renew or release releases.

Table 9 describes the Win32_NetworkAdapterConfiguration properties that you can use for IP address allocation.

Table 9   Win32_NetworkAdapterConfiguration IP Address Allocation Properties

Property

Type

Description

DefaultIPGateway

String array

Array of IP addresses of default gateways that the computer system uses.

DHCPEnabled

Boolean

If TRUE, the DHCP server automatically assigns an IP address to the computer system when establishing a network connection.

DHCPLeaseExpires

Datetime

Expiration date and time for a leased IP address that was assigned to the computer by the DHCP server.

DHCPLeaseObtained

Datetime

The date and time that the lease was obtained for the IP address assigned to the computer by the DHCP server.

DHCPServer

String

IP address of the DHCP server.

GatewayCostMetric

Uint16

Array of integer cost metric values (ranging from 1 to 9999) to be used in calculating the fastest, most reliable, or least expensive routes. This argument has a one-to-one correspondence with the DefaultIPGateway property.

IPConnectionMetric

(New in Windows XP)

Uint32

Cost of using the configured routes for the IP bound adapter and is the weighted value for those routes in the IP routing table. If there are multiple routes to a destination in the IP routing table, the route with the lowest metric is used. The default value is 1.

IPAddress

String

Array of all of the IP addresses associated with the current network adapter.

IPSubnet

String

Array of all the subnet masks associated with the current network adapter.

All the properties in the previous table are read-only. The types uint16 and uint32 are unsigned integer types that are used by strongly-typed programming languages; VBScript effectively treats them as integers.

Table 10 describes the Win32_NetworkAdapterConfiguration methods that you can use for IP address allocation.

Table 10   Win32_NetworkAdapterConfiguration IP Address Allocation Methods

Method

Parameters

Description

EnableDHCP

None

Enables DHCP for service with this network adapter. DHCP allows IP addresses to be dynamically allocated.

EnableStatic

IPAddress – array of strings

SubnetMask – array of strings

Enables static TCP/IP addressing for the target network adapter. As a result, DHCP for this network adapter is disabled.

ReleaseDHCPLease

None

Releases the IP address bound to a specific DHCP-enabled network adapter.

Caution  If DHCP is enabled on the local computer, this option disables TCP/IP on the specific network adapter. Unless you have an alternate path to the target system, that is, another TCP/IP bound network adapter, all TCP/IP communications will be lost.

ReleaseDHCPLeaseAll

None

Static method. Releases the IP addresses bound to all DHCP-enabled network adapters.

Caution  If DHCP is enabled on the local computer, this option terminates all DHCP TCP/IP connections.

RenewDHCPLease

None

Renews the IP address on specific DHCP-enabled network adapters. The lease for the IP address assigned by a DHCP server has an expiration date that the client must renew if it intends to continue use of the assigned IP address.

RenewDHCPLeaseAll

None

Static method. Renews the IP addresses on all DHCP-enabled network adapters. The lease for the IP address assigned by a DHCP server has an expiration date that the client must renew if it intends to continue use of the assigned IP address.

SetGateways

DefaultIPGateway – array of strings

GatewayCostMetric – unit16

Specifies a list of gateways for routing packets to a subnet that is different from the subnet that the network adapter is connected to. This method only works when the network adapter is in static IP mode.

All the methods in the previous table return a positive integer:

  • 0 indicates successful completion.

  • 1 indicates successful completion with reboot required.

  • Numbers greater than 1 indicate that some problem was encountered and the method could not complete. The WMI SDK lists the meanings of return values for these methods.

Displaying DHCP Client Information

When you are working with a technology like DHCP, the first step in scripting is usually to determine the current configuration of settings relevant to it. This is the approach that is taken in this section and in those that follow.

Win32_NetworkAdapterConfiguration provides per-adapter properties that show whether DHCP is enabled; the IP address of the DHCP server; the date and time when the lease was obtained and when it will expire; and the client IP addresses and subnet masks (network adapters can have more than one of each).

Because WMI returns dates and times in a format that is not designed for easy reading, displaying lease dates and times requires converting the WMI date and time format to a more user-friendly one.

The following script displays IP address allocation settings for a network client by using the following properties of Win32_NetworkAdapterConfiguration: DHCPEnabled, DHCPServer, DHCPLeaseObtained, DHCPLeaseExpires, IPAddress, and IPSubnet. The script displays settings for DHCPServer, DHCPLeaseObtained, and DHCPLeaseExpires only if DHCP is enabled.

Rather than directly displaying the settings with the WSH WScript.Echo method, the script assigns them to a string and displays them after they have been collected. Then, after verifying with an If ... Then clause that DHCPEnabled is True, the script displays the subordinate settings.

Two of the settings displayed by Dhcpsettings.vbs, DHCPLeaseObtained and DHCPLeaseExpires, are returned as a DATETIME value. If you display the raw value, it look likes this:

20021201000230.000000+000

The first four digits represent the year, the next two the month, the next two the day, then hours, minutes, seconds, and so on. You can figure out what it means — although it is not quick and easy to read.

Windows XP and Windows Server 2003 have added a new SWbemDateTime object to the WMI Scripting API. This object makes it easier to parse and convert datetime values if all your clients are running Windows XP and Windows Server 2003.

However, if not all your network hosts are running Windows XP or Windows Server 2003, a more convenient and less complicated solution is to parse datetime values into a readable format by using the string manipulation capabilities of VBScript.

In this script, to convert the datetime value into something more readable, Dhcpsettings calls a function, WMIDateToString(), and passes it the datetime value as a parameter. The function transforms the value with the VBScript built-in Mid() and Left() string functions. It then calls the VBScript CDate() function to cast the variant value (the type of all VBScript variables) as a sub-type Date, and returns the formatted date to the main body of the script.

For more information about the WMI DATETIME format, see "Setting the Time on One Computer by Using WMI" later in this document.

Scripting Steps

Listing 19 displays the DHCP settings for each network adapter configuration on a computer.

  1. Create a variable and assign the name of a computer to it. For the local computer, simply specify "." as the computer name. To run this script remotely, specify the name of an accessible remote computer on your network on which you have administrative privileges. The name can be in the form of either a host name or an IP address.

  2. Use a GetObject call to connect to the WMI namespace root\cimv2 on the specified computer, and set the impersonation level to “impersonate.”

  3. Use the ExecQuery method to query the Win32_NetworkAdapterConfiguration class, filtering the WQL query with “WHERE IPEnabled = True.”

    This returns a collection consisting of all the network adapter configurations on the computer for which IP is enabled.

  4. For each network adapter configuration in the collection, perform the following tasks.

  5. Call the Get method on objWMIService to obtain an object reference to the instance of Win32_NetworkAdapter whose DeviceID property is equal to the Index property of the current instance of Win32_NetworkAdapterConfiguration.

  6. Get the value of the DNSHostName property of Win32_NetworkAdapterConfiguration and assign it to a variable.

  7. Get the value of the NetConnectionID property of Win32_NetworkAdapter and assign it to a variable. If this raises an error, use the Index property of Win32_NetworkAdapterConfiguration instead.

  8. Get the DHCPEnabled property of Win32_NetworkAdapterConfiguration and assign it to a variable.

  9. If the DHCPEnabled property is True, meaning that DHCP is enabled on the current network adapter, get the other properties related to IP address allocation and assign them to variables.

  10. For the DHCPLeaseObtained and DHCPLeaseExpires properties of Win32_NetworkAdapterConfiguration, pass their values as a parameter to the WMIDateToString function. This function converts the DATETIME format returned by these two properties into more readable strings.

  11. Concatenate the variables containing the values of the properties with explanatory labels into a long string and display the string with WScript.Echo.

Listing 19   Dhcpsettings.vbs

  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

On Error Resume Next
 
strComputer = "."
 
Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colNicConfigs = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
 
For Each objNicConfig In colNicConfigs
  strDNSHostName = objNicConfig.DNSHostName
  strIndex = objNicConfig.Index
  strDescription = objNicConfig.Description
  blnDHCPEnabled = objNicConfig.DHCPEnabled
  If blnDHCPEnabled Then
    strDHCPServer = objNicConfig.DHCPServer
    dtmRawLeaseObtainedDate = objNicConfig.DHCPLeaseObtained
    strDHCPLeaseObtained = WMIDateToString(dtmRawLeaseObtainedDate)
    dtmRawLeaseExpiresDate = objNicConfig.DHCPLeaseExpires
    strDHCPLeaseExpires = WMIDateToString(dtmRawLeaseExpiresDate)
  End If
  strDHCPSettings = strDHCPSettings & VbCrLf & VbCrLf & _
   "  Network Adapter " & strIndex & VbCrLf & _
   "    " & strDescription & VbCrLf & VbCrLf & _
   "    DHCP Enabled:        " & blnDHCPEnabled
  If blnDHCPEnabled Then
    strDHCPSettings = strDHCPSettings & VbCrLf & _
     "    DHCP Server:         " & strDHCPServer & VbCrLf & _
     "    DHCP Lease Obtained: " & strDHCPLeaseObtained & VbCrLf & _
     "    DHCP Lease Expires:  " & strDHCPLeaseExpires
  End If
Next
 
WScript.Echo VbCrLf & "DHCP Settings" & VbCrLf & VbCrLf & _
 "Host Name: " & strDNSHostName & strDHCPSettings
 
'******************************************************************************
 
Function WMIDateToString(dtmDate)
 
WMIDateToString = CDate(Mid(dtmDate, 5, 2) & "/" & _
                  Mid(dtmDate, 7, 2) & "/" & _
                  Left(dtmDate, 4) & " " & _
                  Mid(dtmDate, 9, 2) & ":" & _
                  Mid(dtmDate, 11, 2) & ":" & _
                  Mid(dtmDate, 13, 2))
 
End Function

When you use Cscript.exe to run this script, output similar to the following is displayed in the command window:

C:\scripts>dhcpsettings.vbs

 

DHCP Settings

 

Host Name: client1

 

  Network Adapter 1

    3Com 3C920 Integrated Fast Ethernet Controller (3C905C-TX Compatible) - Pack

et Scheduler Miniport

 

    DHCP Enabled:        True

    DHCP Server:         192.168.0.1

    DHCP Lease Obtained: 5/13/2004 6:34:24 PM

    DHCP Lease Expires:  5/23/2004 9:34:24 PM

Enabling DHCP on a Client

Automating the configuration of DHCP on clients may be worthwhile when a remote client or group of remote clients must be converted from using a static IP address to obtaining the IP address automatically. Depending on how the DHCP and DNS servers are configured, enabling DHCP may also enable the client to obtain the DNS server and default gateway addresses from the DHCP server.

The following script shows how to use EnableDHCP, which is a method of Win32_NetworkAdapterConfiguration that enables DHCP for service on the network adapter of a client. The method takes no parameters. For a client with more than one network adapter, such as a dual-homed computer, you can adapt the script to enable only a certain adapter.

Scripting Steps

caution.gif  Caution
This script may make changes in your computer configuration. Run it only on a test computer and note the settings involved before running it.

Listing 20 enables DHCP on each network adapter configuration on a computer.

  1. Use a GetObject call to connect to the WMI namespace root\cimv2 on the specified computer, and set the impersonation level to “impersonate.”

  2. Use the ExecQuery method to query the Win32_NetworkAdapterConfiguration class, filtering the WQL query with “WHERE IPEnabled = True.”

    This returns a collection consisting of all the network adapter configurations on the computer for which IP is enabled.

  3. Perform the following tasks for each network adapter configuration in the collection.

  4. Display the index number and description of the network adapter.

  5. Check whether DHCP is already enabled.

  6. If DHCP is not enabled, call the EnableDHCP method of Win32_NetworkAdapterConfiguration.

  7. If the EnableDHCP method returns:

    • A value of 0, display a message indicating success.

    • Any value other than 0, display a message indicating failure.

  8. If DHCP is already enabled, display a message to that effect with the IP address of the DHCP server.

    Listing 20   Dhcp-enable.vbs

      
    
    
    

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26


    On Error Resume Next
     
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:" _
      & "{impersonationLevel=impersonate}!\" & strComputer & "\root\cimv2")
    Set colNicConfigs = objWMIService.ExecQuery _
      ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
     
    For Each objNicConfig In colNicConfigs
        WScript.Echo VbCrLf & "  Network Adapter " & objNicConfig.Index & _
          VbCrLf & "    " & objNicConfig.Description & VbCrLf
        If Not objNicConfig.DHCPEnabled Then
            WScript.Echo "    Enabling DHCP ..."
            intReturn = objNicConfig.EnableDHCP
            If intReturn = 0 Then
                strSuccess = "    DHCP enabled."
            Else
                strSuccess = "    Unable to enable DHCP."
            End If
            WScript.Echo VbCrLf & strSuccess
     
        Else
            WScript.Echo "    DHCP already enabled" & VbCrLf & _
              "    DHCP Server: " & objNicConfig.DHCPServer
        End If
    Next

    When you use Cscript.exe to run this script, output similar to the following is displayed in the command window:

    C:\scripts\netcli>dhcp-enable.vbs

     

      Network Adapter 1

        3Com 3C920 Integrated Fast Ethernet Controller (3C905C-TX Compatible) - Pack

    et Scheduler Miniport

     

        Enabling DHCP ...

     

        DHCP enabled.

    Managing DHCP Leases

    DHCP usually allocates IP addresses only for specified time periods. This temporary address allocation is called a lease. Administrators of a DHCP server can configure the default term of a lease, contingent on factors like how often you add or remove network clients, or the number of addresses and clients on a subnet.

    DHCP clients and servers are designed to automatically renegotiate leases before they expire. You can also release or renew leases manually or programmatically. For example, the command-line tool Ipconfig.exe provides parameters for that purpose.

    Win32_NetworkAdapterConfiguration provides four per-adapter methods that enable you to manage DHCP leases on its instances: ReleaseDHCPLease, ReleaseDHCPLeaseAll, RenewDHCPLease and RenewDHCPLeaseAll. You can also release or renew all leases simply by iterating through the collection of network adapter configurations and using ReleaseDHCPLease or RenewDHCPLease on each.

    Releasing DHCP Leases

    Releasing a DHCP lease for a network adapter disconnects that adapter from the network and releases the IP address for assignment to other hosts. The ipconfig.exe /release command performs this task on all network adapters or on a specified adapter.

    One situation in which you might want to release a DHCP lease on a client is when reserving a scope (a range of IP addresses) on a DHCP server for permanent lease assignment. Some of the addresses being reserved in the scope may already be in use by existing clients that will not be included in the scope. Yet adding an IP address to a scope on the DHCP server does not automatically release the address on the client that currently holds it.

    The script below illustrates one way to handle this problem. It iterates through the collection of network adapter configurations and uses the ReleaseDHCPLease method to release the lease of each. You can easily adapt this script to release the lease on a remote client by changing the following line:

    strComputer = "."
    

    In place of the local computer ("."), substitute the IP address that needs to be freed for the reservation; for example:

    strComputer = "192.168.0.135"
    

    As with all remote WMI operations, the user must have appropriate administrative privileges on the remote computer.

    Scripting Steps

    caution.gif  Caution
    This script may make changes in your computer configuration. Run it only on a test computer and note the settings involved before running it.

    Listing 21 first displays DHCP settings for each network adapter. It then checks each network adapter to see whether DHCP is enabled and if it is, releases the DHCP lease.

    1. Use a GetObject call to connect to the WMI namespace root\cimv2 on the specified computer, and set the impersonation level to “impersonate.”

    2. Use the ExecQuery method to query the Win32_NetworkAdapterConfiguration class, filtering the WQL query with “WHERE IPEnabled = True.”

      This returns a collection that consists of all the network adapter configurations for the computer on which IP is enabled.

    3. Display the label "Settings before releasing lease."

    4. Perform the following steps for each network adapter configuration in the collection.

    5. Display the index number, description, and whether DHCP is enabled for each adapter.

    6. If DHCP is enabled, retrieve the dates the DHCP lease was obtained and will expire and convert them to a readable format by calling the WMIDateToString function.

      Display the IP address of the DHCP server and the lease dates.

    7. Call the ReleaseDHCPLease method of Win32_NetworkAdapterConfiguration, then wait 5 seconds for the release process to finish.

      important.gif  Important
      If a client is using DHCP to obtain an IP address, releasing the lease may disconnect the client from the network.

    8. If the ReleaseDHCPLease method returns:

      • A value of 0, display a message that the lease has been released.

      • A value of 1, display a message that the lease has been released and that the computer must be rebooted.

      • A value greater than 1, display a message that the lease cannot be released.

    9. Requery the Win32_NetworkAdapterConfiguration class, filtering again for only IP-enabled adapters. This requery is necessary because each query returns a snapshot of the settings that it found at the moment the query ran and does not automatically update the query if settings subsequently change.

    10. Redisplay the same DHCP-related settings as were previously displayed.

    11. The WMIDateToString function takes a value in WMI DATETIME format and converts it into a string expressing the date and time in a more readable format.

    Listing 21   Dhcp-releaselease.vbs

      
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    

    On Error Resume Next
     
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:" _
      & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set colNicConfigs = objWMIService.ExecQuery _
      ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
     
    WScript.Echo VbCrLf & "Settings before releasing lease"
     
    For Each objNicConfig In colNicConfigs
     
        blnDHCPEnabled = objNicConfig.DHCPEnabled
     
        WScript.Echo VbCrLf & _
          "  Network Adapter " & objNicConfig.Index & VbCrLf & _
          "    " & objNicConfig.Description & VbCrLf & VbCrLf & _
          "    DHCP Enabled:        " & blnDHCPEnabled
     
        If blnDHCPEnabled Then
     
            dtmLeaseObtainedDate = objNicConfig.DHCPLeaseObtained
            strDHCPLeaseObtained = WMIDateToString(dtmLeaseObtainedDate)
            dtmLeaseExpiresDate = objNicConfig.DHCPLeaseExpires
            strDHCPLeaseExpires = WMIDateToString(dtmLeaseExpiresDate)
     
            WScript.Echo "    DHCP Server:         " & objNicConfig.DHCPServer & _
              VbCrLf & "    DHCP Lease Obtained: " & strDHCPLeaseObtained & _
              VbCrLf & "    DHCP Lease Expires:  " & strDHCPLeaseExpires
     
            intReleaseReturn = objNicConfig.ReleaseDHCPLease
            WScript.Sleep 5000
     
            If (intReleaseReturn = 0 Or intReleaseReturn = 1) Then
                strSuccess = "    DHCP lease released."
                If intReleaseReturn = 1 Then
                    strSuccess = strSuccess & " Must reboot machine."
                End If
            Else
                strSuccess = "    Unable to release DHCP lease."
            End If
     
            WScript.Echo VbCrLf & strSuccess
     
        End If
     
    Next
     
    Set colNicConfigs = objWMIService.ExecQuery _
      ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
     
    WScript.Echo VbCrLf & "Settings after releasing lease"
     
    For Each objNicConfig In colNicConfigs
     
        blnDHCPEnabled = objNicConfig.DHCPEnabled
     
        WScript.Echo VbCrLf & _
          "  Network Adapter " & objNicConfig.Index & VbCrLf & _
          "    " & objNicConfig.Description & VbCrLf & VbCrLf & _
          "    DHCP Enabled:        " & blnDHCPEnabled
     
        If blnDHCPEnabled Then
     
            dtmLeaseObtainedDate = objNicConfig.DHCPLeaseObtained
            strDHCPLeaseObtained = WMIDateToString(dtmLeaseObtainedDate)
            dtmLeaseExpiresDate = objNicConfig.DHCPLeaseExpires
            strDHCPLeaseExpires = WMIDateToString(dtmLeaseExpiresDate)
     
            WScript.Echo "    DHCP Server:         " & objNicConfig.DHCPServer & _
              VbCrLf & "    DHCP Lease Obtained: " & strDHCPLeaseObtained & _
              VbCrLf & "    DHCP Lease Expires:  " & strDHCPLeaseExpires
     
        End If
     
    Next
     
    '******************************************************************************
    ' Function: WMIDateToString(dtmDate)
    ' Converts WMI date to string.
    '******************************************************************************
     
    Function WMIDateToString(dtmDate)
        WMIDateToString = CDate(Mid(dtmDate, 5, 2) & "/" & _
                          Mid(dtmDate, 7, 2) & "/" & _
                          Left(dtmDate, 4) & " " & _
                          Mid(dtmDate, 9, 2) & ":" & _
                          Mid(dtmDate, 11, 2) & ":" & _
                          Mid(dtmDate, 13, 2))
    End Function

    When you use Cscript.exe to run this script, output similar to the following is displayed in the command window:

    C:\scripts>dhcp-releaselease.vbs

     

    Settings before releasing lease

     

      Network Adapter 1

        3Com 3C920 Integrated Fast Ethernet Controller (3C905C-TX Compatible) - Pack

    et Scheduler Miniport

     

        DHCP Enabled:        True

        DHCP Server:         192.168.0.1

        DHCP Lease Obtained: 5/30/2004 8:41:23 PM

        DHCP Lease Expires:  6/9/2004 11:41:23 PM

     

        DHCP lease released.

     

    Settings after releasing lease

     

      Network Adapter 1

        3Com 3C920 Integrated Fast Ethernet Controller (3C905C-TX Compatible) - Pack

    et Scheduler Miniport

     

        DHCP Enabled:        True

        DHCP Server:         255.255.255.255

        DHCP Lease Obtained: 6/1/2004 2:15:08 PM

        DHCP Lease Expires:  6/1/2004 3:15:08 PM

    Renewing DHCP Leases

    DHCP also allows leases to be manually or programmatically renewed on the client, bypassing the normal renegotiation process between client and server. The ipconfig.exe /renew command performs this task for all network adapters or a specified adapter.

    The following script iterates through the collection of network adapter configurations and uses the RenewDHCPLease method to renew the lease of each.

    Scripting Steps

    caution.gif  Caution
    This script may make changes in your computer configuration. Run it only on a test computer and note the settings involved before running it.

    Listing 22 first displays DHCP settings for each network adapter; it then checks each network adapter to see if DHCP is enabled. If it is, it renews the DHCP lease.

    To carry out this task, the script must:

    1. Use a GetObject call to connect to the WMI namespace root\cimv2 on the specified computer, and set the impersonation level to “impersonate.”

    2. Use the ExecQuery method to query the Win32_NetworkAdapterConfiguration class, filtering the WQL query with “WHERE IPEnabled = True.”

      This returns a collection consisting of all the network adapter configurations on the computer for which IP is enabled.

    3. Display the label "Settings before renewing lease."

    4. Perform the following steps for each network adapter configuration in the collection.

    5. Display the index number, description, and whether DHCP is enabled for each adapter.

    6. If DHCP is enabled, retrieve the dates the DHCP lease was obtained and will expire and convert them to a readable format by calling the WMIDateToString function.

      Display the IP address of the DHCP server and the lease obtention and expiration dates.

    7. Call the RenewDHCPLease method of Win32_NetworkAdapterConfiguration, then wait 5 seconds for the renewal process to finish.

    8. If the RenewDHCPLease method returns:

      • A value of 0, display a message that the lease has been renewed.

      • A value of 1, display a message that the lease has been renewed and that the computer must be rebooted.

      • A value greater than 1, display a message that the lease cannot be renewed.

    9. Requery the Win32_NetworkAdapterConfiguration class, filtering again for only IP-enabled adapters. This requery is necessary because each query returns a snapshot of the settings it found at the moment the query ran and does not automatically update itself if settings subsequently change.

    10. Redisplay the same DHCP-related settings as were previously displayed.

    11. The WMIDateToString function takes a value in WMI DATETIME format and converts it into a string expressing the date and time in a more readable format.

    Listing 22   Dhcp-renewlease.vbs

      
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    

    On Error Resume Next
     
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:" _
      & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set colNicConfigs = objWMIService.ExecQuery _
      ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
     
    WScript.Echo VbCrLf & "Settings before renewing lease"
     
    For Each objNicConfig In colNicConfigs
     
        blnDHCPEnabled = objNicConfig.DHCPEnabled
     
        WScript.Echo VbCrLf & _
          "  Network Adapter " & objNicConfig.Index & VbCrLf & _
          "    " & objNicConfig.Description & VbCrLf & VbCrLf & _
          "    DHCP Enabled:        " & blnDHCPEnabled
     
        If blnDHCPEnabled Then
     
            dtmLeaseObtainedDate = objNicConfig.DHCPLeaseObtained
            strDHCPLeaseObtained = WMIDateToString(dtmLeaseObtainedDate)
            dtmLeaseExpiresDate = objNicConfig.DHCPLeaseExpires
            strDHCPLeaseExpires = WMIDateToString(dtmLeaseExpiresDate)
     
            WScript.Echo "    DHCP Server:         " & objNicConfig.DHCPServer & _
              VbCrLf & "    DHCP Lease Obtained: " & strDHCPLeaseObtained & _
              VbCrLf & "    DHCP Lease Expires:  " & strDHCPLeaseExpires
     
            intRenewReturn = objNicConfig.RenewDHCPLease
            WScript.Sleep 5000
     
            If (intRenewReturn = 0 Or intRenewReturn = 1) Then
                strSuccess = "    DHCP lease renewed."
                If intRenewReturn = 1 Then
                    strSuccess = strSuccess & " Must reboot machine."
                End If
            Else
                strSuccess = "    Unable to renew DHCP lease."
            End If
     
            WScript.Echo VbCrLf & strSuccess
     
        End If
     
    Next
     
    Set colNicConfigs = objWMIService.ExecQuery _
      ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
     
    WScript.Echo VbCrLf & "Settings after renewing lease"
     
    For Each objNicConfig In colNicConfigs
     
        blnDHCPEnabled = objNicConfig.DHCPEnabled
     
        WScript.Echo VbCrLf & _
          "  Network Adapter " & objNicConfig.Index & VbCrLf & _
          "    " & objNicConfig.Description & VbCrLf & VbCrLf & _
          "    DHCP Enabled:        " & blnDHCPEnabled
     
        If blnDHCPEnabled Then
     
            dtmLeaseObtainedDate = objNicConfig.DHCPLeaseObtained
            strDHCPLeaseObtained = WMIDateToString(dtmLeaseObtainedDate)
            dtmLeaseExpiresDate = objNicConfig.DHCPLeaseExpires
            strDHCPLeaseExpires = WMIDateToString(dtmLeaseExpiresDate)
     
            WScript.Echo "    DHCP Server:         " & objNicConfig.DHCPServer & _
              VbCrLf & "    DHCP Lease Obtained: " & strDHCPLeaseObtained & _
              VbCrLf & "    DHCP Lease Expires:  " & strDHCPLeaseExpires
     
        End If
     
    Next
     
    '******************************************************************************
    ' Function: WMIDateToString(dtmDate)
    ' Converts WMI date to string.
    '******************************************************************************
     
    Function WMIDateToString(dtmDate)
        WMIDateToString = CDate(Mid(dtmDate, 5, 2) & "/" & _
                          Mid(dtmDate, 7, 2) & "/" & _
                          Left(dtmDate, 4) & " " & _
                          Mid(dtmDate, 9, 2) & ":" & _
                          Mid(dtmDate, 11, 2) & ":" & _
                          Mid(dtmDate, 13, 2))
    End Function

    When you use Cscript.exe to run this script, output similar to the following is displayed in the command window:

    C:\scripts>dhcp-renewlease.vbs

     

    Settings before renewing lease

     

      Network Adapter 1

        3Com 3C920 Integrated Fast Ethernet Controller (3C905C-TX Compatible) - Pack

    et Scheduler Miniport

     

        DHCP Enabled:        True

        DHCP Server:         255.255.255.255

        DHCP Lease Obtained: 6/1/2004 2:15:08 PM

        DHCP Lease Expires:  6/1/2004 3:15:08 PM

     

        DHCP lease renewed.

     

    Settings after renewing lease

     

      Network Adapter 1

        3Com 3C920 Integrated Fast Ethernet Controller (3C905C-TX Compatible) - Pack

    et Scheduler Miniport

     

        DHCP Enabled:        True

        DHCP Server:         192.168.0.1

        DHCP Lease Obtained: 6/1/2004 2:15:56 PM

        DHCP Lease Expires:  6/11/2004 5:15:56 PM

    Managing Static IP Addresses

    On very small networks, DHCP may be overkill and you may be able to manage IP address allocation by assigning static IP addresses to all your clients. Even on larger and more complex networks, some hosts — such as network servers and domain controllers — cannot use DHCP and must be assigned static IP addresses. These static IP addresses must also be added to the list of exclusions from the scope on the DHCP server.

    As with most other areas of network client configuration, the Win32_NetworkAdapterConfiguration WMI class provides methods that can programmatically read and write these settings.

    Configuring a Static IP Address

    The script in this section, Staticip-enable.vbs, uses the EnableStatic() method of Win32_NetworkAdapterConfiguration to set the network adapter’s IP addresses and subnet masks, which are exposed in the form of the properties IPAddress and IPSubnet. Because these settings can have more than one value, the data types of these two properties are a string array.

    The EnableStatic() method also effectively disables DHCP. This script shows the basic code involved in accomplishing this task; however, a client that is assigned a static IP address must also be assigned a default gateway and DNS server before it can reestablish network connectivity. The script in the next section, Staticip-enableex.vbs, shows how to script this sequence of tasks.

    Both of these scripts do not assign a new static IP address if a static address is already enabled. However, if you need to assign a new static IP address when another static address is already configured, you can easily adapt the script by removing the following lines:

    If objNicConfig.DHCPEnabled Then
    ...
    Else
      WScript.Echo "    Static IP address already enabled."
    End If
    

    Scripting Steps

    caution.gif  Caution
    This script may make changes in your computer configuration. Run it only on a test computer and note the settings involved before running it.

    Listing 23 checks each network adapter to see if DHCP is enabled. If it is, the script enables static IP addressing, assigning an IP address and subnet mask, and effectively disabling DHCP on the client. The configuration changes may need to be propagated to the DHCP server as well, so that the old IP address leased from DHCP is released and the new static IP address is registered.

    The technique illustrated in this script is not sufficient in itself to reestablish network connectivity with a static IP address. Default gateway and DNS servers must also be set, as the next script does. With this script, you would have to set them manually.

    To disable DHCP and assign a static IP address and subnet mask to a client, the script must:

    1. Create two one-element arrays: the first contains the static IP address to be assigned; the second contains the subnet mask.

    2. Use a GetObject call to connect to the WMI namespace root\cimv2 on the specified computer, and set the impersonation level to “impersonate.”

    3. Use the ExecQuery method to query the Win32_NetworkAdapterConfiguration class, filtering the WQL query with “WHERE IPEnabled = True.”

      This returns a collection consisting of all the network adapter configurations on the computer for which IP is enabled.

    4. Loop through each network adapter configuration in the collection, performing the following steps on each.

    5. Display the index number and description of the network adapter.

    6. If DHCP is enabled on the adapter, call the EnableStatic method of Win32_NetworkAdapterConfiguration, passing it the two array variables already initialized with the IP addresses and subnet masks that you need.

    7. If EnableStatic returns:

      • A value of 0, indicating success, display the new IP addresses and subnet masks.

      • A value of 1, display a success message indicating that the machine must be rebooted, and increment the reboot counter.

      • A value other than 0 or 1, indicating failure, display a message to that effect.

    8. If DHCP is not enabled, display a message that static IP addressing is already enabled.

    9. If the reboot counter is greater than 0, then for at least one network adapter the return value of EnableStatic was 1. Display a message that the computer must be rebooted before changes will take effect.

    Listing 23   Staticip-enable.vbs

      
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    

    On Error Resume Next
     
    strComputer = "."
    arrIPAddresses = Array("192.168.0.12")
    arrSubnetMasks = Array("255.255.255.0")
    intReboot = 0
     
    Set objWMIService = GetObject("winmgmts:" _
     & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set colNicConfigs = objWMIService.ExecQuery _
     ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
     
    For Each objNicConfig In colNicConfigs
      WScript.Echo VbCrLf & "  Network Adapter " & objNicConfig.Index & _
       VbCrLf & "    " & objNicConfig.Description & VbCrLf
      If objNicConfig.DHCPEnabled Then
        WScript.Echo "    Disabling DHCP, enabling static IP address..."
        intReturn = objNicConfig.EnableStatic(arrIPAddresses, arrSubnetMasks)
        If intReturn = 0 Then
          strIPAddresses = Join(arrIPAddresses, ",")
          strSubnetMasks = Join(arrSubnetMasks, ",")
          WScript.Echo "    DHCP disabled, static IP address enabled." & _
            VbCrLf & "    IP Addresses: " & strIPAddresses & VbCrLf & _
           "    Subnet Masks: " & strSubnetMasks
        ElseIf intReturn = 1 Then
          intReboot = intReboot + 1
          WScript.Echo "    DHCP disabled, static IP address enabled. " & _
           VbCrLf & "    Reboot required."
        Else
          WScript.Echo "    Unable to enable static IP address."
        End If
      Else
        WScript.Echo "    Static IP address already enabled."
      End If
    Next
    If (intReboot > 0) Then
      WScript.Echo VbCrLf & "You must reboot this machine before changes " & _
       "will take effect."
    End If

    When you use Cscript.exe to run this script, output similar to the following is displayed in the command window:

    C:\scripts>staticip-enable.vbs

     

      Network Adapter 1

        3Com 3C918 Integrated Fast Ethernet Controller (3C905B-TX Compatible)

     

        Disabling DHCP, enabling static IP ...

        DHCP disabled, static IP address enabled.

        Reboot required.

     

    You must reboot this machine before changes will take effect.

    Configuring Gateways, DNS, and WINS for Static IP Addresses

    To reestablish network connectivity for a client after enabling static IP addressing and assigning an IP address and subnet mask, you must also set new default gateways, DNS server search order, and WINS servers (if WINS is used on the network). However, the script should perform the second set of tasks only if a static IP address and subnet have been successfully assigned. Therefore, scripting this task requires two layers of conditionality.

    Scripting Steps

    caution.gif  Caution
    This script may make changes in your computer configuration. Run it only on a test computer and note the settings involved before running it.

    Listing 24 checks each network adapter to see if DHCP is enabled. If it is, the script enables a static IP address, assigning the IP address and subnet mask and disabling DHCP. If the script succeeds with these tasks, it then assigns a default gateway, and DNS and WINS servers.

    1. Create variables to specify all necessary parameters.

    2. Use a GetObject call to connect to the WMI namespace root\cimv2 on the specified computer, and set the impersonation level to “impersonate.”

    3. Use the ExecQuery method to query the Win32_NetworkAdapterConfiguration class, filtering the WQL query with “WHERE IPEnabled = True.”

      This returns a collection consisting of all the network adapter configurations on the computer for which IP is enabled.

    4. Loop through each network adapter configuration in the collection, performing the following steps on each.

    5. Display the index number and description of the network adapter.

    6. If DHCP is enabled on the adapter, call the EnableStatic method of Win32_NetworkAdapterConfiguration, passing it the two array variables already initialized with the desired IP addresses and subnet masks.

    7. If the return value of EnableStatic is 0, indicating success, call the Get method on Win32_NetworkAdapterConfiguration to return just the current instance, filtering with the Index property, which is the key property that WMI uses to uniquely identify the instance.

    8. For the current instance of the network adapter, call the SetGateways, SetDNSServerSearchOrder, and SetWINSServer methods, passing them the appropriate variables as parameters.

    9. Check the return values for each of these methods, and display a message indicating success or failure for each.

    10. If EnableStatic returns:

      • A value of 1, display a success message indicating that the machine must be rebooted, and increment the reboot counter.

      • A value other than 0 or 1, indicating failure, display a message to that effect.

    11. If DHCP is not enabled, display a message that static IP addressing is already enabled.

    12. If the reboot counter returns:

      • A value greater than 0, then for at least one network adapter the return value of EnableStatic was 1. Display a message that the computer must be rebooted before the changes can take effect and quit the script.

      • A value of 0, requery Win32_NetworkAdapterConfiguration and display the new settings for each network adapter reflecting any changes that were made.

    Listing 24   Staticip-enableex.vbs

      
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    

    On Error Resume Next
     
    strComputer = "."
    arrIPAddresses = Array("192.168.0.12")
    arrSubnetMasks = Array("255.255.255.0")
    arrDefaultGateways = Array("192.168.0.1")
    arrGatewayCostMetrics = Array(1) ' uint16
    arrDNSServers = Array("192.168.0.1")
    strWINSPrimaryServer = "192.168.0.1"
    strWINSSecondaryServer = "192.168.0.2"
    intReboot = 0
     
    Set objWMIService = GetObject("winmgmts:" _
     & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set colNicConfigs = objWMIService.ExecQuery _
     ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
     
    WScript.Echo VbCrLf & "Host Name: " & strComputer
    WScript.Echo VbCrLf & "Settings before:"
     
    For Each objNicConfig In colNicConfigs
      WScript.Echo VbCrLf & _
       "  Network Adapter " & objNicConfig.Index & VbCrLf & _
       "    " & objNicConfig.Description & VbCrLf
      If objNicConfig.DHCPEnabled Then
        WScript.Echo "    Disabling DHCP, enabling static IP ..."
        intStaticReturn = objNicConfig.EnableStatic(arrIPAddresses, arrSubnetMasks)
        If intStaticReturn = 0 Then
          WScript.Echo "    DHCP disabled, static IP address enabled."
          Set objNicChanged = objWMIService.Get _
           ("Win32_NetworkAdapterConfiguration.Index=" & objNicConfig.Index)
          intGatewaysReturn = objNicChanged.SetGateways(arrDefaultGateways, _
           arrGatewayCostMetrics)
          If intGatewaysReturn <> 0 Then
            WScript.Echo "    Unable to assign default gateways."
          Else
            WScript.Echo "    Assigned new default gateways."
          End If
          intDNSServers = objNicChanged.SetDNSServerSearchOrder(arrDNSServers)
          If intDNSServers <> 0 Then
            WScript.Echo "    Unable to assign DNS servers."
          Else
            WScript.Echo "    Assigned new DNS servers."
          End If
          intWINSServers = objNicConfig.SetWINSServer(strWINSPrimaryServer, _
           strWINSSecondaryServer)
          If intWINSServers <> 0 Then
            WScript.Echo "   Unable to assign WINS servers."
          Else
            WScript.Echo "    Assigned new WINS servers."
          End If
        ElseIf intStaticReturn = 1 Then
          intReboot = intReboot + 1
          WScript.Echo "    DHCP disabled, static IP address enabled. " & _
           VbCrLf & "Reboot required."
        Else
          WScript.Echo "    Unable to enable static IP address."
        End If
      Else
        WScript.Echo "    Static IP address already enabled."
      End If
    Next
     
    If (intReboot > 0) Then
      WScript.Echo VbCrLf & "You must reboot this machine before changes " & _
       "will take effect."
      WScript.Quit
    Else
      Set colNicConfigs = objWMIService.ExecQuery("SELECT * FROM " & _
       "Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
      WScript.Echo VbCrLf & "Settings after"
      For Each objNicConfig In colNicConfigs
        WScript.Echo VbCrLf & _
         "  Network Adapter " & objNicConfig.Index & VbCrLf & _
         "    " & objNicConfig.Description & VbCrLf & VbCrLf & _
         "    DHCP Enabled:            " & objNicConfig.DHCPEnabled
        strIPAddresses = ""
        If Not IsNull(objNicConfig.IPAddress) Then
          For Each strIPAddress In objNicConfig.IPAddress
                   strIPAddresses = strIPAddresses & VbCrLf & _
                      "                             " & strIPAddress
          Next
        End If
        WScript.Echo "    IP Addresses: " & strIPAddresses
        strIPSubnets = ""
        If Not IsNull(objNicConfig.IPSubnet) Then
          For Each strIPSubnet In objNicConfig.IPSubnet
            strIPSubnets = strIPSubnets & VbCrLf & _
             "                             " & strIPSubnet
          Next
        End If
        WScript.Echo "    Subnet Masks: " & strIPSubnets
        strDefaultIPGateways = ""
        If Not IsNull(objNicConfig.DefaultIPGateway) Then
          For Each strDefaultIPGateway In objNicConfig.DefaultIPGateway
            strDefaultIPGateways = strDefaultIPGateways & VbCrLf & _
             "                             " & strDefaultIPGateway
          Next
        End If
        WScript.Echo "    Default Gateways: " & strDefaultIPGateways
        strGatewayCostMetrics = ""
        If Not IsNull(objNicConfig.GatewayCostMetric) Then
          For Each strGatewayCostMetric In objNicConfig.GatewayCostMetric
            strGatewayCostMetrics = strGatewayCostMetrics & VbCrLf & _
             "                             " & strGatewayCostMetric
          Next
        End If
        WScript.Echo "    Gateway Cost Metrics: " & strGatewayCostMetrics
        strDNSServerSearchOrder = ""
        If Not IsNull(objNicConfig.DNSServerSearchOrder) Then
          For Each strDNSServer In objNicConfig.DNSServerSearchOrder
            strDNSServerSearchOrder = strDNSServerSearchOrder & VbCrLf & _
             "                             " & strDNSServer
          Next
        End If
        WScript.Echo "    DNS Server Search Order: " & strDNSServerSearchOrder
        WScript.Echo "    WINS Primary Server:     " & _
         objNicConfig.WINSPrimaryServer
        WScript.Echo "    WINS Secondary Server:   " & _
         objNicConfig.WINSSecondaryServer
      Next
    End If

    When you use Cscript.exe to run this script, output similar to the following is displayed in the command window:

     

    C:\scripts>staticip-enableex.vbs

     

    Host Name: .

     

    Settings before:

     

      Network Adapter 1

        3Com 3C918 Integrated Fast Ethernet Controller (3C905B-TX Compatible)

     

        Disabling DHCP, enabling static IP ...

        DHCP disabled, static IP address enabled.

        Reboot required.

     

    You must reboot this machine before changes will take effect.

    Scenario: Allocating IP Addresses on a Subnet

    This scenario shows how to manage IP addresses for reservations and exclusions. In it, DHCP must be enabled on a subnet or other range of IP addresses, while other clients are assigned static IP addresses from the same pool, so that no IP address is assigned to more than one client. To complete this task, the corresponding changes must also be made on the DHCP server; however, managing the DHCP server is beyond the scope of this paper.

    To automate this scenario, one approach is to use two scripts:

    • Dhcp-enable-subnet.vbs

      Enables DHCP for clients with a range of IP addresses set by the administrator. If DHCP is already enabled on a client, the script renews the lease to ensure that client DHCP settings are correct.

    • Staticip-enable-excl.vbs

      Releases DHCP leases on clients for a list of IP addresses to be used for exclusions on the DHCP server. Enables static IP addressing on these clients and assigns an IP address, subnet mask, default gateway and DNS server to each.

    The administrator must separately configure the scope on the DHCP server, reserving and excluding the appropriate addresses. The reservations and exclusions on the DHCP server are beyond the scope of this paper.

    WMI does not have a DHCP provider; so scripting possibilities on the server are limited. You can use command-line tools like Netsh.exe to perform some tasks on the DHCP server.

    Scenario Part One: Configuring DHCP Across a Subnet

    To automate the first set of tasks in this scenario, the first script ensures that clients within the correct range of IP addresses (set in the three variables at the beginning of the script) within the scope on the DHCP server are enabled for DHCP. If they are not, the script enables DHCP on them. If DHCP is already enabled on a client, the script renews the DHCP lease to ensure that current settings are retrieved from the server.

    Scripting Steps

    caution.gif  Caution
    This script may make changes in your computer configuration. Run it only on a test computer and note the settings involved before running it.

    Listing 25 iterates through a range of IP addresses and for each computer, checks each network adapter to see if DHCP is enabled. If it is not, it enables DHCP. You must specify the first part of the IP address and the beginning and ending IP addresses of the range.

    Before attempting to make these changes to multiple network hosts, the script performs two error checks, which are considered good practice: the script first pings the host to ensure that it is accessible and then checks for an error in connecting to WMI to ensure that the WMI service is running on the host (it might not be running on older operating systems).

    1. Create variables to specify parameters for the prefix of the IP addresses, and the starting and ending values of the suffix to be postpended to form the full IP addresses.

    2. Use a For loop to iterate through the tasks once for each suffix in the range.

    3. For each suffix (essentially, for each IP address), perform the following tasks.

    4. Concatenate the prefix with the current value of the counter to form an IP address.

    5. Ping this IP address by using the Exec method of the WshShell object to run Ping.exe, with parameters specifying 2 attempts and a time-out of 1 second.

    6. If the host responds to the ping, use a GetObject call to connect to the WMI namespace root\cimv2 on the specified computer, and set the impersonation level to “impersonate.”

    7. Check for an error if binding to WMI.

    8. If a connection has been established with WMI, use the ExecQuery method to query the Win32_NetworkAdapterConfiguration class, filtering the WQL query with “WHERE IPEnabled = True.”

      This returns a collection consisting of all the network adapter configurations on the computer for which IP is enabled.

    9. For each network adapter configuration in the collection, perform the following tasks.

    10. Display the index number and description of the network adapter.

    11. Check whether DHCP is already enabled.

    12. If DHCP is not enabled, call the EnableDHCP method of Win32_NetworkAdapterConfiguration.

    13. If the EnableDHCP method returns:

      • A value of 0, display a message indicating success.

      • Any other value, display a message indicating failure.

    14. If DHCP is already enabled, display a message to that effect and call the RenewDHCPLease method of Win32_NetworkAdapterConfiguration.

    15. If the RenewDHCPLease method returns:

      • A value of 0, display a message indicating success.

      • Any other value, display a message indicating failure.

    16. If an error occurred in binding to WMI, display an error message.

    17. If the host does not respond to the ping, display an error message.

    Listing 25   Dhcp-enable-subnet.vbs

      
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    

    On Error Resume Next
     
    strSubnetPrefix = "192.168.0."
    intBeginSubnet = 10
    intEndSubnet = 12
     
    For i = intBeginSubnet To intEndSubnet
      strComputer = strSubnetPrefix & i
    ' Ping remote computer. If inaccessible, display error message.
      Set objShell = CreateObject("WScript.Shell")
      Set objScriptExec = objShell.Exec("ping -n 2 -w 1000 " & strComputer)
      strPingResults = LCase(objScriptExec.StdOut.ReadAll)
      If InStr(strPingResults, "reply from") Then
        WScript.Echo VbCrLf & "Host Name " & strComputer
        Set objWMIService = GetObject("winmgmts:" _
         & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    ' Test for success in binding to WMI.
        If Err = 0 Then
          arrIPAddresses = Array(strComputer)
          Set colNicConfigs = objWMIService.ExecQuery _
           ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE " & _
           "IPEnabled = True")
          For Each objNicConfig In colNicConfigs
            WScript.Echo VbCrLf & "  Network Adapter " & objNicConfig.Index & _ 
             VbCrLf & "    " & objNicConfig.Description & VbCrLf
            If Not objNicConfig.DHCPEnabled Then
              WScript.Echo "    Enabling DHCP ..."
              intEnableReturn = objNicConfig.EnableDHCP
              If intEnableReturn = 0 Then
                WScript.Echo VbCrLf & "    DHCP enabled."
              Else
                WScript.Echo VbCrLf & "    Unable to enable DHCP."
              End If
            Else
              WScript.Echo "    DHCP already enabled" & VbCrLf & _
               "    DHCP Server: " & objNicConfig.DHCPServer & _
               VbCrLf & "    Renewing DHCP lease ..."
              intRenewReturn = objNicConfig.RenewDHCPLease
              If intRenewReturn = 0 Then
                WScript.Echo VbCrLf & "    DHCP lease renewed."
              Else
                WScript.Echo VbCrLf & "    Unable to renew DHCP lease."
              End If
            End If
          Next
        Else
          Wscript.Echo "    Error: Unable to connect to WMI."
          Err.Clear
        End If
      Else
        WScript.Echo VbCrLf & "Host Name: " & strComputer & VbCrLf & _
          "    Unable to connect."
      End If
    Next

    When you use Cscript.exe to run this script, output similar to the following is displayed in the command window:

    C:\scripts>dhcp-enable-subnet.vbs

     

    Host Name 192.168.0.10

     

      Network Adapter 1

        3Com 3C918 Integrated Fast Ethernet Controller (3C905B-TX Compatible)

     

        DHCP already enabled

        DHCP Server: 192.168.0.1

        Renewing DHCP lease ...

     

        DHCP lease renewed.

     

    Host Name 192.168.0.11

     

      Network Adapter 1

        3Com 3C918 Integrated Fast Ethernet Controller (3C905B-TX Compatible)

     

        DHCP already enabled

        DHCP Server: 192.168.0.1

        Renewing DHCP lease ...

     

        DHCP lease renewed.

     

    Host Name 192.168.0.12

        Unable to connect.

    Scenario Part Two: Enabling Static IP Addresses on Exclusions

    To automate the second set of tasks in this scenario, the second script releases DHCP leases and enables static IP addresses on the clients that are excluded from the subnet. After successfully completing this task, the script then assigns the clients default gateways and DNS servers to allow them to reconnect to the network.

    Scripting Steps

    caution.gif  Caution
    This script may make changes in your computer configuration. Run it only on a test computer and note the settings involved before running it.

    Listing 26 iterates through a range of host names and for each computer, checks each network adapter to see if DHCP is enabled. If DHCP is enabled, the script releases the lease and then assigns a static IP address and subnet mask. If static IP addressing is successfully enabled, assign a default gateway and DNS server to the network adapter.

    1. Create variables to specify all necessary parameters. These include the list of computers against which to run, and the IP addresses and other settings to be assigned to each when static IP addressing is enabled.

    2. Initialize to 0 a loop counter, which is used to select the correct IP address from the array for each computer.

    3. Iterate through each host name in the list of computers on which to configure static IP addressing.

    4. Ping this host name by using the Exec method of the WshShell object to run Ping.exe, with parameters specifying two attempts and a time-out of 1 second.

    5. If the host responds to the ping, select the IP address from the array whose index is equal to the current value of the loop counter. Assign this IP address to a new one-element array that will be assigned to this host when static IP addressing is enabled. Remember that the value of the IPAddress property is an array of strings.

    6. Use a GetObject call to connect to the WMI namespace root\cimv2 on the specified computer, and set the impersonation level to “impersonate.”

    7. Check for an error if binding to WMI.

    8. If a connection has been established with WMI, use the ExecQuery method to query the Win32_NetworkAdapterConfiguration class, filtering the WQL query with “WHERE IPEnabled = True.”

      This returns a collection consisting of all the network adapter configurations on the computer for which IP is enabled.

    9. For each network adapter configuration in the collection, perform the following tasks.

    10. Display the index number and description of the network adapter.

    11. Check whether DHCP is already enabled.

    12. Use a GetObject call to connect to the WMI namespace root\cimv2 on the specified computer, and set the impersonation level to “impersonate.”

    13. Use the ExecQuery method to query the Win32_NetworkAdapterConfiguration class, filtering the WQL query with “WHERE IPEnabled = True.”

      This returns a collection consisting of all the network adapter configurations on the computer for which IP is enabled.

    14. For each network adapter configuration in the collection, perform the following tasks.

    15. Call the ReleaseDHCPLease method of Win32_NetworkAdapterConfiguration to release the DHCP lease, and display a success or error message depending on the return value.

    16. Call the EnableStatic method of Win32_NetworkAdapterConfiguration, passing it the one-element array of IP addresses for this host and the one-element array of subnet masks (the latter is the same for all hosts).

    17. If the EnableStatic method succeeds, call the Get method to get a new reference to the current instance of Win32_NetworkAdapterConfiguration. This refreshes the properties of this object so that further changes can be made.

    18. Call the SetGateways and SetDNSServerSearchOrder methods of Win32_NetworkAdapterConfiguration, passing them the appropriate variables as parameters.

    19. Check the return value of both methods and display a success or failure message for each.

    20. If a static IP address cannot be assigned, display an error message.

    21. If DHCP is not enabled, display a message that static IP addressing is already enabled.

    22. Requery the Win32_NetworkAdapterConfiguration class for IP-enabled adapters to retrieve any new values reflecting the changes just made, and display the relevant properties.

    23. If an error occurred in binding to WMI, display an error message.

    24. If the host does not respond to the ping, display an error message.

    25. Increment the loop counter used to select the IP address from the array.

    Listing 26   Staticip-enable-excl.vbs

      
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    

    On Error Resume Next
     
    arrComputers = Array("client1", "client2", "client3")
    ' There must be one IP in arrStaticIPs for each host in arrComputers.
    arrStaticIPs = Array("192.168.0.240","192.168.0.243","192.168.0.250")
    arrSubnetMasks = Array("255.255.255.0")
    arrDefaultGateways = Array("192.168.0.1")
    arrGatewayCostMetrics = Array(1)
    arrDNSServers = Array("192.168.0.1")
    intCount = 0
     
    For Each strComputer In arrComputers
     
    ' Ping remote computer. If inaccessible, display error message.
      Set objShell = CreateObject("WScript.Shell")
      Set objScriptExec = objShell.Exec("ping -n 2 -w 1000 " & strComputer)
      strPingResults = LCase(objScriptExec.StdOut.ReadAll)
      If InStr(strPingResults, "reply from") Then
        WScript.Echo VbCrLf & "Host Name: " & strComputer
        arrIPAddresses = Array(arrStaticIPs(intCount))
        Set objWMIService = GetObject("winmgmts:" _
         & "{impersonationLevel=impersonate}!\\" & strComputer & _
         "\root\cimv2")
     
    ' Test for success in binding to WMI.
        If Err = 0 Then
     
          Set colNicConfigs = objWMIService.ExecQuery _
           ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE " & _
           "IPEnabled = True")
     
          For Each objNicConfig In colNicConfigs
            WScript.Echo VbCrLf & "  Network Adapter " & _
             objNicConfig.Index & VbCrLf & "    " & _
              objNicConfig.Description & VbCrLf
            If objNicConfig.DHCPEnabled Then
              intStaticReturn = objNicConfig.EnableStatic(arrIPAddresses, _
               arrSubnetMasks)
              If intStaticReturn = 0 Then
                WScript.Echo "    DHCP disabled, static IP address enabled."
                Set objNicChanged = objWMIService.Get _
                 ("Win32_NetworkAdapterConfiguration.Index=" & objNicConfig.Index)
                intGatewaysReturn = objNicChanged.SetGateways _
                 (arrDefaultGateways, arrGatewayCostMetrics)
                If intGatewaysReturn = 0 Then
                  WScript.Echo "    Assigned new default gateways."
                Else
                  WScript.Echo "    Unable to assign default gateways."
                End If
                intDNSServersReturn = objNicChanged.SetDNSServerSearchOrder _
                 (arrDNSServers)
                If intDNSServersReturn = 0 Then
                  WScript.Echo "    Assigned new DNS servers."
                Else
                  WScript.Echo "    Unable to assign DNS servers."
                End If
              Else
                WScript.Echo "    Unable to enable static IP address."
              End If
            Else
              WScript.Echo "    Static IP address already enabled."
            End If
          Next
     
          Set colNicConfigs = objWMIService.ExecQuery("SELECT * FROM " & _
           "Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
     
          For Each objNicConfig In colNicConfigs
            WScript.Echo VbCrLf & _
             "  Network Adapter " & objNicConfig.Index & VbCrLf & _
             "    " & objNicConfig.Description & VbCrLf & _
             "    DHCP Enabled: " & objNicConfig.DHCPEnabled
            strIPAddresses = ""
            If Not IsNull(objNicConfig.IPAddress) Then
              For Each strIPAddress In objNicConfig.IPAddress
                strIPAddresses = strIPAddresses & VbCrLf & _
                 "                         " & strIPAddress
              Next
            End If
            WScript.Echo "    IP Addresses: " & strIPAddresses
            strIPSubnets = ""
            If Not IsNull(objNicConfig.IPSubnet) Then
              For Each strIPSubnet In objNicConfig.IPSubnet
                strIPSubnets = strIPSubnets & VbCrLf & _
                 "                         " & strIPSubnet
              Next
            End If
            WScript.Echo "    Subnet Masks: " & strIPSubnets
            strDefaultIPGateways = ""
            If Not IsNull(objNicConfig.DefaultIPGateway) Then
              For Each strDefaultIPGateway In objNicConfig.DefaultIPGateway
                strDefaultIPGateways = strDefaultIPGateways & VbCrLf & _
                 "                         " & strDefaultIPGateway
              Next
            End If
            WScript.Echo "    Default Gateways: " & strDefaultIPGateways
            strGatewayCostMetrics = ""
            If Not IsNull(objNicConfig.GatewayCostMetric) Then
              For Each strGatewayCostMetric In objNicConfig.GatewayCostMetric
                strGatewayCostMetrics = strGatewayCostMetrics & VbCrLf & _
                 "                         " & strGatewayCostMetric
              Next
            End If
            strDNSServerSearchOrder = ""
            WScript.Echo "    Gateway Cost Metrics: " & strGatewayCostMetrics
            If Not IsNull(objNicConfig.DNSServerSearchOrder) Then
              For Each strDNSServer In objNicConfig.DNSServerSearchOrder
                strDNSServerSearchOrder = strDNSServerSearchOrder & VbCrLf & _
                 "                         " & strDNSServer
              Next
            End If
            WScript.Echo "    DNS Server Search Order: " & strDNSServerSearchOrder
          Next
     
        Else
     
          Wscript.Echo "    Error: Unable to connect to WMI."
          Err.Clear
     
        End If
     
      Else
     
        WScript.Echo VbCrLf & "Host Name: " & strComputer & VbCrLf & _
         "    Unable to connect." & VbCrLf
     
      End If
     
    intCount = intCount + 1
     
    Next

    When you use Cscript.exe to run this script, output similar to the following is displayed in the command window:

    C:\scripts>staticip-enable-excl.vbs

     

    Host Name: client1

        Unable to connect.

     

    Host Name: client2

     

      Network Adapter 1

        3Com 3C918 Integrated Fast Ethernet Controller (3C905B-TX Compatible)

     

        Releasing DHCPlease ...

        DHCP lease released.

        Disabling DHCP, enabling static IP address ...

        DHCP disabled, static IP address enabled.

        Assigned new default gateways.

        Assigned new DNS servers.

     

      Network Adapter 1

        3Com 3C918 Integrated Fast Ethernet Controller (3C905B-TX Compatible)

        DHCP Enabled: False

        IP Addresses:

                             192.168.0.243

        Subnet Masks:

                             255.255.255.0

        Default Gateways:

                             192.168.0.1

        Gateway Cost Metrics:

                             20

        DNS Server Search Order:

                             192.168.0.1

     

    Host Name: client3

        Error: Unable to connect to WMI.

    Scenario: Switching Between a Static IP Address and DHCP

    In this scenario, a "road warrior" needs to connect her laptop to a corporate network in different branch offices. In some, the network requires that clients use DHCP and in others, the computer must use a static address (along with a subnet mask, default gateway, DNS server, and WINS server). To run this script, the user types the name of the script followed by a space and the name of the current office where the computer is located. According to the location, the script assigns one or the other address allocation method: static in Miami and Dogpatch; DHCP in Seattle and Boston.

    Scripting Steps

    caution.gif  Caution
    This script may make changes in your computer configuration. Run it only on a test computer and note the settings involved before running it.

    Listing 27 enables the user to change between DHCP and static IP addressing on a portable computer by using a command-line argument that represents the current location entered by the user. The script is broken down into subroutines that make it more modular and easier to read, debug, and modify.

    This script uses the WScript.Arguments property, which is part of Windows Script Host. The script returns a collection of all the arguments typed on the command line after the name of the script. For more information about using this property, see "Working with Command-Line Arguments" in the "WSH Primer" section of the Windows 2000 Scripting Guide at https://go.microsoft.com/fwlink/?LinkId=29994.

    1. Use the WScript.Arguments collection to retrieve the command-line argument entered after the script name.

      This script takes only one argument: the name of the office where the user wants to connect to the local area network. Any other arguments are ignored.

    2. Assign the first argument, colArgs(0), to the strOffice variable.

    3. Use a Select Case statement to assign a Boolean value, True or False, to blnDHCP depending on the name of the branch office entered as a command-line argument.

      If the argument is not one of the four valid names, the script displays an error message and exits.

    4. Use a GetObject call to connect to the WMI namespace root\cimv2 on the local computer, and set the impersonation level to “impersonate.”

    5. Use the ExecQuery method to query the Win32_NetworkAdapterConfiguration class, filtering the WQL query with “WHERE IPEnabled = True.”

      This returns a collection consisting of all the network adapter configurations on the computer for which IP is enabled.

    6. If the office whose name was passed as an argument uses DHCP, call the SetDHCP subroutine.

    7. If the office does not use DHCP, call the SetStaticIP subroutine.

    8. The SetDHCP subroutine checks the DHCPEnabled property and if DHCP is not enabled, calls the EnableDHCP method. If DHCP is already enabled, SetDHCP displays a message to that effect and the IP address of the DHCP server.

      Before ending, SetDHCP calls the GetSettings subroutine.

      If DHCP is already enabled, you might want to add code to the subroutine that renews the lease. Dhcp-enable-subnet.vbs, in the previous scenario, provides an example of how to do this. Although the DHCP client should find the local DHCP server and get local configuration, renewing the lease can expedite this process in some network environments.

    9. The SetStaticIP subroutine begins with hard-coded variables that assign the settings necessary for static IP addressing (a more complex script could obtain these settings from an external source). SetStaticIP then checks the DHCPEnabled property and if DHCP is enabled, calls the EnableStatic method. If EnableStatic succeeds, SetStaticIP then calls the SetGateways and SetDNSServerSearchOrder methods to complete the static IP configuration.

      If DHCP is already enabled, SetDHCP displays a message to that effect and the IP address of the DHCP server.

      Before ending, SetStaticIP calls the GetSettings subroutine.

    10. The GetSettings subroutine, which is called by both SetDHCP and SetStaticIP, requeries Win32_NetworkAdapterConfiguration to retrieve any changes made by the previous subroutines. GetSettings then displays the relevant IP address allocation settings that are currently on the computer.

    Listing 27   Dhcp-staticip-switch.vbs

      
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    

    On Error Resume Next
     
    ' Get argument to find out what office we're in and set a switch based on it.
    Set colArgs = WScript.Arguments
    strOffice = LCase(colArgs(0))
    Select Case strOffice
      Case "boston" blnDHCP = True
      Case "miami" blnDHCP = False
      Case "seattle" blnDHCP = True
      Case "dogpatch" blnDHCP = False
      Case Else WScript.Echo "Please enter the script name followed by a " & _
       "space and the name of a branch office." & _
       VbCrLf & "Valid names are: Boston, Miami, Seattle and Dogpatch." _
       : WScript.Quit
    End Select
     
    Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
    Set colNicConfigs = objWMIService.ExecQuery _
     ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
     
    ' If the office uses DHCP, call SetDHCP.
    If blnDHCP = True Then
      WScript.Echo "You are in the " & colArgs(0) & " branch office." & _
       VbCrLf & "Enabling DHCP on all network adapters ..."
      SetDHCP
    ' If the office uses static IP, call SetStaticIP.
    Else
      WScript.Echo "You are in the " & colArgs(0) & " branch office." & _
       VbCrLf & "Enabling static IP addressing on all network adapters ..."
      SetStaticIP
    End If
     
    '******************************************************************************
    Sub SetDHCP
     
    For Each objNicConfig In colNicConfigs
      WScript.Echo VbCrLf & "Network Adapter " & objNicConfig.Index & _
       VbCrLf & "  " & objNicConfig.Description & VbCrLf
      If Not objNicConfig.DHCPEnabled Then
        WScript.Echo "  Attempting to enable DHCP ..."
        intReturn = objNicConfig.EnableDHCP
        If intReturn = 0 Then
          WScript.Echo "  DHCP enabled."
        Else
          WScript.Echo "  Unable to enable DHCP."
        End If
        Err.Clear
      Else
        WScript.Echo "  DHCP already enabled" & VbCrLf & _
         "  DHCP Server:             " & objNicConfig.DHCPServer
        Err.Clear
      End If
    Next
    GetSettings
     
    End Sub
     
    '******************************************************************************
    Sub SetStaticIP
     
    arrIPAddresses = Array("192.168.0.12")
    arrSubnetMasks = Array("255.255.255.0")
    arrDefaultGateways = Array("192.168.0.1")
    arrGatewayCostMetrics = Array(1)
    arrDNSServers = Array("192.168.0.1")
     
    For Each objNicConfig In colNicConfigs
      WScript.Echo VbCrLf & "Network Adapter " & objNicConfig.Index & VbCrLf & _
       "  " & objNicConfig.Description & VbCrLf
      If objNicConfig.DHCPEnabled Then
        WScript.Echo "  Attempting to disable DHCP and enable static IP ..."
        intStaticReturn = objNicConfig.EnableStatic(arrIPAddresses, arrSubnetMasks)
        If intStaticReturn = 0 Then
          WScript.Echo "  DHCP disabled, static IP address enabled."
          Set objNicChanged = objWMIService.Get _
           ("Win32_NetworkAdapterConfiguration.Index=" & objNicConfig.Index)
          intGatewaysReturn = objNicChanged.SetGateways(arrDefaultGateways, _
           arrGatewayCostMetrics)
          intDNSServers = objNicChanged.SetDNSServerSearchOrder(arrDNSServers)
          If intGatewaysReturn = 0 Then
            WScript.Echo "    Assigned new default gateways."
          Else
            WScript.Echo "    Unable to assign default gateways."
          End If
          If intDNSServers = 0 Then
            WScript.Echo "    Assigned new DNS servers."
          Else
            WScript.Echo "    Unable to assign DNS servers."
          End If
          Err.Clear
        Else
          WScript.Echo "  Unable to enable static IP address."
          Err.Clear
        End If
      Else
        WScript.Echo "  Static IP address already enabled."
      End If
    Next
    GetSettings
     
    End Sub
     
    '******************************************************************************
    Sub GetSettings
     
    Set colNicConfigs = objWMIService.ExecQuery("SELECT * FROM " & _
     "Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
     
    WScript.Echo VbCrLf & "Settings after operation:"
    For Each objNicConfig In colNicConfigs
      WScript.Echo VbCrLf & _
       "Network Adapter " & objNicConfig.Index & VbCrLf & _
       "  " & objNicConfig.Description & VbCrLf & VbCrLf & _
       "  DHCP Enabled:            " & objNicConfig.DHCPEnabled
      strIPAddresses = ""
      If Not IsNull(objNicConfig.IPAddress) Then
        For Each strIPAddress In objNicConfig.IPAddress
          strIPAddresses = strIPAddresses & VbCrLf & _
           "                           " & strIPAddress
        Next
      End If
      WScript.Echo "  IP Addresses: " & strIPAddresses
      strIPSubnets = ""
      If Not IsNull(objNicConfig.IPSubnet) Then
        For Each strIPSubnet In objNicConfig.IPSubnet
          strIPSubnets = strIPSubnets & VbCrLf & _
           "                           " & strIPSubnet
        Next
      End If
      WScript.Echo "  Subnet Masks: " & strIPSubnets
      strDefaultIPGateways = ""
      If Not IsNull(objNicConfig.DefaultIPGateway) Then
        For Each strDefaultIPGateway In objNicConfig.DefaultIPGateway
          strDefaultIPGateways = strDefaultIPGateways & VbCrLf & _
           "                           " & strDefaultIPGateway
        Next
      End If
      WScript.Echo "  Default Gateways: " & strDefaultIPGateways
      strGatewayCostMetrics = ""
      If Not IsNull(objNicConfig.GatewayCostMetric) Then
        For Each strGatewayCostMetric In objNicConfig.GatewayCostMetric
          strGatewayCostMetrics = strGatewayCostMetrics & VbCrLf & _
           "                           " & strGatewayCostMetric
        Next
      End If
      WScript.Echo "  Gateway Cost Metrics: " & strGatewayCostMetrics
      strDNSServerSearchOrder = ""
      If Not IsNull(objNicConfig.DNSServerSearchOrder) Then
        For Each strDNSServer In objNicConfig.DNSServerSearchOrder
          strDNSServerSearchOrder = strDNSServerSearchOrder & VbCrLf & _
           "                           " & strDNSServer
        Next
      End If
      WScript.Echo "  DNS Server Search Order: " & strDNSServerSearchOrder
    Next
     
    End Sub

    When you use Cscript.exe to run this script, output similar to the following is displayed in the command window:

    C:\scripts>dhcp-staticip-switch.vbs Boston

    You are in the Boston branch office.

    Enabling DHCP on all network adapters ...

     

    Network Adapter 1

      3Com 3C920 Integrated Fast Ethernet Controller (3C905C-TX Compatible) - Packet

    Scheduler Miniport

     

      DHCP already enabled

      DHCP Server:             192.168.0.1

     

    Settings after operation:

     

    Network Adapter 1

      3Com 3C920 Integrated Fast Ethernet Controller (3C905C-TX Compatible) - Packet

    Scheduler Miniport

     

      DHCP Enabled:            True

      IP Addresses:

                               192.168.0.21

      Subnet Masks:

                               255.255.255.0

      Default Gateways:

                               192.168.0.1

      Gateway Cost Metrics:

                               20

      DNS Server Search Order:

                               192.168.0.1

     

    C:\scripts\netcli>dhcp-staticip-switch.vbs Miami

    You are in the Miami branch office.

    Enabling static IP addressing on all network adapters ...

     

    Network Adapter 1

      3Com 3C920 Integrated Fast Ethernet Controller (3C905C-TX Compatible) - Packet

    Scheduler Miniport

     

      Attempting to disable DHCP and enable static IP ...

      DHCP disabled, static IP address enabled.

        Assigned new default gateways.

        Assigned new DNS servers.

     

    Settings after operation:

     

    Network Adapter 1

      3Com 3C920 Integrated Fast Ethernet Controller (3C905C-TX Compatible) - Packet

    Scheduler Miniport

     

      DHCP Enabled:            False

      IP Addresses:

                               192.168.0.12

      Subnet Masks:

                               255.255.255.0

      Default Gateways:

                               192.168.0.1

      Gateway Cost Metrics:

                               1

      DNS Server Search Order:

                               192.168.0.1

    Tools for IP Address Allocation on Clients

    Table 11 outlines the available Windows tools to use for scripting IP address allocation on clients.

    Table 11   Tools for IP Address Allocation on Clients

    Technology

    Tool

    Where Available

    Command-line tools

    Dhcploc.exe: DHCP Server Locator Utility

    Windows Server 2003 Support Tools

    Command-line tools

    Enabledhcp.vbs

    Windows 2000 Resource Kit

    Command-line tools

    Netsh.exe

    Windows operating systems1

    WSH

    None

     

    WMI

    Win32_NetworkAdapterConfiguration

     

    1 Windows 2000, Windows XP, and Windows Server 2003. May also be present on other versions of Windows.

    Table 12 outlines the available registry keys to use for scripting IP address allocation on clients.

    caution.gif  Caution
    Incorrectly editing the registry may severely damage your system. Before making changes to the registry, you should back up any valued data on the computer.

    Table 12   Registry Subkeys Related to Scripting IP Address Allocation on Clients

    Registry Subkeys

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces
    \{AdapterIdentifier}

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Dhcp\Parameters