Para cambiar el comentario de red de uno o más equipos de manera simple en Windows XP/2000/2003, podemos recurrir al siguiente script:



'********************************************* ******************************

'cambiar-comentario-a-equipos.vbs



'Script VBScript que establece el comentario de uno o más equipos

'de la red

'

'Sintaxis

'

'{wscript | cscript [//nologo]} [/E:equipos] [/F:fichero equipos]

'* * * [/U:usuario de conexion [/C:contraseña]] [/?] [comentario]

'

'Siendo

'

'* * - [comentario]. Parámetro opcional que es el comentario que se

'* * * * * * * * * * pondrá al equipo. En caso de ser omitido, se

'* * * * * * * * * * vaciará el comentario.

'

'* * - /E: opcional. Lista de equipos a los que se quiere cambiar

'* * * * * * * * * * la letra del CD-ROM. Esta lista son los nombres

'* * * * * * * * * * de los equipos separados por comas. Si se omite

'* * * * * * * * * * este parámetro y también el parámetro /L, se

'* * * * * * * * * * realizará en el equipo local.

'

'* * - /F: opcional. Nombre de un fichero de texto en el que está

'* * * * * * * * * * la lista de equipos a los que se debe cambiar

'* * * * * * * * * * la letra del CD-ROM. Los nombres deben ser

'* * * * * * * * * * NetBios y ha de ir un equipo por línea. Si se

'* * * * * * * * * * omite este parámetro y también el parámetro

'* * * * * * * * * * /E, se realizará en el equipo local.

'

'* * - /U: opcional. Nombre del usuario que se utilizará para conectar

'* * * * * * * * * * con el servicio WMI del equipo. En caso de

'* * * * * * * * * * omitirse se utilizará el usuario que lanza el

'* * * * * * * * * * script.

'

'* * - /C: opcional. Cuando está establecido el parámetro U, este

'* * * * * * * * * * parámetro nos permite especificar la contraseña

'* * * * * * * * * * del usuario que conectará con el servicio WMI.

'* * * * * * * * * * Si no está especificado el parámetro U se

'* * * * * * * * * * ignorará. Si está establecido el parámetro U

'* * * * * * * * * * y este parámetro es omitido, el script presentará

'* * * * * * * * * * una ventana de Internet Explorer donde entrar la

'* * * * * * * * * * contraseña. Es recomendable no usar este parámetro,

'* * * * * * * * * * pues implica que se teclea la contraseña y alguien

'* * * * * * * * * * puede verla; como el usuario debe tener derechos

'* * * * * * * * * * administrativos, es peligroso que tengamos la

'* * * * * * * * * * la contraseña expuesta. Al usar una ventana de IE

'* * * * * * * * * * para teclear la contraseña, esto se realiza en

'* * * * * * * * * * una caja de texto de tipo password, quedando

'* * * * * * * * * * enmascarada, protegida de ojos indiscretos.

'

'* * - /?: opcional. Muestra la ayuda en línea.

'

'Nota: si se incluyen los parámetros /E y/L a la vez, prevalecerá

'* * * el parámetro /L

'

'Ejemplos:

'

'- Dejamos el comentario del equipo local en blanco

'

'wscript cambiar-comentario-a-equipos.vbs

'

'- Establecemos "Equipo de Pippin" en el equipo local

'

'cscript cambiar-comentario-a-equipos.vbs "Equipo de Pippin"

'

'- Dejamos el comentario en blanco en los equipo snaug, grima y saruman

'

'cscrip //nologo /E:snaug,grima,saruman

'

'- Establecemos "Otro equipo de Rohan" en los equipos del fichero recibido

'* como parámetro /F utilizando las credenciales del usuario rohan\theoden

'

'cscript /F:c:\Listados\Rohan.txt /U:rohan\theoden "Otro equipo de Rohan"

'

'- Dejamos en blanco el comentario de los equipos del fichero recibido como

'* parámetro /F utilizando las credenciales del usuario mordor\reybrujo y

'* suministrando su constraseña

'

'cscript /F:c\Listados\CirithUngol.txt /U:mordor\reybrujo /C:"quiero sangre"

'

'© Fernando Reyes - Enero de 2007

'********************************************* ******************************



'Requerimos la declaración de variables

Option Explicit



'Declaración de variables

