Configuration ip alternative avec dhcp actif (alternate ip)

Cette source est considérée comme dangereuse, elle a néamoins été gardée dans un but pédagogique :
Cette source est considérée comme dangereuse, elle a néamoins été gardée dans un but pédagogique.

Contenu du snippet

Note: Pour que ce script fonctionne:
-Il faudra avoir désactivé APIPA
-Etre dans le cas d'une configuration IP statique.
-Avoir une carte réseau (vaut mieux non?) nommé "Local Area Connection" ou "Connexion au réseau local"

But:
Sur l'interface réseau...
-Dupliquera la configuration IP statique en cours vers la configuration IP alternative (2ième onglet)
-Activera le DHCP sur cette interface

Pour quoi faire?
Certaines applications exigent une configuration IP en DHCP or l'architecture de votre réseau ne le permet pas (pas de présence de serveur DHCP dans votre entreprise), la configuration IP alternative constitue une solution à cette problématique. Il ne faut pas oublier de désactiver l'APIPA!
Il est à noter aussi que pour le faire par script, Microsoft documente très mal (pas du tout ?) cette partie.

Le code:
-Les vérifications sont ici basiques.
-Seul 2 serveurs DNS et WINS seront sauvegardés aux maximums.
-Il faudra bien évidemment rebooter.

Source / Exemple :


Option explicit
'On error resume next
'Script permettant d'activer la configuration alternative IP
'Pour cela on recupere d'abord la clé SID dans le registre correspondant a la bonne interface
'en faisant une comparaison avec les données (pour la trouver)
'après quoi on y rajoute des clés de registre et on active le dhcp.
Dim strComputer
Dim objWMIService
Dim colAdapters
Dim objAdapter
Dim sIP
Dim sMask
Dim sGateway

'On recupere IP + Mask + Passerelle
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\"& strComputer & "\root\cimv2")
Set colAdapters = objWMIService.ExecQuery ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
For Each objAdapter in colAdapters
	sIP = objAdapter.IPAddress(0)
	sMask = objAdapter.IPSubnet(0)
	sGateway = objAdapter.DefaultIPGateway(0)
	Exit For
Next

'On va chercher dans le registre l'interface correspondante
Dim objReg
Dim strKeyPath
Dim subkey
Dim arrSubkeys
Dim arrValueTypes
Dim arrValueNames
Dim arrStrValue
Dim mySID
Dim strValue
Dim Returned
const REG_SZ = 1
const REG_EXPAND_SZ = 2
const REG_BINARY = 3
const REG_DWORD = 4
const REG_MULTI_SZ = 7
const HKEY_LOCAL_MACHINE = &H80000002

Set objReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\"& strComputer & "\root\default:StdRegProv")
strKeyPath = "SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}"
objReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubKeys

