Salut Scripteur !Évidemment que nous nous adaptons

Les Scripteurs de Microsoft

Cet article s'appuie sur une version préliminaire de Windows Vista. Certaines informations sont susceptibles d'être modifiées.

Télécharger le code de cet article: ScriptingGuys2006_11.exe (151KB)

VOUS AVEZ PROBABLEMENT entendu dire qu'un des meilleurs moyens d'avancer dans votre carrière est de se créer un réseau, d'établir des relations avec d'autres personnes du monde actif, qui pourront vous donner des tuyaux, échanger des informations avec vous et éventuellement vous trouver un nouvel emploi. Les Scripteurs ne sont jamais vraiment fait la main sur tout cela (qui semble évident), mais nous pouvons vous assurer que nous connaissons certaines choses dans le domaine de la mise en réseau des ordinateurs. Les scripts peuvent être très utiles pour la mise en réseau.

Windows® Management Instrumentation (WMI) fournit des classes qui s'utilisent pour contrôler et surveiller l'environnement réseau. Deux de ces classes, Win32_NetworkAdapter et Win32_NetworkAdapaterConfiguration, vous permettent de travailler avec les cartes réseaux -what else?- sur votre ordinateur.

La question fréquemment posée est « Comment activer et désactiver mes cartes réseau avec un script ? » N'entretenons pas le suspense. Nous allons d'ores et déjà vous dire que c'est impossible. Du moins tant que vous n'exécutez pas Windows Vista™. Dans Windows Vista, deux nouvelles méthodes ont été ajoutées à la classe Win32_NetworkAdapter : Enable et Disable. Nous allons voir ces méthodes dans un instant. Avant que vous ne vous découragiez, nous allons vous montrer quelques fonctions qui sont disponibles avec les systèmes d'exploitation antérieurs à Windows Vista. Les débutants trouveront des détails sur les cartes réseau actuellement disponibles sur l'ordinateur (voir Figure 1). Ça a l'air intéressant, non ?

Figure 1 Trouver des cartes réseau

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapter")

For Each objItem in colItems 
    Wscript.Echo "Name: " & objItem.Name
    Wscript.Echo "Description: " & objItem.Description
    Wscript.Echo
Next

Sur la Figure 1, on commence par se connecter au service WMI avec l'ordinateur local. Il est bien sûr plus facile de trouver des cartes réseau sur votre ordinateur local avec l'interface graphique, mais essayez d'utiliser l'interface graphique pour obtenir des informations sur les cartes réseau d'un ordinateur distant. C'est une des merveilles du script, et des scripts WMI en général : vous pouvez exécuter le même script depuis un ordinateur distant simplement en remplaçant la valeur de strComputer par le nom de l'ordinateur distant.

Après s'être connecté au service WMI, on fait une requête pour la classe Win32_NetworkAdapter. Cette requête renvoie un ensemble de toutes les cartes réseau de l'ordinateur. Il suffit alors de paramétrer une boucle For Each pour parcourir l'ensemble de cartes et renvoyer le nom et la description de chacune. Votre entrée doit ressembler à ceci :

Name: Broadcom NetXtreme 57xx Gigabit Controller
Description: Broadcom NetXtreme 57xx Gigabit Controller

Name: RAS Async Adapter
Description: RAS Async Adapter

Name: WAN Miniport (L2TP)
Description: WAN Miniport (L2TP)

Name: WAN Miniport (PPTP)
Description: WAN Miniport (PPTP)

Vous pouvez trouver beaucoup plus d'informations sur vos cartes réseau en renvoyant différentes propriétés de Win32_NetworkAdapter, tel DeviceID, Manufacturer et TimeOfLastReset. Pour plus d'informations, voir l'opus magnum « Automatiser le réseau TCP/IP des clients »,found-where else?—sur le Script Center.

Adaptation aux modifications

La classe Win32_NetworkAdapter ne permet que de retrouver des informations sur vos cartes réseau. Si vous souhaitez modifier les paramètres de la carte réseau, vous devez utiliser la classe Win32_NetworkAdapterConfiguration. Cette classe ne donne pas seulement des informations supplémentaires sur les cartes réseau (grâce aux propriétés introuvables dans Win32_NetworkAdapter), mais permet aussi de configurer votre carte réseau comme vous le souhaitez.

Vous ne pouvez, par exemple, pas activer ou désactiver les cartes réseau, mais vous pouvez activer ou désactiver le protocole DHCP (Dynamic Host Configuration Protocol) sur les cartes pour lesquelles TCP/IP est activé. La Figure 2 présente un script qui recherche toutes les cartes pour lesquelles TCP/IP est activé, qui vérifie que chaque DHCP est activé sur chaque carte et qui l'active si tel n'est pas le cas.

Figure 2 Activation du DHCP

strComputer = "." 
Set objWMIService = GetObject _
    ("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_NetworkAdapterConfiguration Where IPEnabled = 'True'")

For Each objItem in colItems
    If objItem.DHCPEnabled = False Then
        Wscript.Echo objItem.Caption
        intReturn = objItem.EnableDHCP
        Select Case intReturn
            Case 0
                Wscript.Echo "DHCP enabled"
            Case 1
                Wscript.Echo "You must reboot before DHCP will be enabled"
            Case Else
                Wscript.Echo "Error occurred"
        End Select
        Wscript.Echo
    End If
Next

De la même façon que le script de la Figure 1, le script de la Figure 2 se connecte au service WMI sur l'ordinateur local. Il fait alors une requête pour la classe Win32_NetworkAdapterConfiguration. Notez que nous avons ajouté une clause Where dans notre requête car nous somme uniquement intéressés par les cartes pour lesquelles TCP/IP est activé :

