How to Remotely Change a Computer from a Static IP to DHCP
Posted in Blog on January 19th, 2011 by Matt – 1 CommentWe'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.
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.



