How to Remotely Change a Computer from a Static IP to DHCP

We're currently migrating many computers from static IP assignments over to DHCP IP leases. Rather than walking from each computer to the next and manually changing the adapter settings I've been looking for a remote solution that I could either apply to computers one at a time or push out via group policy. Thanks to a VBScript originally written by MatthewBeattie and posted on the technet forums I now have a solution.

 

Changing an adapter to DHCP remotely

 

First you'll need the VBScript file. Copy and paste the following into Notepad. Assuming you want this to execute on both Windows 7 and Windows XP clients, the only line you need to edit is line 31, "subnets = Array("192.168.1.0")" and change the 192.168.1.0 to the network that you'd like this file to execute on.

'----------------------------------------------------------------------------------------------------------------------------
'Script Name : EnableDHCP.vbs
'Author   : Matthew Beattie
'Created   : 29/12/10
'Description : This script enables DHCP for systems on specified subnets.
'----------------------------------------------------------------------------------------------------------------------------
'Initialization Section  
'----------------------------------------------------------------------------------------------------------------------------
Option Explicit  
Dim objFSO, wshShell, wshNetwork, hostName
On Error Resume Next
 Set objFSO   = CreateObject("Scripting.FileSystemObject")   
 Set wshNetwork = Wscript.CreateObject("Wscript.Network")  
 Set wshShell  = CreateObject("Wscript.Shell")  
 hostName    = wshNetwork.ComputerName
 ProcessScript
 If Err.Number <> 0 Then
 Wscript.Quit  
 End If
On Error Goto 0
'----------------------------------------------------------------------------------------------------------------------------
'Name    : ProcessScript -> Primary Function that controls all other script processing.  
'Parameters : None     ->  
'Return   : None     ->  
'----------------------------------------------------------------------------------------------------------------------------
Function ProcessScript
 Dim ipAddress, macAddress, product, systems, system
 Dim subnets, subnet, network, continue
 product = ReadRegistry("HKLM\Software\Microsoft\Windows NT\CurrentVersion\ProductName")
 systems = Array("Windows XP","Windows 7")
 subnets = Array("192.168.1.0")
 '-------------------------------------------------------------------------------------------------------------------------
 'Ensure this script only applies to client operating systems. (Don't configure servers with DHCP!)
 '-------------------------------------------------------------------------------------------------------------------------
 Continue = False
 For Each system In systems
 If InStr(1, product, system, vbTextCompare) <> 0 Then
 continue = True
 Exit For
 End If
 Next
 If Not continue Then
 Exit Function
 End If
 '-------------------------------------------------------------------------------------------------------------------------
 'Enumerate the IP and MAC Addresses from the local system.
 '-------------------------------------------------------------------------------------------------------------------------
 If Not GetIPConfig(hostName, ipAddress, macAddress) Then
 Exit Function
 End If
 '-------------------------------------------------------------------------------------------------------------------------
 'Ensure the script continues processing only if the systems IP address is within the specified subnets.
 '-------------------------------------------------------------------------------------------------------------------------
 network = Left(ipAddress, InStrRev(ipAddress, ".")) & "0"
 continue = False
 For Each subnet In subnets
 If StrComp(subnet, network, vbTextCompare) = 0 Then
 continue = True
 Exit For
 End If
 Next
 '-------------------------------------------------------------------------------------------------------------------------
 'Ensure the script only continues processing if the systems IP address is within the specified subnets.
 '-------------------------------------------------------------------------------------------------------------------------
 If Not continue Then
 Exit Function
 End If
 '-------------------------------------------------------------------------------------------------------------------------
 'The system is within one of the specified subnets. Enable DHCP on all enabled interfaces that have static IP Addresses.
 '-------------------------------------------------------------------------------------------------------------------------
 If Not EnableDHCP Then
 Exit Function
 End If