Dim str_Comentario, str_Usuario, str_Clave

Dim arr_Equipos, str_Resumen, str_Devolucion

Dim obj_ServicioWMI, str_Equipo



'Si se pide la ayuda en línea, mostrarla es lo único que se hará

If WScript.Arguments.Named.Exists("?") Then



* * Call s_Ayuda("|*********************|" & vbCrLf & _

* * * * * * * * "|** * * Ayuda* * * *|" & vbCrLf & _

* * * * * * * * "|*********************|")

* * WScript.Quit 0



End If



'Vemos ahora si hemos recogido lista de equipos

If WScript.Arguments.Named.Exists("E") _

Or WScript.Arguments.Named.Exists("F") Then



* * 'Primero miramos si está el parámetro F, fichero con

* * 'la lista de equipo, y de existir procesaremos los

* * 'equipos que contenga. De esta manera hacemos que

* * 'sea ignorado parámetro E, si está presente

* * If WScript.Arguments.Named.Exists("F") Then



* * * * 'Obtenemos la lista de equipos desde el fichero,

* * * * 'verificando que la función que lo lee devuelve

* * * * 'True, pues si devuelve False es que no se ha podido

* * * * 'abrir el fichero y por tanto debemos terminar

* * * * 'el script

* * * * If Not f_LeeFichero(WScript.Arguments.Named("F"), _

* * * * * * * * * * * * * * str_Equipo) Then



* * * * * * WScript.Echo "Error 1: No se pudo abrir el " & _

* * * * * * * * * * * * "fichero con la lista de equipos"

* * * * * * WScript.Quit 1



* * * * Else



* * * * * * 'Se pudo abrir el fichero; hacemos Split considerando

* * * * * * 'la coma como separador para así tener la lista como

* * * * * * 'un array

* * * * * * arr_Equipos = Split(str_Equipo,",")



* * * * End If



* * Else



* * * * * * 'Cargamos la lista haciendo Split y considerando la coma

* * * * * * 'como separador de elementos

* * * * * * arr_Equipos = Split(WScript.Arguments.Named("E"),",")



* * End If



Else



* * 'si no se han recibido ni /E ni /F, establecemos el equipo local

* * arr_Equipos = Array(".")



End If



'Miramos si se ha recibido el parámetro de usuario

If WScript.Arguments.Named.Exists("U") Then



* * 'Como se ha recibido, lo recogemos

* * str_Usuario = WScript.Arguments.Named("U")



* * 'Miramos si se ha recibido contraseña

* * If WScript.Arguments.Named.Exists("C") Then



* * * * 'si se ha recibido lo recogemos

* * * * str_Clave = WScript.Arguments.Named("C")



* * Else



* * * * 'Como no se ha recibido, llamamos a la función

* * * * 'que pedirá al usuario que entre la contraseña

* * * * str_Clave= f_EntrarClave("\\fernandor-f\com" & _

* * * * * * * * * * * * * * "partido\usuario-conexion.htm")



* * End If



'No se ha recibido parámetro de usuario, dejamos las

'variables vacías

Else



* * str_Usuario = ""

* * str_Clave = ""



End If



'Si se ha omitido el parámetro de comentario, ponemos vacía

'la variable que lo contiene

If WScript.Arguments.Unnamed.Count = 0 Then



* * str_Comentario = ""



'Como se ha establecido lo ponemos en la variable. Si se hubiera

'pasado más de un parámetro sin nombre, sólo se tendrá en cuenta

'el primero, los demás serán ignorados. Esto quiere decir que si

'el comentario contiene espacios, es necesario que lo encerremos

'entre comillas, pues si no sólo se establecerá la primera palabra

'como comentario

Else



* * str_Comentario = WScript.Arguments.Unnamed(0)



End If



'Iniciamos la variable que irá almacenando los resultados

'del proceso; será usada para presentar el resumen al final

str_Resumen = vbCrLf & vbCrLf & _

* * * * * * * "Nom. equipo" & vbTab & "Resultado" & vbCrLf & _

* * * * * * * "============================" & vbCrLf



'Recorremos la lista de nombres de equipos

For Each str_Equipo In* arr_Equipos



* * 'Vaciamos la variable con la devolución del resultado

* * 'del equipo anterior

* * str_Devolucion = ""



