¡Hola, chicos del scripting!Claro que somos flexibles

Los chicos del scripting de Microsoft

Esta columna se basa en una versión preliminar de Windows Vista. Por tanto, es necesario tener en cuenta que cierta información de este documento está sujeta a cambios.

Descargar el código de este artículo: ScriptingGuys2006_11.exe (151KB)

SEGURAMENTE habrá oído que uno de los mejores modos de hacer carrera es tener una buena red de conexiones, ya sabe, conectarse con otros profesionales del sector para aprender de ellos, compartir información y, quizá, conseguir un nuevo puesto de trabajo. Los chicos del scripting no comprendemos muy bien eso de la red de conexiones (que debería estar muy claro), pero sabemos bastante sobre los equipos conectados en red. ¿Por qué? Porque se puede sacar mucho jugo a las conexiones de red con las secuencias de comandos.

El servicio Instrumental de administración de Windows® (WMI) proporciona varias clases que puede usar para controlar y supervisar el entorno de red. Dos de esas clases, Win32_NetworkAdapter y Win32_NetworkAdapaterConfiguration, le permiten trabajar, cómo no, con los adaptadores de red de los equipos.

A menudo nos preguntan: "¿Cómo habilito y deshabilito los adaptadores de red con una secuencia de comandos?" No le tendremos con el alma en vilo. Que sepa desde ya que no se puede. Al menos, no se puede si no ejecuta Windows Vista™. En Windows Vista, se han agregado dos métodos nuevos a la clase Win32_NetworkAdapter: Enable y Disable. Ahora explicaremos esos métodos en profundidad, pero primero, antes de que se desanime, le enseñaremos qué posibilidades ofrecen los sistemas operativos anteriores a Windows Vista. Para empezar, puede saber qué adaptadores de red están disponibles en el equipo (consulte la figura 1). No está mal, ¿a que no?

Figure 1 Búsqueda de adaptadores de red

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

En la figura 1, empezamos por conectarnos al servicio WMI del equipo local. Sí, resulta facilísimo buscar los adaptadores de red del equipo local mediante la GUI, pero intente usarla para obtener información sobre los adaptadores de un equipo remoto. Una de las ventajas de esta secuencia de comandos y, en general, de WMI es que puede ejecutar la misma secuencia de comandos en un equipo remoto con tan sólo cambiar el valor de strComputer por el nombre del equipo remoto.

Después de conectarnos al servicio WMI, consultamos la clase Win32_NetworkAdapter. La consulta devuelve una colección de todos los adaptadores de red del equipo. A partir de ahí, sólo tenemos que configurar un bucle For Each para recorrer la colección de adaptadores y repetir el nombre y la descripción de cada uno. El resultado será parecido a lo siguiente:

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)

Puede recuperar mucha más información sobre los adaptadores de red con tan sólo repetir las distintas propiedades de Win32_NetworkAdapter, por ejemplo, DeviceID, Manufacturer y TimeOfLastReset. Para más información, consulte la gran obra "Automatización de una red TCP/IP en equipos cliente" (puede estar en inglés), que encontrará, dónde si no, en el Script Center.

Adaptación al cambio

Con la clase Win32_NetworkAdapter, sólo puede recuperar información sobre los adaptadores de red. Si desea cambiar la configuración del adaptador, tiene que recurrir a la clase Win32_NetworkAdapterConfiguration. Esta clase no sólo proporciona información adicional sobre los adaptadores (gracias a las propiedades que no tiene Win32_NetworkAdapter), sino que también ofrece varios métodos que le permiten configurarlos a su gusto.

Por ejemplo, quizá no pueda habilitar ni deshabilitar los adaptadores, pero puede habilitar o deshabilitar el Protocolo de configuración dinámica de host (DHCP) de cada adaptador habilitado para TCP/IP. En la figura 2 aparece una secuencia de comandos que busca todos los adaptadores habilitados para TCP/IP, verifica que DHCP esté habilitado y, si no lo está, lo habilita.

Figure 2 Habilitación de 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

Igual que la secuencia de comandos de la figura 1, el comando de la figura 2 se conecta al servicio WMI del equipo local. Después, consultamos la clase Win32_NetworkAdapterConfiguration. Fíjese. Como sólo nos interesan los adaptadores habilitados para TCP/IP, hemos incluido una cláusula Where en la consulta:

Where IPEnabled = 'True'