End Function
'----------------------------------------------------------------------------------------------------------------------------
'Name    : ReadRegistry -> Read the value of a registry key or value.
'Parameters : key     -> Name of the key (ending in "\") or value to read.
'Return   : ReadRegistry -> Value of key or value read from the local registry (blank is not found).
'----------------------------------------------------------------------------------------------------------------------------
Function ReadRegistry(ByVal key)
 Dim result
 If StrComp (Left (key, 4), "HKU\", vbTextCompare) = 0 Then
 Key = "HKEY_USERS" & Mid (key, 4)
 End If
 On Error Resume Next
 ReadRegistry = WshShell.RegRead (key)
 If Err.Number <> 0 Then
 ReadRegistry = ""
 End If
 On Error Goto 0
End Function
'----------------------------------------------------------------------------------------------------------------------------
'Name    : GetIPConfig -> Enumerates the IP & MAC Address of the system via WMI
'Parameters : hostName  -> String containing the hostname of the computer to enumerate the IP configuration for.
'      : ipAddress  -> Input/Output : Variable assigned to the IP Address of the system.
'Parameters : macAddress -> Input/Output : Variable assigned to the MAC Address of the system.
'Return   : GetIPConfig -> Returns True and the systems IP & MAC Address if successful otherwise returns False.
'----------------------------------------------------------------------------------------------------------------------------
Function GetIPConfig(hostName, ipAddress, macAddress)
 Dim wmi, ipConfig, query
 GetIPConfig = False
 ipAddress  = ""
 macAddress = ""
 query    = "select * from Win32_NetworkAdapterConfiguration where IPEnabled = True"
 On Error Resume Next
 Set wmi = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & hostName & "\root\cimv2")
 If Err.Number <> 0 Then
 Exit Function
 End If
 For Each ipConfig in wmi.ExecQuery(query)
 If Err.Number <> 0 Then
 Exit Function
 End If
 ipAddress = ipConfig.IPAddress(0)
 macAddress = ipConfig.MACAddress(0)
 If ipAddress <> "" And ipAddress <> "0.0.0.0" And MACAddress <> "" Then
 Exit For
 End If
 Next
 On Error Goto 0
 GetIPConfig = True
End Function
'----------------------------------------------------------------------------------------------------------------------------
'Name    : EnableDHCP -> enables DHCP on all interfaces that have static IP Addresses.
'Parameters : hostName  -> String containing the hostname of the system to enable DHCP on.
'Return   : EnableDHCP -> Returns True if DHCP was enabled otherwise False.
'----------------------------------------------------------------------------------------------------------------------------
Function EnableDHCP
 Dim query, wmi, adapter, adapters, result
 EnableDHCP = False
 query   = "Select * From Win32_NetworkAdapterConfiguration Where DHCPEnabled = False And IPEnabled = True"
 On Error Resume Next
 Set wmi   = GetObject("winmgmts:\\" & hostName & "\root\cimv2")
 Set adapters = wmi.ExecQuery(query)
 For Each adapter In adapters
 result = adapter.EnableDHCP()
 Next
 If Err.Number <> 0 Then
 Exit Function
 End If
 On Error Goto 0
 EnableDHCP = True
End Function
'----------------------------------------------------------------------------------------------------------------------------

Executing Manually on Remote Machines

For simplicity, place the previous EnableDHCP.vbs file either in your root C:\ or on a file share.

Download and install PsTools available here. Once installed launch a command prompt. Change to the PsTools directory with the following command:
cd \pstools

The following assumes your account has administrative privlidges on both the local and remote machine and you've saved the vbs file locally to C:\

Execute the file on the remote machine with the following command:
psexec \\<RemoteComputerNameOrIP> cscript \\<LocalComputerName>\C$\EnableDHCP.vbs

If you need to specify a remote administrator user use the following command:
psexec \\<RemoteComputerNameOrIP> -u <RemoteAdmin> cscript \\<LocalComputerName>\C$\EnableDHCP.vbs

The command will not execute cleanly because (obviously) your computer is going to lose its network connection to the other computer while it changes to DHCP.

You must invoke cscript to execute the command as by default .vbs files will not execute remotely.

Executing via Group Policy

(I'm not responsible if you screw up your domain)

Save the EnableDHCP.vbs to a file share location that allows everyone to read.

If you don't already have your computers segregated into Organizational Units, create a new OU and Create and link a new Group Policy to it.
Right click your domain > click New Organizational Unit > right click the OU you just created> click Create a GPO in this Domain, and Link it here. > name it something useful like "Enable DHCP" > Drag computers into the new OU

The best time to run this script, in my opinion, is going to be during computer startup. Edit the Group Policy you previously created to launch the script.
Right click the previously created Policy > Edit > expand Computer Configuration > Windows Settings > Scripts > double click Startup > click Add > click Browse > find the script > click OK a couple of times

That should do it!

Personally, because of the way we have some things set to start, I'm using a combination of psLoggedon to find computers that noone is logged into, then executing the script on those computers. Please always test on a non production computer before you start making big changes like this.

  1. Thanks for the script. I'm moving 500+ computers in 7 subnets from Static to DHCP with reservation. Needed a way to get the windows 7 machines to switch from Static to DHCP.

  2. avatar Tom says:

    This doesn't change the DNS to automatic via DHCP. How can we add the DNS to this script?

  1. There are no trackbacks for this post yet.

Leave a Reply