* * 'Llamamos al procedimiento encargado de cambiar la letra

Call s_ProcesaEquipo(str_Comentario, _

* * * * * * * * * * * str_Equipo, str_Usuario, _

* * * * * * * * * * * str_Clave, str_Devolucion)



'Añadimos el resultado del equipo actual al resumen

str_Resumen = str_Resumen & str_Devolucion & vbCrLf



Next



'Mostramos el resumen

WScript.Echo str_Resumen



Sub s_ProcesaEquipo(str_Comentario, str_Equipo, _

* * * * * * * * * * str_Usuario, str_Clave, _

* * * * * * * * * * str_Devolucion)



* * 'Constantes para la forma de consultar con

* * 'WQL al servicio WMI

* * Const wbemFlagReturnImmediately = &h10

* * Const wbemFlagForwardOnly = &h20



* * 'Declaración de variables

* * Dim obj_ServicioWMI, col_OS, obj_OS



* * 'Llamamos a la función que nos permite cargar el objeto

* * 'servicio WMI. Si la función devuelve False es que no se

* * 'ha podido crear

* * If Not f_ServicioWMI(obj_ServicioWMI, _

* * * * * * * * * * * * str_Usuario, _

* * * * * * * * * * * * str_Clave, _

* * * * * * * * * * * * str_Equipo) Then



* * * * 'Lanzamos el mensaje de que ha habido un error en la conexión

* * * * 'al servicio WMI

* * * * Wscript.Echo "Error 2: error al conectar con el servicio WMI"



* * * * 'Terminamos el script con el código de error 2

* * * * WScript.Quit 2



* * End If



* * Set col_OS = obj_ServicioWMI.InstancesOf("Win32_OperatingSystem ")



* * For Each obj_OS in col_OS



* * * obj_OS.Description = str_Comentario

* * * obj_OS.Put_



* * * str_Devolucion = str_Equipo & vbTab & "Cambiado"



* * Next



* * If Len(str_Devolucion) = 0 Then str_Devolucion = str_Equipo & vbTab & "No se cambió"



End Sub



Sub s_Ayuda(str_Texto)



* * WScript.Echo vbCrLf & vbCrLf



* * 'Si se ha recibido algún texto lo mostramos y lo separamos de la

* * 'ayuda con dos saltos de línea

* * If Len(str_Texto) > 0 Then _

* * * * * * * * * * * * * WScript.Echo str_Texto & vbCrLf & vbcrlf



* * WScript.Echo "cambiar-comentario-a-equipos.vbs"

* * WScript.Echo ""

* * WScript.Echo "Script VBScript que establece el comentario de uno o más equipos"

* * WScript.Echo "de la red"

* * WScript.Echo ""

* * WScript.Echo "Sintaxis"

* * WScript.Echo ""

* * WScript.Echo "{wscript | cscript [//nologo]} [/E:equipos] [/F:fichero equipos]"

* * WScript.Echo "* * * [/U:usuario de conexion [/C:contraseña]] [/?] [comentario]"

* * WScript.Echo ""

* * WScript.Echo "Siendo"

* * WScript.Echo ""

* * WScript.Echo "* * - [comentario]. Parámetro opcional que es el comentario que se"

* * WScript.Echo "* * * * * * * * * * pondrá al equipo. En caso de ser omitido, se"

* * WScript.Echo "* * * * * * * * * * vaciará el comentario."

* * WScript.Echo ""

* * WScript.Echo "* * - /E: opcional. Lista de equipos a los que se quiere cambiar"

* * WScript.Echo "* * * * * * * * * * la letra del CD-ROM. Esta lista son los nombres"

* * WScript.Echo "* * * * * * * * * * de los equipos separados por comas. Si se omite"

* * WScript.Echo "* * * * * * * * * * este parámetro y también el parámetro /L, se"

* * WScript.Echo "* * * * * * * * * * realizará en el equipo local."

* * WScript.Echo ""

* * WScript.Echo "* * - /F: opcional. Nombre de un fichero de texto en el que está"

* * WScript.Echo "* * * * * * * * * * la lista de equipos a los que se debe cambiar"

* * WScript.Echo "* * * * * * * * * * la letra del CD-ROM. Los nombres deben ser"

* * WScript.Echo "* * * * * * * * * * NetBios y ha de ir un equipo por línea. Si se"

