Root of Art
Script VBS – Vitesse de liaison ethernet
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
Imprimer l'article | Cette entrée a été posté par 3DXirtam le 16 novembre 2010 à 14 h 12 min, et placée dans Non classé. Vous pouvez suivre les réponses à cette entrée via RSS 2.0. Vous pouvez laisser une réponse, ou bien un trackback depuis votre site. |