Where IPEnabled = 'True'

cette clause spécifie que nous ne voulons que des instances de la classe Win32_NetworkAdapterConfiguration dans lesquelles la propriété IPEnabled est True, ce qui signifie que le TCP/IP est activé pour la carte associée à cette instance.

Ensuite, on utilise une boucle For Each pour itérer dans l'ensemble de cartes renvoyé par notre requête. Dans la boucle, on vérifie d'abord la propriété DHCPEnabled de chaque carte. Si la propriété est False, le DHCP n'est pas activé, il faut donc l'activer. Cela se fait en appelant la méthode EnableDHCP sur l'objet carte. C'est tout ce qu'il y a à faire.

Pour simplifier ce qui se passe dans le script, nous renvoyons la propriété Caption afin de savoir avec quelle carte nous travaillons. Nous avons également utilisé une instruction Select Case et créé des descripteurs de tous les résultats possibles pour l'utilisateur final. La méthode EnableDHCP renvoie une valeur entière à la fin. Une valeur de 0 signifie que la méthode a été exécutée avec succès et que le DHCP est activé. Une valeur de 1 signifie que la méthode a été exécutée avec succès mais que l'ordinateur a besoin d'être redémarré pour que la modification soit prise en compte. Toute autre valeur signifie que la manipulation n'a pas fonctionné correctement et que le DHCP n'a pas été activé. On utilise l'instruction Select Case pour vérifier les valeurs entières et renvoyer un message approprié.

Vous pouvez désactiver le DHCP en paramétrant une adresse IP statique et un masque de sous-réseau sur la carte (voir Figure 3).

Figure 3 Configuration d'une adresse IP

arrIPAddress = Array("192.168.0.12")
arrSubnetMask = Array("255.255.255.0")

strComputer = "." 
Set objWMIService = GetObject _
    ("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_NetworkAdapterConfiguration Where IPEnabled = 'True'")

For Each objItem in colItems
    If objItem.DHCPEnabled = True Then
        Wscript.Echo objItem.Caption
        intReturn = objItem.EnableStatic(arrIPAddress, arrSubnetMask)
        Select Case intReturn
            Case 0
                Wscript.Echo "Static address assigned"
            Case 1
                Wscript.Echo "You must reboot before the static address will take effect"
            Case Else
                Wscript.Echo "Error occurred"
        End Select
        Wscript.Echo
    End If
Next

Le script de la Figure 3 est pratiquement identique au script de la Figure 2, à quelques différences clés près. Au début du script, on déclare deux groupes, arrIPAddress et arrSubnetMask, et on assigne une valeur à chacun. Puis dans la boucle For Each, au lieu de vérifier que la propriété DHCPEnabled est False, on vérifie qu'elle est True, signifiant que le DHCP est activé (et qu'on veut le désactiver). Puis on appelle la méthode EnableStatic de l'objet carte. Vous verrez que, contrairement à la méthode EnableDHCP, EnableStatic accepte des paramètres. Ces paramètres correspondent aux groupes que l'on a déclarés auparavant, ils contiennent la nouvelle adresse IP statique et le masque de sous-réseau.

Les plus de Windows Vista

Comme promis (car les Scripteurs tiennent toujours, ou presque, leurs promesses), nous allons maintenant vous montrer ce que vous pouvez faire dans Windows Vista. Comme nous l'avons vu plus tôt, la classe WMI Win32_NetworkAdapter possède deux nouvelles méthodes dans Windows Vista : Enable et Disable. Celles-ci vous permettent d'activer et de désactiver vos cartes réseau. Il existe aussi une nouvelle propriété, NetEnabled, qui prend la valeur True si la carte est activée et False si elle ne l'est pas. La Figure 4 présente un script qui trouve toutes les cartes réseau désactivées sur l'ordinateur puis les active.

Figure 4 Activation des cartes réseau

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_NetworkAdapter Where NetEnabled = 'False'")

For Each objItem in colItems 
    Wscript.Echo "Name: " & objItem.Name
    Wscript.Echo "Description: " & objItem.Description
    objItem.Enable
    Wscript.Echo
Next

Ce qui suit est presque identique à ce que nous avons vu dans la Figure 1. (Au cas où vous ne l'auriez pas remarqué, nous sommes de grands défenseurs de la réutilisation.) Nous nous connectons au service WMI sur l'ordinateur local et faisons une requête pour toutes les instances de Win32_NetworkAdapter. Comme nous ne nous intéressons qu'aux cartes désactivées, nous avons ajouté une clause Where :

Where NetEnabled = 'False'

cette clause utilise la nouvelle propriété NetEnabled qui spécifie que seules les cartes pour lesquelles NetEnabled est False, en d'autres termes, lorsque la carte réseau est désactivée, sont renvoyées par la requête. Une fois de plus, nous paramétrons une boucle à boucle For Each dans l'ensemble des objets cartes réseau renvoyés par la requête. Après avoir renvoyé le nom et la description de la carte, on appelle la méthode Enable pour activer la carte.

C'est assez simple, non ? Si seulement on pouvait dès à présent maîtriser cet autre type de mise en réseau.

Les Scripteurs de MicrosoftLes Scripteurs travaillent pour... sont en fait employés par Microsoft. Lorsqu'ils ne jouent, regardent ou n'entraînent pas une équipe de base-ball (ou d'autres activités), ils exécutent le Centre de Script TechNet. Il est disponible sur www.scriptingguys.com.

© 2008 Microsoft Corporation et CMP Media, LLC. Tous droits réservés. Toute reproduction, totale ou partielle, est interdite sans autorisation préalable.