* * WScript.Echo "* * * * * * * * * * omite este parámetro y también el parámetro"

* * WScript.Echo "* * * * * * * * * * /E, se realizará en el equipo local."

* * WScript.Echo ""

* * WScript.Echo "* * - /U: opcional. Nombre del usuario que se utilizará para conectar"

* * WScript.Echo "* * * * * * * * * * con el servicio WMI del equipo. En caso de"

* * WScript.Echo "* * * * * * * * * * omitirse se utilizará el usuario que lanza el"

* * WScript.Echo "* * * * * * * * * * script."

* * WScript.Echo ""

* * WScript.Echo "* * - /C: opcional. Cuando está establecido el parámetro U, este"

* * WScript.Echo "* * * * * * * * * * parámetro nos permite especificar la contraseña"

* * WScript.Echo "* * * * * * * * * * del usuario que conectará con el servicio WMI."

* * WScript.Echo "* * * * * * * * * * Si no está especificado el parámetro U se"

* * WScript.Echo "* * * * * * * * * * ignorará. Si está establecido el parámetro U"

* * WScript.Echo "* * * * * * * * * * y este parámetro es omitido, el script presentará"

* * WScript.Echo "* * * * * * * * * * una ventana de Internet Explorer donde entrar la"

* * WScript.Echo "* * * * * * * * * * contraseña. Es recomendable no usar este parámetro,"

* * WScript.Echo "* * * * * * * * * * pues implica que se teclea la contraseña y alguien"

* * WScript.Echo "* * * * * * * * * * puede verla; como el usuario debe tener derechos"

* * WScript.Echo "* * * * * * * * * * administrativos, es peligroso que tengamos la"

* * WScript.Echo "* * * * * * * * * * la contraseña expuesta. Al usar una ventana de IE"

* * WScript.Echo "* * * * * * * * * * para teclear la contraseña, esto se realiza en"

* * WScript.Echo "* * * * * * * * * * una caja de texto de tipo password, quedando"

* * WScript.Echo "* * * * * * * * * * enmascarada, protegida de ojos indiscretos."

* * WScript.Echo ""

* * WScript.Echo "* * - /?: opcional. Muestra la ayuda en línea."

* * WScript.Echo ""

* * WScript.Echo "Nota: si se incluyen los parámetros /E y/L a la vez, prevalecerá"

* * WScript.Echo "* * * el parámetro /L"

* * WScript.Echo ""

* * WScript.Echo "Ejemplos:"

* * WScript.Echo ""

* * WScript.Echo "- Dejamos el comentario del equipo local en blanco"

* * WScript.Echo ""

* * WScript.Echo "wscript cambiar-comentario-a-equipos.vbs"

* * WScript.Echo ""

* * WScript.Echo "- Establecemos ""Equipo de Pippin"" en el equipo local"

* * WScript.Echo ""

* * WScript.Echo "cscript cambiar-comentario-a-equipos.vbs ""Equipo de Pippin"""

* * WScript.Echo ""

* * WScript.Echo "- Dejamos el comentario en blanco en los equipo snaug, grima y saruman"

* * WScript.Echo ""

* * WScript.Echo "scrip //nologo /E:snaug,grima,saruman"

* * WScript.Echo ""

* * WScript.Echo "- Establecemos ""Otro equipo de Rohan"" en los equipos del fichero recibido"

* * WScript.Echo "* como parámetro /F utilizando las credenciales del usuario rohan\theoden"

* * WScript.Echo ""

* * WScript.Echo "cscript /F:c:\Listados\Rohan.txt /U:rohan\theoden ""Otro equipo de Rohan"""

* * WScript.Echo ""

* * WScript.Echo "- Dejamos en blanco el comentario de los equipos del fichero recibido como"

* * WScript.Echo "* parámetro /F utilizando las credenciales del usuario mordor\reybrujo y"

* * WScript.Echo "* suministrando su constraseña"

* * WScript.Echo ""

* * WScript.Echo "cscript /F:c\Listados\CirithUngol.txt /U:mordor\reybrujo /C:""quiero sangre"""

* * WScript.Echo ""



End Sub 's_Ayuda



Function f_EntrarClave(str_HTML)

'El propósito de esta función es el proveer al usuario de una caja

'de texto en la que teclear una contraseña sin revelarla, pues

