Plateformes testées: WinXP – WinServer2003
Le script présenté dans cette article permet de changer la type de syncro et la vitesse des NIC (Network Interface Controller).
En effet, il est parfois nécessaire de forcer un type de syncro avec certains équipement (ex: 10/full, 100/half…)
L’action du script est principalement un changement de valeur de la base de registre en fonction du model du NIC, puis de log des changements effectués.
Le script « SetSpeed.vbs » appelle le fichier « cardlist.ini » pour déterminer les valeurs à modifier en fonction du NIC renseigné.
Le fonctionnement du script est détaillé dans les commentaires du code:

'--------------------------------------
' Déclaration variables, references...
'--------------------------------------
Const HKLM = &H80000002
'Chemin de la cle de registre contennant les dossiers des NICs
sNetPath ="System\Currentcontrolset\Control\Class\{4D36E972-E325-11CE-BFC1-08002be10318}"

'Reference vers un objet WMI représentant le registre
strComputer = "."
Set objRegistry = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")

'Reference vers un nouvelle objet FileSystemObject permettant de manipuler des fichiers
Set fso = CreateObject("Scripting.FileSystemObject")
'----------- FIN Declaration -----------

'Execution de la fonction SetSpeedDuplex()
SetSpeedDuplex()

'Implementation de SetSpeedDuplex()
Sub SetSpeedDuplex()
	'Declaration des variable (portee de la fonction)
	Dim section, strValue, subkey, arrSubKeys, totalUpdate
	totalUpdate = 0
	'Appel de la methode de l'objet objRegistry listant les cles dans le tableau arrSubKeys
	Call objRegistry.EnumKey(HKLM, sNetPath, arrSubKeys)
	For Each subkey In arrSubKeys
		'Recuperation de la valeur du ComponentId du NIC et la place dans strValue
		'GetStringvalue(Chemin primaire, chemin de clé, tableau de valeur de cles)
		Call objRegistry.GetStringvalue(HKLM, sNetPath & "\" & subkey, "ComponentId", strValue)
		'Si ComponentId n'est pas vide (exist)
		if not isnull(strValue) then
			'Conversion en minuscule
			strValue = lcase(strValue)
			'Enleve la partie pci\ven_ et &dev_ du ComponentId et recupere les 8 premiers caracteres
			'Exemple:
			'pci\ven_8086&dev_10f5&subsys_024d1028 => 8086&dev_10f5&subsys_024d1028 => 808610f5&subsys_024d1028 => 808610f5
			section = left(replace(replace(strValue, "pci\ven_", ""), "&dev_", ""), 8)
			'Appel de la fonction ReadDuplexIni plus comptabilisation
			totalUpdate = totalUpdate + ReadDuplexIni(section, subkey)
		end if
	Next
	'WScript.Echo "NICs MAJ: " & totalUpdate
	logComputer(totalUpdate)
End Sub

'Implementation de ReadDuplexIni()
Function ReadDuplexIni(section, subkey)
	'Declaration des variable (portee de la fonction)
	Dim ini, line, file, valUpdate
	valUpdate = 0
	'Nom du fichier ini
	file = "cardList.ini"
	'Verification de l'existance du fichier ini
	If fso.FileExists(file) Then
		'Reference vers le contenu du fichier
		Set ini = fso.OpenTextFile(file, 1, False)
		'Tant que le EOF n'est pas atteind lecture ligne par ligne
		Do While ini.AtEndOfStream = False
			'Ligne lu stockee dans la variable line
			line = ini.ReadLine
			'Si valeur ligne = [(variable section)] Exemple: [808610f5]
			If lcase(line) = "[" & lcase(section) & "]" Then
				'Lecture de la ligne suivante
				line = ini.ReadLine
				'Si le premier caractere de la ligne est différent de "["
				Do While Left(line, 1) <> "["
					'Si le premier caractere est différent de ";" et la ligne n'est pas vide
					If left(line, 1) <> ";" and len(line) > 0 Then
						'Appel de la fonction UpdateReg() Exemple: UpdateReg(SpeedDuplex=0, HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}\0008 )
						Call UpdateReg(line, subkey)
						valUpdate = valUpdate + 1
					End If
					'Au cas ou le EOF est apres une entree [808610f5] dans le fichier ini
					If ini.AtEndOfStream Then
						Exit Do 'Sort de la boucle Do While
					End If '                              |
					line = ini.ReadLine 'ligne suivante   |
				Loop '<-----------------------------------'
				Exit Do 'Sort de la boucle Do While
			End If '                |
		Loop '<---------------------'
		ini.Close 'Ferme le stream ouvert sur le fichier ini
	End If
	ReadDuplexIni = valUpdate
End Function

'Implementation de la fonction de changement de valeur du registre
Sub UpdateReg(line, subkey)
	'Recuperation du nom de cle key(0) et de sa valeur key(1) dans le tableau key
	key = split(line, "=")
	Call objRegistry.SetStringValue(HKLM, sNetPath & "\" & subkey, key(0), key(1))
End Sub

Sub logComputer(totalUpdate)
	Dim rootLog, file
	rootLog = "\\FileServer\log" 'Exemple: \\FileServer\log ou C:\temp\log
	'Reference vers un objet de type Shell
	Set wshShell = CreateObject("Wscript.Shell")
	strOrdi = wshShell.ExpandEnvironmentStrings("%COMPUTERNAME%")
	'Attributs du stream OpenTextFile
	Const reading = 1, writing = 2
	If totalUpdate > 0 Then
		If fso.FileExists(rootLog & "\NIC_Speed\Error\" & strOrdi & ".txt") Then
			fso.DeleteFile(rootLog & "\NIC_Speed\Error\" & strOrdi & ".txt")
		End If
		If Not fso.FileExists(rootLog & "\NIC_Speed\Success\" & strOrdi &".txt") Then
			Set file = fso.OpenTextFile(rootLog & "\NIC_Speed\Success\" & strOrdi &".txt", writing,true)
			file.write(totalUpdate)
			file.close
		End If
	Else
		If Not fso.FileExists(rootLog & "\NIC_Speed\Error\" & strOrdi & ".txt") Then
			Set file = fso.OpenTextFile( rootLog & "\NIC_Speed\Error\" & strOrdi & ".txt", writing,true)
			file.write(totalUpdate)
			file.close
		End If
	End If
End Sub
[808610f5]
;Intel(R) 82567LM Gigabit Network Connection
;pci\ven_8086&dev_10f5
SpeedDuplex=0

[808610de]
;Intel(R) 82567LM-3 Gigabit Network Connection
;pci\ven_8086&dev_10de
*SpeedDuplex=0

[14e41600]
;Broadcom NetXtreme 57xx Gigabit Controller
;pci\ven_14e4&dev_1600
RequestedMediaType=0

[14e41677]
;Broadcom NetXtreme 57xx Gigabit Controller
;pci\ven_14e4&dev_1677
RequestedMediaType=0

[14e4167a]
;Broadcom NetXtreme 57xx Gigabit Controller
;pci\ven_14e4&dev_167a
RequestedMediaType=0

La liste des NICs installés sur la machines est dans l’arborescence du registre suivante:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}

Chaque dossier dans cette arborescence représente un NIC.
Dans ces dossiers certaines clés nous intéressent particulièrement:
- La clé « DriverDesc » vous permet d’identifier le NIC grâce à sa dénomination « courante ».
- La clé « ComponentId » permet d’identifier le NIC de façon unique. Il est construit de la façon suivante:

pci\ven_XXXX&dev_YYYY&subsys_ZZZZZZZZ

X=ven (identifiant « vendor » du NIC)
Y=dev (identifiant du model du « device »)
Z=subsys (identifiant unique de la carte)
Dans le fichier « cardlist.ini », les interfaces sont reconnues graçe a un tag de forme [XXXXYYYY] (« vendor » suivi du « device »)
- Une dernière clé désigne le type de connectivité, malheureusement le nom de la clé est différente celons les modèles de NIC.
Exemple:
Intel 82567LM => SpeedDuplex=0 (0=auto, 1=10Half, 2=10Full, 3=100Half,etc…)
Intel 82567LM-3 => *SpeedDuplex=0
Broadcom => RequestedMediaType=0

Pour identifier la valeur qui vous intéresse vous pouvez changer manuellement la vitesse de la carte, puis regarder quelle valeur a pris la clé de registre.

Démarrer > Paramètres > Panneau de configuration > Connexions Réseaux
Sur l'interface qui nous interésse:
Clique droit > Propriétés
Cliquer sur "Configurer..."
Enfin onglet "Vitesse de Liaison"

Il ne vous reste plus qu’a placer ce script de démarrage dans une GPO Ordinateur et le tour est joué!

Info: Le changement de speed créé une déco/reco de l’interface. Cependant je n’ai pas constaté de problème particulier dans un contexte de domaine ActiveDirectory