'On cherche la clé de la bonne interface
mySID = ""
strValue = ""
For Each subkey In arrSubKeys
	'On exclut la clé Descriptions et on regarde toutes les autres clés SID
	If (subkey <> "Descriptions") then 
		Returned = objReg.GetStringValue(HKEY_LOCAL_MACHINE, strKeyPath & "\" & subkey & "\Connection", "Name", strValue)
		If (strValue = "Local Area Connection") OR  (strValue = "Connexion au réseau local") then
			mySID = subkey
			Exit For
		End if
	End if
Next
'mySID contient la clé SID de la bonne interface carte reseau local

'Pour rappel on a déjà l'ip, le mask et la passerelle de l'interface
'sIP et sMask et sGateway
'Maintenant il nous faut le wins (si existant) et les serveurs DNS
'Pour le dns: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{491CBE6B-84AD-408C-8DC3-A041326646E6}
'Pour le WINS : HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetBT\Parameters\Interfaces\Tcpip_{491CBE6B-84AD-408C-8DC3-A041326646E6}
'NameServerList (REG_MULTI_SZ) => wins
'NameServer (REG_SZ) => DNS
strValue = ""
strKeyPath = "SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces"
Returned = objReg.GetStringValue(HKEY_LOCAL_MACHINE, strKeyPath & "\" & mySID, "NameServer", strValue)

Dim arrDNS, arrWINS
arrDNS = Split(strValue, ",")

strKeyPath = "SYSTEM\CurrentControlSet\Services\NetBT\Parameters\Interfaces\Tcpip_"
Returned = objReg.GetMultiStringValue(HKEY_LOCAL_MACHINE, strKeyPath & mySID, "NameServerList", arrWINS)

'Les WINS sont retournes de base dans un tableau, on va donc voir le nombre de WINS inséré dans le tableau et les concaténer dans une chaine de caractere
If (UBound(arrWINS) >= 0) then
	If (UBound(arrWINS) = 0) then sWINS = arrWINS(0)
	If (UBound(arrWINS) = 1) then sWINS = arrWINS(0) & "," & arrWINS(1)
End if
Returned = objReg.SetStringValue(HKEY_LOCAL_MACHINE, strKeyPath, "WINS", sWINS)

'Creation de la valeur ActiveConfigurations pour activer la configuration alternative
arrStrValue = ""
strKeyPath = "SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\" & mySID
arrStrValue = Array("Alternate_" & mySID)
Returned = objReg.SetMultiStringValue(HKEY_LOCAL_MACHINE, strKeyPath, "ActiveConfigurations", arrStrValue)

'Activation DHCP
Returned = objReg.SetDWORDValue(HKEY_LOCAL_MACHINE, strKeyPath, "EnableDHCP", 1)

'Vidage des champs sur le premier onglet de la configuration IP
Returned = objReg.SetMultiStringValue(HKEY_LOCAL_MACHINE, strKeyPath, "DefaultGateway", Array())
Returned = objReg.SetMultiStringValue(HKEY_LOCAL_MACHINE, strKeyPath, "DefaultGatewayMetric", Array())
Returned = objReg.SetMultiStringValue(HKEY_LOCAL_MACHINE, strKeyPath, "IPAddress", Array())

Returned = objReg.SetMultiStringValue(HKEY_LOCAL_MACHINE, strKeyPath, "SubnetMask", Array())
Returned = objReg.SetStringValue(HKEY_LOCAL_MACHINE, strKeyPath, "NameServer", "")

Dim myvalueWINS, myvalueDNS
'On vérifie qu'on a bien des WINS

myvalueWINS = 0
myvalueDNS = &H04
If (UBound(arrWINS) >= 0) then
	If (UBound(arrWINS) = 0) then myvalueWINS = &H04
	If (UBound(arrWINS) = 1) then myvalueWINS = &H08
End if

If (UBound(arrDNS) >= 0) then
	If (UBound(arrDNS) = 0) then myvalueDNS = &H04
	If (UBound(arrDNS) = 1) then myvalueDNS = &H08
End if

'Maintenant il reste plus qu'à basculer toutes les informations IP, MASK, GATEWAY, DNS, WINS dans la configuration alternative
'Le format des IP est special: les 20 premières valeures sont fixes.
'Tableau de 95 quand 1 DNS
'Tableau de 99 quand 2 DNS
'Tableau de 127 quand 2 dns et 2 wins
'Tableau de 123 qunad 2 dns et 1 wins
'Tableau de 99 quand 1 dns et 1 wins
Dim arrBlobValues()
If (myvalueDNS = &H04 AND myvalueWINS = 0) then 
	ReDim arrBlobValues(95)
elseif (myvalueDNS = &H04 AND myvalueWINS = &H04) then 
	ReDim arrBlobValues(119)
elseif (myvalueDNS = &H04 AND myvalueWINS = &H08) then 
	ReDim arrBlobValues(123)
elseif (myvalueDNS = &H08 AND myvalueWINS = 0) then
	ReDim arrBlobValues(99)
elseif (myvalueDNS = &H08 AND myvalueWINS = &H04) then
	ReDim arrBlobValues(123)
elseif (myvalueDNS = &H08 AND myvalueWINS = &H08) then 
	ReDim arrBlobValues(127)
end if

arrBlobValues(0)  = &H32
arrBlobValues(1)  = &H00
arrBlobValues(2)  = &H00
arrBlobValues(3)  = &H00
arrBlobValues(4)  = &H00
arrBlobValues(5)  = &H00
arrBlobValues(6)  = &H00
arrBlobValues(7)  = &H00
arrBlobValues(8)  = &H04
arrBlobValues(9)  = &H00
arrBlobValues(10) = &H00
arrBlobValues(11) = &H00
arrBlobValues(12) = &H00
arrBlobValues(13) = &H00
arrBlobValues(14) = &H00
arrBlobValues(15) = &H00
arrBlobValues(16) = &HFF
arrBlobValues(17) = &HFF
arrBlobValues(18) = &HFF
arrBlobValues(19) = &H7F
'On insère les 4 octets de données correspondant à l'IP dans le tableau d'index soit 20 - 23
Dim arrIP
Dim octet
Dim index

arrIP = Split(sIP, ".")
index = 20
For Each octet in arrIP
	arrBlobValues(index) = CInt(octet)
	index = index + 1
Next

arrBlobValues(24) = &H01
	arrBlobValues(25) = &H00
	arrBlobValues(26) = &H00
	arrBlobValues(27) = &H00
	arrBlobValues(28) = &H00
	arrBlobValues(29) = &H00
	arrBlobValues(30) = &H00
	arrBlobValues(31) = &H00
	arrBlobValues(32) = &H04
	arrBlobValues(33) = &H00
	arrBlobValues(34) = &H00
	arrBlobValues(35) = &H00
	arrBlobValues(36) = &H00
	arrBlobValues(37) = &H00
	arrBlobValues(38) = &H00
	arrBlobValues(39) = &H00
	arrBlobValues(40) = &HFF
	arrBlobValues(41) = &HFF
	arrBlobValues(42) = &HFF
	arrBlobValues(43) = &H7F

arrIP = Split(sMask, ".")
index = 44
For Each octet in arrIP
	arrBlobValues(index) = CInt(octet)
	index = index + 1
Next

arrBlobValues(48) = &H03
	arrBlobValues(49) = &H00
	arrBlobValues(50) = &H00
	arrBlobValues(51) = &H00
	arrBlobValues(52) = &H00
	arrBlobValues(53) = &H00
	arrBlobValues(54) = &H00
	arrBlobValues(55) = &H00
	arrBlobValues(56) = &H04
	arrBlobValues(57) = &H00
	arrBlobValues(58) = &H00
	arrBlobValues(59) = &H00
	arrBlobValues(60) = &H00
	arrBlobValues(61) = &H00
	arrBlobValues(62) = &H00
	arrBlobValues(63) = &H00
	arrBlobValues(64) = &HFF
	arrBlobValues(65) = &HFF
	arrBlobValues(66) = &HFF
	arrBlobValues(67) = &H7F
	
arrIP = Split(sGateway, ".")
index = 68
For Each octet in arrIP
	arrBlobValues(index) = CInt(octet)
	index = index + 1
Next

arrBlobValues(72) = &H06
	arrBlobValues(73) = &H00
	arrBlobValues(74) = &H00
	arrBlobValues(75) = &H00
	arrBlobValues(76) = &H00
	arrBlobValues(77) = &H00
	arrBlobValues(78) = &H00
	arrBlobValues(79) = &H00
	arrBlobValues(80) = myvalueDNS
	arrBlobValues(81) = &H00
	arrBlobValues(82) = &H00
	arrBlobValues(83) = &H00
	arrBlobValues(84) = &H00
	arrBlobValues(85) = &H00
	arrBlobValues(86) = &H00
	arrBlobValues(87) = &H00
	arrBlobValues(88) = &HFF
	arrBlobValues(89) = &HFF
	arrBlobValues(90) = &HFF
	arrBlobValues(91) = &H7F
	

'1er serveur DNS
arrIP = Split(arrDNS(0), ".")
index = 92
For Each octet in arrIP
	arrBlobValues(index) = CInt(octet)
	index = index + 1
Next
'Si on a qu'un seul serveur dns alors ca sert à rien d'essayer d'en inserer un 2ieme !
if (myvalueDNS = &H08) then
	' 2 ieme serveur DNS
	arrIP = Split(arrDNS(1), ".")
	index = 96
	For Each octet in arrIP
		arrBlobValues(index) = CInt(octet)
		index = index + 1
	Next
end if

'mynum permet de créér un décalage d'index si toutes les cases sont pas remplie. Par exemple avec un tableau de 128, on a 2 DNS et 2 WINS, or
'si on tombe sur le cas de 1 DNS et 2 WINS, le 2ieme DNS manquant créé un trou qui génère une erreur. On doit donc décaler les indices du tableau de manière dynamique
'Mynum sert à ça.
Dim mynum
mynum = 0
 if (myvalueDNS = &H04) then mynum = 4
 
if (myvalueWINS <> 0) then 
	arrBlobValues(100-mynum) = &H2C
		arrBlobValues(101-mynum) = &H00
		arrBlobValues(102-mynum) = &H00
		arrBlobValues(103-mynum) = &H00
		arrBlobValues(104-mynum) = &H00
		arrBlobValues(105-mynum) = &H00
		arrBlobValues(106-mynum) = &H00
		arrBlobValues(107-mynum) = &H00
		arrBlobValues(108-mynum) = myvalueWINS
		arrBlobValues(109-mynum) = &H00
		arrBlobValues(110-mynum) = &H00
		arrBlobValues(111-mynum) = &H00
		arrBlobValues(112-mynum) = &H00
		arrBlobValues(113-mynum) = &H00
		arrBlobValues(114-mynum) = &H00
		arrBlobValues(115-mynum) = &H00
		arrBlobValues(116-mynum) = &HFF
		arrBlobValues(117-mynum) = &HFF
		arrBlobValues(118-mynum) = &HFF
		arrBlobValues(119-mynum) = &H7F
		

	'1er serveur WINS
	arrIP = Split(arrWINS(0), ".")
	index = 120-mynum
	For Each octet in arrIP
		arrBlobValues(index) = CInt(octet)
		index = index + 1
	Next
	if (myvalueWINS = &H08) then
	'2 ieme serveur WINS
		arrIP = Split(arrWINS(1), ".")
		index = 124-mynum
		For Each octet in arrIP
			arrBlobValues(index) = CInt(octet)
			index = index + 1
		Next
	end if
end if
'On insère la clé binaire contenant toute la configuration alternative (IP, Mask, Gateway, DNS, WINS)
strKeyPath = "SYSTEM\CurrentControlSet\Services\Dhcp\Configurations\Alternate_"  & mySID
Returned = objReg.CreateKey(HKEY_LOCAL_MACHINE, strKeyPath)
Returned = objReg.SetBinaryValue(HKEY_LOCAL_MACHINE, strKeyPath, "Options", arrBlobValues)

Conclusion :


Comme vous pouvez le voir, tout est basé sur du WMI qui attaque le registre!
Si vous avez besoin de renseignement, n'hésitez pas à me demander.

Ceci est ma première source!

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.