'la caja de texto es de tipo password. Para ello se crea una página

'web que es cargada en un Internet Explorer y se recoge de éste

'la contraseña tecleada y se convierte en la devolucion de la función.

'La ruta y nombre de la página es recibida como parámetro por la

'función, lo que permite reutilizar esta función en más scripts y

'personalizar la página para cada script, lo único que debe ser igual

'en todas las páginas que se quieran utilizar es que el botón debe

'llamarse Aceptar, el control oculto AceptarPulsado y la caja de texto

'Clave.



'Esta función está basada en:

'http://www.microsoft.com/technet/scr....mspx?mfr=true



'En el ejemplo de TechNet se pone una ruta local (c:\carpeta\fichero.asp)

'para la ubicación del fichero. Esto no es correcto cuando estamos de

'XP SP2 en adelante, pues la navegación segura interfiere con el script,

'Ya que contiene un script VBScript. Para evitar esto, yo lo que hago

'es situar el fichero en una carpeta compartida y acceder a él con su

'ruta UNC; de esta manera es tratado como de la zona de intranet y no

'hay problemas. También se podría colocar en un servidor Web que fuese

'de la intranet o de los sitios de confianza y referirse a él por su

'ruta http



* * 'Declaramos variables

* * Dim obj_IE



* * 'Creamos un objeto Internet Explorer

* * Set obj_IE = WScript.CreateObject _

* * * * * * * ("InternetExplorer.Application", "IE_")



* * 'Cargamos el navegador con la página recibida como parámetro

* * obj_IE.Navigate "file:///" & str_HTML



* * 'Con este bucle esperamos a que la página esté completamente cargada

* * Do



* * * * WScript.Sleep 10



* * Loop Until obj_IE.ReadyState = 4* *



* * 'Establecemos propiedades del navegador

* * obj_IE.ToolBar = 0

* * obj_IE.StatusBar = 0

* * obj_IE.Width = 400

* * obj_IE.Height = 250

* * obj_IE.Left = 0

* * obj_IE.Top = 0

* * obj_IE.Visible = 1



* * 'En este bucle esperamos a que se haya pulsado el botón

* * '"Aceptar"

* * Do While (obj_IE.Document.All.AceptarPulsado.Value = "")



* * * * WScript.Sleep 250



* * Loop



* * 'Recogemos la contraseña entrada

* * str_Clave = obj_IE.Document.All.Clave.Value



* * 'Cerramos el navegador

* * obj_IE.Quit



* * 'Esperamos a que esté cerrado

* * WScript.Sleep 250



* * 'Establecemos la contraseña como devolución de la función

* * f_EntrarClave = str_Clave*



* * 'Limpiadita de culito :-)

* * Set obj_IE = Nothing



End Function 'f_EntrarClave



Function f_ServicioWMI(obj_ServicioWMI, str_Usuario, _

* * * * * * * * * * * str_Clave, str_Equipo)

'Esta función permite conectar con el servicio WMI de un equipo.

'La conexión puede ser realizada directamente por el usuario

'que ha lanzado el script o por otro usuario cuyas credenciales

'son recibidas como parámetros. La función recibe como parámetro

'un objeto que será utilizado como parámetro de salida, siendo

'creado por la función como objeto de servicio WMI del equipo

'recibido como parámetro



* * Dim obj_LocalizadorWMI

* * Dim lng_Respuesta



* * 'Si hemos recibido nombre de usuario, debemos conectar

* * 'al servicio WMI del equipo como el usuario

* * 'recibido

* * If Len(str_Usuario) > 0 Then



* * * * 'Para poder especificar unas credenciales alternativas,

* * * * 'debemos crear primero un localizador WMI

* * * * Set obj_LocalizadorWMI = CreateObject( _

* * * * * * * * * * * * * * * * * "WbemScripting.SWbemLocator")



* * * * 'Establecemos control de errores

* * * * On Error Resume Next

* * * * 'Conectamos con el servicio WMI del equipo con las

* * * * 'credenciales pasadas

* * * * Set obj_ServicioWMI = obj_LocalizadorWMI.ConnectServer( _

* * * * * * * * * * * * * * * * * * * str_Equipo, "root\cimv2", _

* * * * * * * * * * * * * * * * * * * str_Usuario, str_Clave)



