¡Hola, chicos del scripting!

Bienvenido a la columna TechNet en la cual, por medio de Microsoft Scripting Guy, se abordan las preguntas frecuentes acerca de las secuencias de comandos para la administración de sistemas. ¿Tiene alguna pregunta sobre las secuencias de comandos para la administración de sistemas? Envíe un correo electrónico a scripter@microsoft.com. No podemos garantizarle que seremos capaces de responder todas las preguntas que nos lleguen, pero haremos todo lo posible.

Y no se olvide de consultar el Archivo de ¡Hola, chicos del scripting!.

Pregunta del día: ¿cómo puedo determinar el nombre del equipo local con WMI?


¿Cómo puedo determinar el nombre del equipo local con WMI?

P

¡Hola, chicos del scripting! ¿Cómo puedo determinar el nombre del equipo local con WMI?

-- BM

R Hola BM. Como ha indicado en su mensaje de correo electrónico, los chicos del scripting siempre decimos a nuestros lectores que, en WMI, basta con utilizar un punto (.) para hacer referencia al equipo local. Por ejemplo, esta pequeña secuencia de comandos conecta con el servicio WMI en el equipo local:
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Muy interesante, ¿verdad? Pero por supuesto, como ha señalado, esto es sólo la mitad de la historia: efectivamente podemos utilizar un punto para hacer referencia al equipo local, pero ¿qué ocurre si deseamos saber el nombre de dicho equipo? Para llevar a cabo esa tarea, ayudarle a determinar el nombre del equipo al que el punto representa, los chicos del scripting no hemos servido de gran ayuda.

Nota. Sinceramente, no es propio de los chicos del scripting abandonar un trabajo a medio hacer. ¡Normalmente ni siquiera hemos llegado a la mitad cuando ya hemos abandonado!


Antes de continuar, deberíamos detenernos un momento y poner remedio al escepticismo de nuestro público. Sin duda algunos estarán mirando la pregunta de hoy y pensando: “¿Tanto alboroto para eso? Si la secuencia de comandos se ejecuta en el equipo local, entonces ¿qué más nos da cuál sea el nombre del equipo local? Y si se ejecuta de modo remoto, entonces ¿no conoceríamos ya el nombre del equipo en el que se ejecuta? ¿No se establecería simplemente el valor de la variable strComputer como el nombre de ese equipo remoto?”.

La respuesta a todas esas preguntas es la misma: quizá sí. Pero quizá no. Por ejemplo, supongamos que nuestro código se ejecuta como parte de una secuencia de comandos de inicio de sesión o de inicio del equipo y que necesitamos registrar los datos recopilados en una base de datos. En uno de esos escenarios necesitamos conocer el nombre del equipo. La secuencia se ejecutará correctamente si utilizamos un punto para representar el nombre del equipo, pero no podemos depender por completo del punto ya que, de hacerlo así, nuestra base de datos terminaría con un aspecto similar al siguiente:

Equipo Número de procesadores
. 1
. 2
. 4
. 1


Aunque queda muy bonito, no ofrece demasiada información. Ni que decir tiene que una tabla como la siguiente resultaría algo más útil:

Equipo Número de procesadores
atl-ws-01 1
atl-fs-02 2
atl-dc-03 4
atl-ws-04 1


De forma similar, habrá ocasiones en que necesitemos obtener el nombre del equipo cuando trabajemos con equipos remotos. Con WMI es posible conectar con un equipo remoto si se especifica el nombre del mismo; sin embargo, también se puede conectar mediante la especificación de una dirección IP:

strComputer = "192.168.1.1"

