Hey, Scripting Guy!Certo che siamo adattabili

Microsoft Scripting Guys

Questo articolo si riferisce a una versione preliminare di Windows Vista. Alcune informazioni qui contenute sono soggette a modifiche.

Scarica il codice per questo articolo: ScriptingGuys2006_11.exe (151KB)

PROBABILMENTE il lettore sa già che uno dei modi migliori per avanzare di carriera è farsi una rete di conoscenze, instaurare rapporti con altre persone che lavorano nel settore in modo da poter imparare da loro, condividere informazioni con loro e, se possibile, ottenere da queste un nuovo posto di lavoro. Noi Scripting Guys non siamo molto esperti di reti di conoscenze (anche se dovrebbe essere cosa ovvia), ma in compenso sappiamo una cosa o due sulle reti informatiche. O meglio... con gli script possiamo fare meraviglie nelle reti informatiche.

Strumentazione gestione Windows® (WMI) rende disponibili diverse classi che possono essere utilizzate per controllare e monitorare l'ambiente di rete. Due di queste classi, Win32_NetworkAdapter e Win32_NetworkAdapterConfiguration, consentono di agire sulle schede di rete presenti sui computer.

Una domanda che ci viene fatta spesso è la seguente: "Come è possibile abilitare e disabilitare le schede di rete con uno script?" Beh, non terremo il lettore col fiato sospeso. Gli diremo subito che è impossibile. Almeno fino a quando non avrà Windows Vista™. In Windows Vista sono stati aggiunti due metodi alla classe Win32_NetworkAdapter, Enable e Disable. Daremo un'occhiata a questi due metodi tra un instante. Ma prima mostreremo al lettore alcune cose che può fare con le versioni preliminari del sistema operativo Windows Vista. Per i principianti, diciamo subito che è possibile scoprire quali schede di rete sono disponibili sul computer (vedere la figura 1). Niente male, vero?

Figure 1 Individuazione delle schede di rete

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

In figura 1, cominciamo con l'eseguire la connessione al servizio WMI sul computer locale. Anche se è facile individuare le schede di rete sul computer locale con l'interfaccia utente grafica, ottenere informazioni sulle schede di rete su un computer remoto con la stessa interfaccia è tutt'altra cosa. Una delle meraviglie di questo script e degli script WMI in generale è che si può eseguire il medesimo script su un computer remoto impostando semplicemente il valore di strComputer sul nome del computer remoto.

Dopo aver eseguito la connessione al servizio WMI, eseguiamo una query per la classe Win32_NetworkAdapter. Questa query restituisce l'insieme di tutte le schede di rete del computer. A questo punto, dobbiamo semplicemente impostare un ciclo For Each per scorrere l'insieme delle schede di rete e visualizzare il nome (Name) e la descrizione (Description) di ognuna. I dati ottenuti avranno questo aspetto:

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)

Ci sono molte altre informazioni che si possono ottenere sulle schede di rete visualizzando semplicemente alcune proprietà di Win32_NetworkAdapter, quali DeviceID, Manufacturer e TimeOfLastReset. Per ulteriori informazioni, vedere il documento "Automating TCP/IP Networking on Clients" nello Script Center (in inglese).

Adattarsi ai cambiamenti

La classe Win32_NetworkAdapter consente solamente di ottenere informazioni sulle schede di rete. Se si desidera modificare una delle impostazioni di una scheda, si deve utilizzare la classe Win32_NetworkAdapterConfiguration. Questa classe non solo fornisce informazioni aggiuntive sulle schede di rete (grazie a proprietà non disponibili in Win32_NetworkAdapter), ma rende anche disponibili vari metodi per configurarle.

Ad esempio, se non si riesce ad abilitare e disabilitare le schede, si può abilitare e disabilitare il protocollo DHCP (Dynamic Host Configuration Protocol) su ogni scheda abilitate a TCP/IP. Nella figura 2 è illustrato uno script che cerca tutte le schede abilitate per TCP/IP, controlla se DHCP è abilitato su ogni scheda e, se non lo è, lo abilita.

Figure 2 Abilitazione di 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

Analogamente allo script della figura 1, lo script della figura 2 esegue la connessione al servizio WMI sul computer locale, quindi esegue una query per la classe Win32_NetworkAdapterConfiguration. Si osservi che, poiché ci interessano solo le schede che sono abilitate per TCP/IP, abbiamo incluso nella query la seguente clausola Where:

Where IPEnabled = 'True'