* * * * 'Si se ha producido algún error...

* * * * If Err.Number <> 0 Then



* * * * * * &#39;Lo primero es vaciar la variable con el localizador WMI

* * * * * * Set obj_LocalizadorWMI = Nothing



* * * * * * &#39;Mostramos el error

* * * * * * WScript.Echo vbCrLf & vbCrLf & _

* * * * * * * * * * * * Err.Number & ": " & Err.Description



* * * * * * &#39;Vaciamos el objeto Err

* * * * * * Err.Clear



* * * * * * &#39;Devolvemos False

* * * * * * f_ServicioWMI = False



* * * * * * &#39;Salimos de la función

* * * * * * Exit Function



* * * * End If



* * Else



* * * * &#39;Podemos conectar directamente con el servicio WMI del equipo

* * * * &#39;sin necesidad de utilizar el localizador WMI ya que no hay

* * * * &#39;que hacerlo con otras credenciales distintas a las del

* * * * &#39;usuario que lanza el script

* * * * Set obj_ServicioWMI = GetObject("winmgmts:\\" & str_Equipo & _

* * * * * * * * * * * * * * * * * * * * "\root\CIMV2")



* * * * &#39;si se ha producido algún error...

* * * * If Err.Number <> 0 Then



* * * * * * &#39;Mostramos el error

* * * * * * WScript.Echo Err.Number & ": " & Err.Description & _

* * * * * * * * * * * * vbCrLf & vbCrLf



* * * * * * &#39;Vaciamos el objeto Err

* * * * * * Err.Clear



* * * * * * &#39;Devolvemos False

* * * * * * f_ServicioWMI = False



* * * * * * &#39;Salimos de la función

* * * * * * Exit Function



* * * * End If



* * End If



* * &#39;No se han producido errores, devolvemos True

* * f_ServicioWMI = True



* * &#39;Limpieza de culito :-)

* * Set obj_LocalizadorWMI = Nothing



End Function &#39;f_ServicioWMI



Function f_LeeFichero(str_Fichero, str_Contenido)

&#39;Esta función recibe una ruta y nombre de fichero de

&#39;texto, y una variable usada como salida para almacenar

&#39;el contenido del fichero. Devuelve True si hubo éxito

&#39;al leer el fichero y False en caso contrario



* * Dim obj_FS, obj_TS



* * &#39;Creamos un objeto FileSysteObject

* * Set obj_FS = CreateObject("scripting.filesystemobject")



* * &#39;Establecemos control de errores

* * On Error Resume Next



* * &#39;Cargamos el fichero en el objeto TextStream

* * Set obj_TS = obj_FS.OpenTextFile(str_Fichero, 1)



* * &#39;Si no ha habido errores...

* * If Err.Number = 0 Then



* * * * &#39;Ponemos el contenido del fichero en la variable de

* * * * &#39;salida, sustituyendo los saltos de línea por comas,

* * * * &#39;preparando la jugada para el uso de Split

* * * * str_Contenido = Replace(obj_TS.ReadAll,vbCrLf,",")



* * * * &#39;Como ha habido éxito la función devuelve True

* * * * f_LeeFichero = True



* * * * &#39;Cerramos el fichero

* * * * obj_TS.Close



* * Else



* * * * &#39;Ha habido un error a la hora de abrir el fichero.

* * * * &#39;Mostrammos el número y descripción del error

* * * * WScript.Echo "Error " & Err.Number & _

* * * * * * * * * * ": " & Err.Description



* * * * &#39;Como ha habido error la función devuelve False

* * * * f_LeeFichero = False



* * * * &#39;Limpiamos errores

* * * * Err.Clear* * * * *



* * End If



* * &#39;Cleaning butt :-)

* * Set obj_TS = Nothing

* * Set obj_FS = Nothing



End Function &#39;f_LeeFichero


Copiar lo que está en el quote y guardarlo con extensión .vbs



La implementacion es a traves de la consola o del cuadro de ejecución de la máquina (inicio -> ejecutar).



Desde consola:



cscript [nombre del archivo].vbs [comentario]



También se puede consultar la ayuda reemplazando el comentario por el modificador /?



Desde el cuadro de ejecución:



wscript [nombre del archivo].vbs [comentario]



También se puede consultar la ayuda reemplazando el comentario por el modificador /?