Set objWMIService = GetObject("winmgmts:\" & strComputer & "\root\cimv2")

Como muy pocos de nosotros sabemos de memoria las direcciones IP de todos nuestros equipos (y como, gracias a DHCP, muchas de estas direcciones IP suelen cambiar) una tabla como la siguiente tampoco resulta excesivamente útil:

Equipo Número de procesadores
192.168.1.1 1
192.168.1.2 2
192.168.1.3 4
192.168.1.4 1


En otras palabras, a pesar de vivir en la era de la alta tecnología, algo tan pasado de moda como es un nombre puede resultar de gran utilidad. (Esto suena extraño viniendo de un grupo que se oculta tras el mote colectivo de “los chicos del scripting”, ¿no?)

Así pues, ¿podemos utilizar WMI para determinar el nombre del equipo local (o, digamos, de un equipo remoto del que sólo conocemos la dirección IP)? Por supuesto que sí. Y si además decimos que existen centenares de métodos diferentes de hacerlo, no hablamos en broma. Por ejemplo, suponga que siente un enorme deseo de utilizar la clase Win32_BIOS para determinar el nombre del equipo. Bueno, ¿por qué no?:

strComputer = "."

Set objWMIService = GetObject("winmgmts:\" & strComputer & "\root\cimv2")

Set colItems = objWMIService.ExecQuery("Select * From Win32_BIOS")

For Each objItem in colItems Wscript.Echo objItem.Path_.Server Next

Como puede ver, se trata de una secuencia de comandos estándar de WMI, que enlaza con el servicio WMI en el equipo local. A continuación, utilizamos esta línea de código para recuperar la información de la BIOS de ese equipo:

Set colItems = objWMIService.ExecQuery("Select * From Win32_BIOS")

¿Por qué hemos elegido la clase Win32_BIOS? Por ningún motivo en especial; podríamos haber elegido cualquier clase WMI, puesto que todas devuelven un objeto SWbemObjectPath, cuya propiedad Path_ sirve como la dirección única del elemento en cuestión. Por ejemplo, la propiedad Path_ a la BIOS de un equipo podría ser similar a ésta:

\\ATL-WS-01\root\cimv2:Win32_BIOS.Name="EPP runtime BIOS - Version 1.1 ", 
SoftwareElementID="EPP runtime BIOS - Version 1.1 ",SoftwareElementState=3,
TargetOperatingSystem=0,Version="HP     - 22110520"

Esa ruta es exclusiva: ningún otro objeto del equipo atl-ws-01 tendrá la misma.

Como puede observar, el nombre del equipo (ATL-WS-01) está incrustado en la primera parte de la ruta. (Existe un motivo para ello: no incluir el nombre del equipo en la ruta podría ser casi tan útil como tener una dirección del tipo Calle Mayor nº 111 y no especificar el nombre de la ciudad.) Cierto es que podríamos manipular la secuencia de comandos para intentar obtener el nombre del equipo a partir de la ruta. O simplemente podríamos solicitar el valor de la propiedad Server, tal como hacemos a continuación:

For Each objItem in colItems
    Wscript.Echo objItem.Path_.Server
Next

Así de sencillo. Y lo mejor de todo, todos los objetos WMI que se obtengan de una secuencia de comandos incluirán un objeto SWbemObjectPath y la propiedad Server. ¿Ya utiliza la clase Win32_ParallelPort para conectar con un equipo? Perfecto; podrá obtener desde ahí el valor de la propiedad Server mediante Win32_ParallelPort:

strComputer = "."

Set objWMIService = GetObject("winmgmts:\" & strComputer & "\root\cimv2")

Set colItems = objWMIService.ExecQuery("Select * From Win32_ParallelPort")

For Each objItem in colItems Wscript.Echo objItem.Path_.Server Next

¿Conecta con un equipo mediante la clase Win32_PrinterConfiguration? Entonces podrá obtener el valor de la propiedad Server mediante Win32_PrinterConfiguration. ¿Conecta mediante la clase Win32_LogicalDisk? Entonces podrá obtener el valor... bueno, ya ha captado la idea.

Pero, ¿qué ocurre si no le gusta SWbemObjectPaths? Bueno, en ese caso siempre puede utilizar la clase Win32_ComputerSystem para obtener el nombre del equipo:

strComputer = "."

Set objWMIService = GetObject("winmgmts:\" & strComputer & "\root\cimv2") Set colItems = objWMIService.ExecQuery("Select * From Win32_ComputerSystem")

For Each objItem in colItems Wscript.Echo objItem.Name Next

Eso funciona a la perfección, pero no es tan bonito como utilizar la clase Win32_TimeZone para determinar el nombre del equipo. E imagínese cuántas apuestas podrá ganar ahora; al fin y al cabo, a partir de ahora podrá entrar en un bar abarrotado y decir a los clientes: “Denme el nombre de una clase WMI – cualquiera – y utilizaré únicamente esa clase para determinar el nombre de un equipo”. Si eso no les impresiona entonces quizá no merezca la pena impresionarles.

Esperamos haber respondido a su pregunta, BM. Y es que los chicos del scripting nos sentimos orgullosos de nuestro lema: Nunca dejar un trabajo sin hacer. Ojo: no hemos dicho que lo pongamos en práctica. Pero nos sentimos orgullosos de él.


Para más Información

Consulte el Archivo de ¡Hola, chicos del scripting!.

Arriba Arriba