Questa clausola specifica la richiesta delle sole istanze della classe Win32_NetworkAdapterConfiguration in cui la proprietà IPEnabled è impostata su True, il che significa che la scheda associata a quell'istanza è abilitata per TCP/IP.

Utilizziamo poi un ciclo For Each per eseguire un'iterazione nell'insieme delle schede restituite dalla query. All'interno del ciclo, controlliamo dapprima la proprietà DHCPEnabled di ogni scheda. Se questa proprietà è impostata su False, significa che il protocollo DHCP non è abilitato, quindi vogliamo abilitarlo. Lo facciamo chiamando il metodo EnableDHCP per l'oggetto scheda. Tutto qui.

Per chiarire quello che succede nello script, abbiamo visualizzato la proprietà Caption in modo da sapere su quali schede stiamo lavorando. Abbiamo anche incluso un'istruzione Select Case e creato descrittori di ogni risultato possibile per l'utente finale. Al termine, il metodo EnableDHCP restituisce un valore intero. Il valore 0 significa che il metodo è stato eseguito correttamente e che DHCP è abilitato. Il valore 1 significa che il metodo è stato eseguito correttamente, ma il computer deve essere riavviato per rendere operativa la modifica. Qualsiasi altro valore significa che qualcosa non ha funzionato correttamente e DHCP non è stato abilitato. L'istruzione Select Case serve a controllare questi valori interi e a restituire un messaggio appropriato.

È anche possibile disabilitare DHCP impostando un indirizzo IP statico e una subnet mask per la scheda (vedere la figura 3).

Figure 3 Impostazione di un indirizzo 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

Lo script mostrato nella figura 3 è molto simile allo script della figura 2, ma presenta alcune differenze fondamentali. All'inizio dello script dichiariamo due matrici, arrIPAddress e arrSubnetMask, e assegniamo un valore a ognuna. In seguito, nel nostro ciclo For Each, invece di controllare se DHCPEnabled è impostato su False, controlliamo se è impostato su True, il che significa che DHCP è abilitato (e vogliamo quindi disabilitarlo). Chiamiamo quindi il metodo EnableStatic per l'oggetto scheda. Si osservi che, diversamente dal metodo EnableDHCP, EnableStatic accetta dei parametri. Questi parametri sono le matrici dichiarate in precedenza contenenti il nuovo indirizzo IP statico e la subnet mask.

Novità di Windows Vista

Come promesso (perché gli Scripting Guys mantengono sempre - o quasi - le promesse), mostreremo ora al lettore che cosa si può fare in Windows Vista. Come abbiamo già detto, in Windows Vista la classe Win32_NetworkAdapter di WMI ha due nuovi metodi, Enable e Disable, che consentono di abilitare e disabilitare le schede di rete. C'è anche una nuova proprietà, NetEnabled, che restituisce il valore True se la scheda è abilitata e False se non lo è. Nella figura 4 è illustrato uno script che individua le schede di rete disabilitate sul computer per poi abilitarle.

Figure 4 Abilitazione delle schede di rete

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

Questo codice è quasi identico allo script illustrato nella figura 1 (nel caso in cui il lettore non lo abbia notato, siamo molto propensi a riciclare il nostro lavoro). Effettuiamo la connessione al servizio WMI sul computer locale ed eseguiamo una query per tutte le istanze di Win32_NetworkAdapter. Poiché ci interessano solo le schede che sono disabilitate, abbiamo aggiunto la seguente clausola Where:

Where NetEnabled = 'False'

Questa clausola utilizza la nuova proprietà NetEnabled per specificare che solo le schede nelle quali la proprietà NetEnabled è impostata su False (ovvero solo le schede di rete disabilitate) devono essere restituite dalla query. Quindi impostiamo ancora una volta il ciclo For Each per scorrere l'insieme degli oggetti scheda di rete restituiti dalla query. Dopo aver visualizzato il nome (Name) e la descrizione (Description) della scheda, richiamiamo il metodo Enable per abilitarla.

Semplice, vero? Se solo potessimo imparare una o due cose utili sulle reti di conoscenze personali...

Microsoft Scripting GuysGli Scripting Guys lavorano per Microsoft, o meglio... sono dipendenti Microsoft. Quando non giocano, non allenano una squadra e non guardano partite di baseball (tre le altre attività), gestiscono il TechNet Script Center all'indirizzo www.scriptingguys.com (in inglese).

© 2008 Microsoft Corporation e CMP Media, LLC. Tutti i diritti riservati. È vietata la riproduzione completa o parziale senza autorizzazione.