Con la cláusula, especificamos que sólo queremos las instancias de la clase Win32_NetworkAdapterConfiguration donde la propiedad IPEnabled sea igual a True, es decir, que el adaptador asociado a esa instancia esté habilitado para TCP/IP.

A continuación, empleamos un bucle For Each para repasar la colección de adaptadores que ha devuelto la consulta. Dentro del bucle, primero comprobamos la propiedad DHCPEnabled de cada adaptador. Si la propiedad está establecida en False, ese DHCP no está habilitado, así que lo habilitamos. ¿Cómo? Llamamos al método EnableDHCP en el objeto de adaptador. Así de sencillo.

Para que resulte aún más sencillo ver lo que pasa en la secuencia de comandos, repetimos la propiedad Caption y sabemos con qué adaptadores trabajamos. También incluimos una instrucción Select Case y creamos descriptores de cada resultado posible para el usuario final. Cuando termina, el método EnableDHCP devuelve un valor entero. Con un valor de 0, el método se ha ejecutado correctamente y DHCP está habilitado. Con un valor de 1, el método se ha ejecutado correctamente, pero hace falta reiniciar el equipo para que se efectúe el cambio. Con cualquier otro valor, se ha producido algún error y DHCP no está habilitado. Con la instrucción Select Case, se comprueban esos valores enteros y se devuelve un mensaje acorde.

También puede deshabilitar DHCP. Para ello, configure una dirección IP estática y una máscara de subred en el adaptador (consulte la figura 3).

Figure 3 Configuración de direcciones 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

La secuencia de comandos de la figura 3 es casi idéntica al comando de la figura 2, con unas diferencias clave. Al principio de la secuencia de comandos, declaramos dos matrices, arrIPAddress y arrSubnetMask, y les asignamos un valor. Después, en el bucle For Each, en lugar de comprobar si DHCPEnabled es igual a False, comprobamos que sea igual a True, lo que significará que DHCP está habilitado (y, a su vez, que deseamos deshabilitarlo). Entonces, llamamos al método EnableStatic en el objeto de adaptador. Verá que, a diferencia de EnableDHCP, el método EnableStatic admite parámetros. Esos parámetros son las matrices que declaramos antes con la nueva dirección IP estática y la máscara de subred.

Ampliaciones de Windows Vista

Como lo prometido es deuda (porque los chicos del scripting nunca, o casi nunca, incumplen su palabra), ahora le enseñaremos qué posibilidades ofrece Windows Vista. Como ya hemos explicado, en Windows Vista, la clase Win32_NetworkAdapter de WMI tiene dos métodos nuevos: Enable y Disable, que le permiten habilitar y deshabilitar los adaptadores de red. También hay una nueva propiedad, NetEnabled, que devuelve el valor de True si el adaptador está habilitado, y de False si no lo está. En la figura 4 aparece una secuencia de comandos que busca todos los adaptadores de red del equipo que estén deshabilitados y los habilita.

Figure 4 Habilitación de adaptadores de red

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

Es casi idéntico a la secuencia de comandos que aparecía en la figura 1. Por si no se ha dado cuenta, nos encanta reciclar. Nos conectamos al servicio WMI del equipo local y consultamos todas las instancias de Win32_NetworkAdapter. Como sólo nos interesan los adaptadores deshabilitados, agregamos una cláusula Where:

Where NetEnabled = 'False'

Esta cláusula usa la nueva propiedad NetEnabled para especificar que la consulta sólo devuelva los adaptadores donde NetEnabled esté establecido en False, es decir, donde el adaptador de red esté deshabilitado. A continuación, configuramos un bucle For Each para repasar la colección de objetos de adaptador de red que ha devuelto la consulta. Después de repetir el nombre y la descripción del adaptador, llamamos al método Enable para habilitarlo.

Pan comido, ¿a que sí? Ojalá comprendiéramos también ese otro tipo de red de conexiones...

Los chicos del scripting de MicrosoftLos chicos del scripting trabajan para Microsoft, mejor dicho, están empleados por Microsoft. Cuando no juegan al béisbol, ni entrenan ni lo ven (u otras actividades varias), dirigen el TechNet Script Center. Visite la página web www.scriptingguys.com.

© 2008 Microsoft Corporation and CMP Media, LLC. Reservados todos los derechos; queda prohibida la reproducción parcial o total sin previa autorización.