El Blog de Gualtrysoft

Windows 2000/2003/2008, Active Directory, VBScript, Hyper-V, PowerShell y todo aquello interesante a la hora de usar, configurar y administrar Windows Server. También tenemos longanizas…

Script VBScript Para Obtener El Uso De Memoria De Un Equipo

Posted by urpiano en Viernes 8 \08\UTC febrero \08\UTC 2008

Este script mira el estado de la memoria de un equipo, local o remoto. Muestra en la salida la memoria física ocupada y total, en Mb, y la memoria virtual ocupada y total, también en Mb. Si el tanto por ciento de la memoria física ocupada es menor que el valor recibido como parámetro de advertencia, el script termina devolviendo 0 (todo correcto); si es mayor o igual al parámetro de advertencia y menor que el de crítico devuelve 1 (advertencia); si es igual o superior al parámetro de crítico devuelve 2 (critico); si se produce un error la devolución será 3 (error).

El script utiliza WMI para obtener los datos y permite obtenerlos de un equipo distinto del local; para ello, el script debe ser lanzado desde una ventana de comandos abierta por un usuario con permiso de acceso o pasar los argumentos de usuario y contraseña de un usuario que tenga los permisos.

Sintaxis

cscript [//nologo] estado-memoria.vbs [/E:equipo] [/U:usuario] [/C:contraseña] [/P:precision] [/?] advertencia critico

Siendo

Etiqueta Dato ¿Requerido? Descripción
  advertencia
Tanto por ciento de uso de memoria por encima del cual se considera que se ha alcanzado el nivel de aviso.
  critico
Tanto por ciento de uso de memoria por encima del cual se considera que se ha alcanzado el nivel crítico
E equipo No
Nombre del equipo al que se revisará la memoria
U usuario No
Usuario con el que se conectará al servicio WMI del equipo en el que se mirará la memoria. Si se trata del equipo local, se ignorará, pues no se puede conectar a WMI con credenciales alternativas desde el equipo local
C contraseña No
Contraseña del usuario especificado con el argumento /U. Si éste ha sido pasado y no se pasa la contraseña, se presentará una ventana de Internet Explorer con una caja de texto de tipo password; de esta manera se podrá entrar la contraseña a salvo de ojos indiscretos
P precision No
Número de dígitos decimales con los que se mostrará el resultado. Si se omite el valor será cero
? ayuda No
Muestra la ayuda en línea

Ejemplos:

– Muestra el estado de la memoria física y virtual del equipo local y produce la devolución según la ocupación, considerando como nivel de advertencia “80” y como nivel crítico “95”:

cscript //nologo estado-memoria.vbs 80 95

– Muestra el estado de la memoria física y virtual del equipo bcerrado1 y produce la devolución según la ocupación, considerando como nivel de advertencia “80” y como nivel crítico “95”:

cscript //nologo estado-memoria.vbs /E:bcerrado1 80 95

– Muestra el estado de la memoria física y virtual del equipo bcerrado1 y produce la devolución según la ocupación, considerando como nivel de advertencia “80” y como nivel crítico “95”. Para hacerlo, se conectará al servicio WMI del equipo como usuario comarcafrodo y el script solicitará su contraseña:

cscript //nologo estado-memoria.vbs /E:bcerrado1 /U:comarcafrodo 80 95

– Muestra el estado de la memoria física y virtual del equipo bcerrado1 y produce la devolución según la ocupación, considerando como nivel de advertencia “80” y como nivel crítico “95”. Para hacerlo, se conectará al servicio WMI del equipo como usuario comarcafrodo y contraseña AtaquemosAlOrco69:

cscript //nologo estado-memoria.vbs /E:bcerrado1 /U:comarcafrodo /C:AtaquemosAlOrco69 80 95

– Muestra el estado de la memoria física y virtual del equipo bcerrado1 y produce la devolución según la ocupación, considerando como nivel de advertencia “80” y como nivel crítico “95”. Para hacerlo, se conectará al servicio WMI del equipo como usuario comarcafrodo y contraseña AtaquemosAlOrco69. Los valores mostrados tendrán una precisión de 2 decimales.:

cscript //nologo estado-memoria.vbs /E:bcerrado1 /U:comarcafrodo /C:AtaquemosAlOrco69 /P:2 80 95

Este es el código del script

'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'* estado-memoria.vbs                                                  *
'*                                                                     *
'* Este script mira el estado de la memoria de un equipo, local o      *
'* remoto. Muestra en la salida la memoria física ocupada y total, en  *
'* Mb, y la memoria virtual ocupada y total, también en Mb. Si el      *
'* tanto por ciento de la memoria física ocupada es menor que el valor *
'* recibido como parámetro de advertencia, el script termina           *
'* devolviendo 0 (todo correcto); si es mayor o igual al parámetro de  *
'* advertencia y menor que el de crítico devuelve 1 (advertencia); si  *
'* es igual o superior al parámetro de crítico devuelve 2 (critico);   *
'* si se produce un error la devolución será 3 (error).                *
'*                                                                     *
'* El script utiliza WMI para obtener los datos y permite obtenerlos   *
'* de un equipo distinto del local; para ello, el script debe ser      *
'* lanzado desde una ventana de comandos abierta por un usuario con    *
'* permiso de acceso o pasar los argumentos de usuario y contraseña de *
'* un usuario que tenga los permisos.                                  *
'*                                                                     *
'* Sintaxis                                                            *
'*                                                                     *
'* cscript [//nologo] estado-memoria.vbs [/E:equipo] [/U:usuario]      *
'* [/C:contraseña] [/P:precision] [/?] advertencia critico             *
'*                                                                     *
'* Siendo                                                              *
'*                                                                     *
'* - advertencia (Requerido):                                          *
'*         Tanto por ciento de uso de memoria por encima del cual se   *
'*         considera que se ha alcanzado el nivel de aviso.            *
'*                                                                     *
'* - critico (Requerido):                                              *
'*         Tanto por ciento de uso de memoria por encima del cual se   *
'*         considera que se ha alcanzado el nivel crítico              *
'*                                                                     *
'* - /E: equipo (Opcional):                                            *
'*         Nombre del equipo al que se revisará la memoria             *
'*                                                                     *
'* - /U: usuario (Opcional):                                           *
'*         Usuario con el que se conectará al servicio WMI del equipo  *
'*         en el que se mirará la memoria. Si se trata del equipo      *
'*         local, se ignorará, pues no se puede conectar a WMI con     *
'*         credenciales alternativas desde el equipo local             *
'*                                                                     *
'* - /C: contraseña (Opcional):                                        *
'*         Contraseña del usuario especificado con el argumento /U. Si *
'*         éste ha sido pasado y no se pasa la contraseña, se          *
'*         presentará una ventana de Internet Explorer con una caja de *
'*         texto de tipo password; de esta manera se podrá entrar la   *
'*         contraseña a salvo de ojos indiscretos                      *
'*                                                                     *
'* - /P: precision (Opcional):                                         *
'*         Número de dígitos decimales con los que se mostrará el      *
'*         resultado. Si se omite el valor será cero                   *
'*                                                                     *
'* - /?: ayuda (Opcional):                                             *
'*         Muestra la ayuda en línea                                   *
'*                                                                     *
'*                                                                     *
'* Ejemplos:                                                           *
'*                                                                     *
'* - Muestra el estado de la memoria física y virtual del equipo local *
'* y produce la devolución según la ocupación, considerando como nivel *
'* de advertencia  "80" y como nivel crítico "95":                     *
'*                                                                     *
'* cscript //nologo estado-memoria.vbs 80 95                           *
'*                                                                     *
'* - Muestra el estado de la memoria física y virtual del equipo       *
'* bcerrado1 y produce la devolución según la ocupación, considerando  *
'* como nivel de advertencia  "80" y como nivel crítico "95":          *
'*                                                                     *
'* cscript //nologo estado-memoria.vbs /E:bcerrado1 80 95              *
'*                                                                     *
'* - Muestra el estado de la memoria física y virtual del equipo       *
'* bcerrado1 y produce la devolución según la ocupación, considerando  *
'* como nivel de advertencia  "80" y como nivel crítico "95". Para     *
'* hacerlo, se conectará al servicio WMI del equipo como usuario       *
'* comarcafrodo y el script solicitará su contraseña:                 *
'*                                                                     *
'* cscript //nologo estado-memoria.vbs /E:bcerrado1 /U:comarcafrodo   *
'* 80 95                                                               *
'*                                                                     *
'* - Muestra el estado de la memoria física y virtual del equipo       *
'* bcerrado1 y produce la devolución según la ocupación, considerando  *
'* como nivel de advertencia  "80" y como nivel crítico "95". Para     *
'* hacerlo, se conectará al servicio WMI del equipo como usuario       *
'* comarcafrodo y contraseña AtaquemosAlOrco69:                       *
'*                                                                     *
'* cscript //nologo estado-memoria.vbs /E:bcerrado1 /U:comarcafrodo   *
'* /C:AtaquemosAlOrco69 80 95                                          *
'*                                                                     *
'* - Muestra el estado de la memoria física y virtual del equipo       *
'* bcerrado1 y produce la devolución según la ocupación, considerando  *
'* como nivel de advertencia  "80" y como nivel crítico "95". Para     *
'* hacerlo, se conectará al servicio WMI del equipo como usuario       *
'* comarcafrodo y contraseña AtaquemosAlOrco69. Los valores mostrados *
'* tendrán una precisión de 2 decimales.:                              *
'*                                                                     *
'* cscript //nologo estado-memoria.vbs /E:bcerrado1 /U:comarcafrodo   *
'* /C:AtaquemosAlOrco69 /P:2 80 95                                     *
'*                                                                     *
'*                                                                     *
'*                                                                     *
'*                                                                     *
'* © Fernando Reyes                                                    *
'* Febrero De 2008                                                     *
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*

'Exigimos la declaración de variables
Option Explicit

Const exit_OK = 0
Const exit_ADVERTENCIA = 1
Const exit_CRITICO = 2
Const exit_ERROR = 3


Dim str_Error 'As String
Dim int_Error 'As String
Dim sng_Advertencia 'As Single
Dim sng_Critico 'As Single
Dim str_Equipo 'As String
Dim str_Usuario 'As String
Dim str_Clave 'As String
Dim obj_ServicioWMI 'As SWbemservices
Dim col_Computadores 'As Win32_ComputerSystemCollection
Dim obj_Computador 'As Win32_ComputerSystem
Dim col_Sistemas 'As Win32_OperatingSystemCollection
Dim obj_Sistema 'As Win32_OperatingSystem
Dim lng_MemoriaFisicaTotal 'As Long
Dim lng_MemoriaFisicaLibre 'As Long
Dim lng_MemoriaVirtualTotal 'As Long
Dim lng_MemoriaVirtualLibre 'As Long
Dim str_Salida 'As String
Dim sng_PorcentajeOcupadaFisica 'As Single
Dim sng_PorcentajeLibreFisica 'As Single
Dim sng_PorcentajeOcupadaVirtual 'As Single
Dim sng_PorcentajeLibreVirtual 'As Single
Dim byt_Precision 'As Byte

'Validando los argumentos y almacenando
'sus valores
If f_RevisarArgumentos( _
                       str_Error, _
                       int_Error) Then

    Call s_Ayuda(str_Error)
    WScript.Quit exit_ERROR

End If

'Si no se trata del equipo local, miramos si responde al ping
If Not Len(str_Equipo) = 0 _
And Not str_Equipo = "." Then

    If Not f_EquipoResponde(str_Equipo) Then
    
        WScript.Echo "El equipo " & str_Equipo & " no responde al ping."
        WScript.Quit exit_ERROR
        
    End If

End If

'Conectamos a WMI
If Not f_ServicioWMI(obj_ServicioWMI, _
                     str_Usuario, _
                     str_Clave, _
                     str_Equipo, _
                     "") Then
                     
    WScript.Echo "No se ha podido conectar con el servicio WMI del " & _
                 "equipo " & str_Equipo
    WScript.Quit exit_ERROR
    
End If

'Obtenemos la colección de computadores del equipo
Set col_Computadores = obj_ServicioWMI.ExecQuery( _
                        "SELECT * FROM Win32_ComputerSystem")

'Recorremos la colección (sólo contiene un elemento)
For Each obj_computador In col_computadores

    'Nos guardamos la cantidad de memoria física que tiene el equipo
    lng_MemoriaFisicaTotal = obj_Computador.TotalPhysicalMemory
    
Next 'obj_Sistema

'Nos limpiamos las zurraspas :-)
Set obj_Computador = Nothing
Set col_Computadores = Nothing

'Obtenemos la colección de sistemas operativos
Set col_Sistemas = obj_ServicioWMI.ExecQuery( _
                    "SELECT * FROM Win32_OperatingSystem")

'Recorremos la colección (sólo contiene un elemento)
For Each obj_Sistema In col_Sistemas

    lng_MemoriaFisicaLibre = obj_Sistema.FreePhysicalMemory
    lng_MemoriaVirtualTotal = obj_Sistema.TotalVirtualMemorySize
    lng_MemoriaVirtualLibre = obj_Sistema.FreeVirtualMemory

Next 'obj_Sistema

'Nueva limpiadita de culete :-)
Set obj_Sistema = Nothing
Set col_Sistemas = Nothing

'Una vez obtenido los valores, montamos la salida. Hay que tener en
'cuenta que el valor expresado de memoria total física por un objeto
'de la clase Win32_ComputerSystem está expresado en Bytes, mientras
'que los valores de memoria (tanto la física como la virtual) expresados
'por un objeto de la clase Win32_OperatingSystem están expresados en
'Kilobytes

'Primero realizamos los cálculos de porcentajes; primero la memoria
'física
sng_PorcentajeOcupadaFisica = 100-((lng_MemoriaFisicaLibre*1024*100) _
                              /lng_MemoriaFisicaTotal)
sng_PorcentajeLibreFisica = (lng_MemoriaFisicaLibre*1024*100) _
                             /lng_MemoriaFisicaTotal
 
'Ahora los porcentajes de la memoria virtual
sng_PorcentajeOcupadaVirtual = 100-((lng_MemoriaVirtualLibre*100) _
                                     /lng_MemoriaVirtualTotal)
sng_PorcentajeLibreVirtual = (lng_MemoriaVirtualLibre*100) _
                              /lng_MemoriaVirtualTotal                     


'Primero la parte de memoria física; expresaremos la salida como:
'Memoria ocupada en MB - memoria ocupada en porcentaje) / memoria total
'- memoria libre en porcentaje.
str_Salida = _
        "Mem: " & _
        FormatNumber((lng_MemoriaFisicaTotal/(1024^2)) - _
                    (lng_MemoriaFisicaLibre/1024),byt_Precision) & _
        " MB (" & _
        FormatNumber(sng_PorcentajeOcupadaFisica,byt_Precision) & _
        "%) / " & _
        FormatNumber(lng_MemoriaFisicaTotal/(1024^2),byt_Precision) & _
        " MB (" & _
        FormatNumber(sng_PorcentajeLibreFisica,byt_Precision) & "%) "
                      
'Ahora añadimos, con la misma información y formato, lo referente a la
'memoria virtual
str_Salida = str_Salida & _
        "Paged Mem: " & _
        FormatNumber((lng_MemoriaVirtualTotal/(1024)) - _
                    (lng_MemoriaVirtualLibre/1024),byt_Precision) & _
        " MB (" & _
        FormatNumber(sng_PorcentajeOcupadaVirtual,byt_Precision) & _
        "%) / " & _
        FormatNumber(lng_MemoriaVirtualTotal/(1024),byt_Precision) & _
        " MB (" & _
        FormatNumber(sng_PorcentajeLibreVirtual,byt_Precision) & _
        "%) "

'Mostramos la cadena montada con la información de la memoria
WScript.Echo str_Salida

'Miramos ahora qué codigo de salida tendrá el script.
If sng_PorcentajeOcupadaFisica >= sng_Critico Then

    'Se iguala o supera el nivel crítico de memoria física ocupada
    WScript.Quit exit_CRITICO
    
ElseIf sng_PorcentajeOcupadaFisica >= sng_Advertencia Then

    'Se iguala o supera el nivel de advertencia de memoria física
    'ocupada
    WScript.Quit exit_ADVERTENCIA
    
Else

    'La memoria física ocupada está por debajo del umbral establecido
    'como nivel de advertencia
    WScript.Quit exit_OK
    
End If 


Function f_RevisarArgumentos( _
                             str_Error, _
                             int_Error _
                             ) 'As Boolean
'***********************************************************************
'* Procedimiento: f_RevisarArgumentos                                  *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 2008-02-08 13:58:28                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Esta función revisa los argumentos recibidos,        *
'*                recogiendo los posibles fallos por falta de          *
'*                argumentos requeridos y almacenando en las           *
'*                variables correspondientes los argumentos            *
'*                recibidos. recibe dos parámetros cuyo fin es ser de  *
'*                salida: una cadena que almacenará los errores        *
'*                detectados y un entero que almacenará el código de   *
'*                los errores detectados. Hay tres tipos de error;     *
'*                error 1 para los argumentos sin nombre requeridos y  *
'*                no encontrados, error 2 para los argumentos con      *
'*                nombre requeridos y no encontrados, por último,      *
'*                error 4 para los combos de argumentos opcionales     *
'*                (un combo de argumentos opcionales es aquel          *
'*                conjunto de argumentos opcionales que es requerido   *
'*                que se pase al menos uno de ellos y que si se pasa   *
'*                más de uno se ignorarán aquellos que estén detrás    *
'*                en la prioridad entre ellos; una característica      *
'*                clara de lo que es un combo de argumentos es cuando  *
'*                dos omás argumentos almacenan su valor en la misma   *
'*                variable). En el caso de producirse más de un tipo   *
'*                de error, el número de error será la suma de ambos   *
'*                de los errores recibidos, es decir 3, 5 o 6          *
'***********************************************************************

    Dim bol_Devolucion 'As Boolean
    Dim bol_Error1 'As Boolean
    Dim bol_Error2 'As Boolean
    Dim bol_Error4 'As Boolean

    'Iniciamos los indicadores
    bol_Devolucion = False
    bol_Error1 = False
    bol_Error2 = False
    bol_Error4 = False


    'Si hay que mostrar la ayuda, se muestra y
    'termina el script
    If WScript.Arguments.Named.Exists("?") Then

        Call s_Ayuda("******************" & vbCrLf & _
                     "*     AYUDA      *" & vbCrLf & _
                     "******************")

        WScript.Quit 0

    End If

    'Revisamos si están todos los argumentos
    'sin nombre requeridos
    If WScript.Arguments.Unnamed.Count < 2 Then

        str_Error = "Error 1, falta/n argumento/s sin " & _
                    "nombre requerido/s"
        bol_Error1 = True

    Else

    'Guardamos los argumentos en las variables
    'correspondientes
        If _
          WScript.Arguments.Unnamed.Count - 1 _
          >= 0 Then _
               sng_Advertencia = _
                       CSng(WScript.Arguments.Unnamed(0))

        If _
          WScript.Arguments.Unnamed.Count - 1 _
          >= 1 Then _
               sng_Critico = _
                       CSng(WScript.Arguments.Unnamed(1))


    End If

    'Revisamos que esté el argumento
    '/E (equipo)
    If WScript.Arguments.Named.Exists("E") Then

        str_Equipo =  _
               WScript.Arguments.Named("E")
               
    End If

    'Revisamos que esté el argumento
    '/U (usuario)
    If WScript.Arguments.Named.Exists("U") Then

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

        'Revisamos que esté el argumento
        '/C (contraseña)
        If WScript.Arguments.Named.Exists("C") Then

            str_Clave =  _
                   WScript.Arguments.Named("C")
                   
        'Como no se ha pasado la contraseña, debemos solicitar
        'al usuario que la entre
        Else
        
            str_Clave = f_EntrarClave( _
                        "https://sitio/clave.html")

        End If

    End If

    'Revisamos que esté el argumento
    '/P (precision)
    If WScript.Arguments.Named.Exists("P") Then

        byt_Precision =  _
               WScript.Arguments.Named("P")

    End If

    'Preparamos las variables de devolucion:
    'el entero como suma de los posibles errores 1, 2 y 4
    int_Error = Abs(bol_Error1) + _
                (2 * Abs(bol_Error2)) + _
                (4 * Abs(bol_Error4))
    'La devolucion de la función será True en caso de
    'haber alguno de los errores
    bol_Devolucion = (bol_Error1 Or bol_Error2 Or bol_Error4)

    'Hacemos la devolución de la función
    f_RevisarArgumentos = bol_Devolucion

End Function 'f_RevisarArgumentos

Sub s_Ayuda(str_Error)
'***********************************************************************
'* Procedimiento: s_Ayuda                                              *
'* Tipo         : Sub                                                  *
'* Devolución   :                                                      *
'* Fecha y Hora : 2008-02-08 13:58:28                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Este procedimiento muestra la ayuda en línea.        *
'*                Recibe un parámetro de tipo cadena que si viene      *
'*                será mostrado antes de la línea; pensado para que    *
'*                se muestre un error que se haya detectado.           *
'***********************************************************************

    'Si hay que mostrar algún texto previo a la ayuda, lo hacemos
    If Len(str_Error) > 0 Then

        WScript.Echo str_Error & vbCrLf & vbCrLf

    End If

    'A continuación, mostramos la ayuda por pantalla
    WScript.Echo "Este script mira el estado de la memoria de un eq" & _
                 "uipo, local o remoto. Muestra"
    WScript.Echo "en la salida la memoria física ocupada y total, e" & _
                 "n Mb, y la memoria virtual"
    WScript.Echo "ocupada y total, también en Mb. Si el tanto por c" & _
                 "iento de la memoria física"
    WScript.Echo "ocupada es menor que el valor recibido como parám" & _
                 "etro de advertencia, el script"
    WScript.Echo "termina devolviendo 0 (todo correcto); si es mayo" & _
                 "r o igual al parámetro de"
    WScript.Echo "advertencia y menor que el de crítico devuelve 1 " & _
                 "(advertencia); si es igual o"
    WScript.Echo "superior al parámetro de crítico devuelve 2 (crit" & _
                 "ico); si se produce un error"
    WScript.Echo "la devolución será 3 (error)."
    WScript.Echo ""
    WScript.Echo "El script utiliza WMI para obtener los datos y pe" & _
                 "rmite obtenerlos de un equipo"
    WScript.Echo "distinto del local; para ello, el script debe ser" & _
                 " lanzado desde una ventana de"
    WScript.Echo "comandos abierta por un usuario con permiso de ac" & _
                 "ceso o pasar los argumentos de"
    WScript.Echo "usuario y contraseña de un usuario que tenga los " & _
                 "permisos."
    WScript.Echo ""
    WScript.Echo "Sintaxis"
    WScript.Echo ""
    WScript.Echo "cscript [//nologo] estado-memoria.vbs [/E:equipo]" & _
                 " [/U:usuario] [/C:contraseña]"
    WScript.Echo "[/P:precision] [/?] advertencia critico"
    WScript.Echo ""
    WScript.Echo "Siendo"
    WScript.Echo ""
    WScript.Echo "- advertencia (Requerido):"
    WScript.Echo "Tanto por ciento de uso de memoria por encima del" & _
                 " cual se"
    WScript.Echo "considera que se ha alcanzado el nivel de aviso."
    WScript.Echo ""
    WScript.Echo "- critico (Requerido):"
    WScript.Echo "Tanto por ciento de uso de memoria por encima del" & _
                 " cual se"
    WScript.Echo "considera que se ha alcanzado el nivel crítico"
    WScript.Echo ""
    WScript.Echo "- /E: equipo (Opcional):"
    WScript.Echo "Nombre del equipo al que se revisará la memoria"
    WScript.Echo ""
    WScript.Echo "- /U: usuario (Opcional):"
    WScript.Echo "Usuario con el que se conectará al servicio WMI d" & _
                 "el equipo en"
    WScript.Echo "el que se mirará la memoria. Si se trata del equi" & _
                 "po local, se"
    WScript.Echo "ignorará, pues no se puede conectar a WMI con cre" & _
                 "denciales"
    WScript.Echo "alternativas desde el equipo local"
    WScript.Echo ""
    WScript.Echo "- /C: contraseña (Opcional):"
    WScript.Echo "Contraseña del usuario especificado con el argume" & _
                 "nto /U. Si"
    WScript.Echo "éste ha sido pasado y no se pasa la contraseña, s" & _
                 "e presentará"
    WScript.Echo "una ventana de Internet Explorer con una caja de " & _
                 "texto de tipo"
    WScript.Echo "password; de esta manera se podrá entrar la contr" & _
                 "aseña a salvo"
    WScript.Echo "de ojos indiscretos"
    WScript.Echo ""
    WScript.Echo "- /P: precision (Opcional):"
    WScript.Echo "Número de dígitos decimales con los que se mostra" & _
                 "rá el"
    WScript.Echo "resultado. Si se omite el valor será cero"
    WScript.Echo ""
    WScript.Echo "- /?: ayuda (Opcional):"
    WScript.Echo "Muestra la ayuda en línea"
    WScript.Echo ""
    WScript.Echo ""
    WScript.Echo "Ejemplos:"
    WScript.Echo ""
    WScript.Echo "- Muestra el estado de la memoria física y virtua" & _
                 "l del equipo local y produce"
    WScript.Echo "la devolución según la ocupación, considerando co" & _
                 "mo nivel de advertencia  ""80"""
    WScript.Echo "y como nivel crítico ""95"":"
    WScript.Echo ""
    WScript.Echo "cscript //nologo estado-memoria.vbs 80 95"
    WScript.Echo ""
    WScript.Echo "- Muestra el estado de la memoria física y virtua" & _
                 "l del equipo bcerrado1 y"
    WScript.Echo "produce la devolución según la ocupación, conside" & _
                 "rando como nivel de"
    WScript.Echo "advertencia  ""80"" y como nivel crítico ""95"":"
    WScript.Echo ""
    WScript.Echo "cscript //nologo estado-memoria.vbs /E:bcerrado1 " & _
                 "80 95"
    WScript.Echo ""
    WScript.Echo "- Muestra el estado de la memoria física y virtua" & _
                 "l del equipo bcerrado1 y"
    WScript.Echo "produce la devolución según la ocupación, conside" & _
                 "rando como nivel de"
    WScript.Echo "advertencia  ""80"" y como nivel crítico ""95"". " & _
                 "Para hacerlo, se conectará al"
    WScript.Echo "servicio WMI del equipo como usuario comarcafrod" & _
                 "o y el script solicitará su"
    WScript.Echo "contraseña:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo estado-memoria.vbs /E:bcerrado1 " & _
                 "/U:comarcafrodo 80 95"
    WScript.Echo ""
    WScript.Echo "- Muestra el estado de la memoria física y virtua" & _
                 "l del equipo bcerrado1 y"
    WScript.Echo "produce la devolución según la ocupación, conside" & _
                 "rando como nivel de"
    WScript.Echo "advertencia  ""80"" y como nivel crítico ""95"". " & _
                 "Para hacerlo, se conectará al"
    WScript.Echo "servicio WMI del equipo como usuario comarcafrod" & _
                 "o y contraseña"
    WScript.Echo "AtaquemosAlOrco69:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo estado-memoria.vbs /E:bcerrado1 " & _
                 "/U:comarcafrodo"
    WScript.Echo "/C:AtaquemosAlOrco69 80 95"
    WScript.Echo ""
    WScript.Echo "- Muestra el estado de la memoria física y virtua" & _
                 "l del equipo bcerrado1 y"
    WScript.Echo "produce la devolución según la ocupación, conside" & _
                 "rando como nivel de"
    WScript.Echo "advertencia  ""80"" y como nivel crítico ""95"". " & _
                 "Para hacerlo, se conectará al"
    WScript.Echo "servicio WMI del equipo como usuario comarcafrod" & _
                 "o y contraseña"
    WScript.Echo "AtaquemosAlOrco69. Los valores mostrados tendrán " & _
                 "una precisión de 2 decimales.:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo estado-memoria.vbs /E:bcerrado1 " & _
                 "/U:comarcafrodo"
    WScript.Echo "/C:AtaquemosAlOrco69 /P:2 80 95"
    WScript.Echo ""
    WScript.Echo ""
    WScript.Echo ""

End Sub 's_Ayuda

Function f_ServicioWMI(obj_ServicioWMI, str_Usuario, _
                       str_Clave, str_Equipo, _
                       str_Espacio)
'***********************************************************************
'* Procedimiento: f_ServicioWMI                                        *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : May 2007                                             *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : 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. Si recibe usuario, contraseña y      *
'*                nombre de equipo a conectar, conectará con ése       *
'*                equipo con las credenciales pasadas, siempre y       *
'*                cuando no se trate del equipo local, en cuyo caso    *
'*                no se conectará con credenciales alternativas si no  *
'*                con el usuario que lanza el script. Si está vacío    *
'*                el parámetro str_Espacio, se conectará con el        *
'*                espacio de nombres rootCIMV2, en caso contrario     *
'*                con el espacio pasado.                               *
'***********************************************************************

    Dim obj_LocalizadorWMI
    Dim lng_Respuesta

    If Len(str_Espacio) = 0 Then str_Espacio = "rootCIMV2"

    'Si hemos recibido nombre de usuario, debemos conectar
    'al servicio WMI del equipo como el usuario
    'recibido. en el caso de que se trate del equipo local
    'ignoramos las credenciales alternativas
    If Len(str_Usuario) > 0 _
    And Not f_EquipoLocal(str_Equipo) 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, str_Espacio, _
                                       str_Usuario, str_Clave)

        'Si se ha producido algún error...
        If Err.Number <> 0 Then

            'Lo primero es vaciar la variable con el localizador WMI
            Set obj_LocalizadorWMI = Nothing

            'Mostramos el error
            WScript.Echo vbCrLf & vbCrLf & _
                         Err.Number & ": " & Err.Description

            'Vaciamos el objeto Err
            Err.Clear

            'Devolvemos False
            f_ServicioWMI = False

            'Salimos de la función
            Exit Function

        End If

    Else

        'Podemos conectar directamente con el servicio WMI del
        'equipo sin necesidad de utilizar el localizador WMI
        'ya que no hay que hacerlo con otras credenciales
        'distintas a las del usuario que lanza el script
        Set obj_ServicioWMI = GetObject("winmgmts:\" & _
                                    str_Equipo & "" & _
                                    str_Espacio)

        'si se ha producido algún error...
        If Err.Number <> 0 Then

            'Mostramos el error
            WScript.Echo Err.Number & ": " & Err.Description & _
                         vbCrLf & vbCrLf

            'Vaciamos el objeto Err
            Err.Clear

            'Devolvemos False
            f_ServicioWMI = False

            'Salimos de la función
            Exit Function

        End If

    End If

    'No se han producido errores, devolvemos True
    f_ServicioWMI = True

    'Limpieza de culito :-)
    Set obj_LocalizadorWMI = Nothing

End Function 'f_ServicioWMI


Function f_EquipoLocal(str_Equipo)
'***********************************************************************
'* Procedimiento: f_EquipoLocal                                        *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : May 2007                                             *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Esta función recibe un nombre de equipo y comprueba  *
'*                si se trata del equipo local o de uno remoto. Si es  *
'*                el equipo local devuelve True, si es remoto False.   *
'*                De paso, si como nombre de equipo local recibió "."  *
'*                cambiará en la variable recibida al nombre           *
'*                verdadero del equipo                                 *
'***********************************************************************

    Dim obj_SH, str_EquipoEntorno

    f_EquipoLocal = False

    'Creamos un objeto WshShell
    Set obj_SH = CreateObject("WScript.Shell")

    'Obtenemos el valor de la variable de entorno con
    'el nombre de equipo
    str_EquipoEntorno = UCase( _
       obj_SH.ExpandEnvironmentStrings("%COMPUTERNAME%"))

    'Si está vacío el nombre de equipo, o es ".",
    'se trata del equipo local; lo asignamos a la
    'variable
    If Len(str_Equipo) = 0 _
    Or str_Equipo = "." Then


        str_Equipo = str_EquipoEntorno
        f_EquipoLocal = True

    'Ahora revisamos no se haya pasado el FQDN del equipo
    'local o su nombre NetBios
    ElseIf _
        ( _
        Len(str_Equipo) > Len(str_EquipoEntorno) _
        And UCase(Left(str_Equipo, Len(str_EquipoEntorno))) = _
                      UCase(str_EquipoEntorno) _
        And Mid(str_Equipo, Len(str_EquipoEntorno) + 1, 1) = _
                      "." _
        ) _
    Or UCase(str_Equipo) = UCase(str_EquipoEntorno) Then

            str_Equipo = str_EquipoEntorno
            f_EquipoLocal = True

    End If

End Function 'f_EquipoLocal


Function f_EntrarClave(str_HTML)
'***********************************************************************
'* Procedimiento: f_EntrarClave                                        *
'* Tipo         : Función                                              *
'* Devolución   : Cadena                                               *
'* Fecha y Hora : May 2007                                             *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : 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/scriptcenter/guide/sas_ent_lppm.msp
'*x?mfr=true
'*                                                                     *
'*                En el ejemplo de TechNet se pone una ruta local      *
'*                (c:carpetafichero.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; la      *
'*                mejor opción de todas sería situarlo en un servidor  *
'*                web seguro, y poner su ruta https, de esa manera     *
'*                eludimos a alguien que esté usando un sniffer        *
'*                                                                     *
'*                El código de la página puede ser tan simple como:    *
'*                <html>                                               *
'*                <script language="VBScript">                         *
'*                <!--                                                 *
'*                Sub Aceptar_OnClick()                                *
'*                                                                     *
'*                AceptarPulsado.Value = "Pulsado"                     *
'*                                                                     *
'*                End Sub                                              *
'*                -->                                                  *
'*                </script>                                            *
'*                <body>                                               *
'*                Entre la contraseña del usuario con el que se        *
'*                conectará al servicioWMI del equipo:                 *
'*                <input type="password" name ="Clave" size="20">      *
'*                <p><input name="Aceptar" type="button"               *
'*                value="Aceptar" ></p>                                *
'*                <p><input type="hidden" name="AceptarPulsado"        *
'*                size="20"></p>                                       *
'*                </body></html>                                       *
'***********************************************************************

    '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 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_EquipoResponde(str_Equipo) 'As Boolean
'***********************************************************************
'* Procedimiento: f_EquipoResponde                                     *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : May 2007                                             *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Esta función recibe un nombre de equipo (ya sea      *
'*                nombre en sí o IP) y, por medio de PING, revisa si   *
'*                el equipo responde o no                              *
'***********************************************************************

    'Objeto shell para ejecutar ping y
    'enviar la salida a un fichero temporal
    Dim obj_Shell 'As Object
    'Objeto FileSystem para abrir y borrar
    'el fichero temporal
    Dim obj_FileSystem 'As Object
    'Objeto TextStream para leer el fichero
    'temporal
    Dim obj_Fichero 'As Object
    'Se volcará en esta variable el
    'contenido del fichero temporal
    Dim str_ContenidoFichero 'As String
    'Sirve para establecer la ruta y
    'nombre del fichero temporal
    Dim str_FicheroTemporal 'As String

    'Creamos los objetos FileSystem y Shell
    Set obj_Shell = CreateObject("WScript.Shell")
    Set obj_FileSystem = CreateObject("Scripting.FileSystemObject")

    'Establecemos el fichero temporal en la ruta
    'de este libro de Excel y con el nombre
    '"temp.txt"
    str_FicheroTemporal = _
             obj_Shell.ExpandEnvironmentStrings( _
                                 "%TEMP%temp.txt")

    'Ejecutamos el ping volcando la salida en el
    'fichero temporal. Sólo esperaremos un eco ("-n 1")
    obj_Shell.Run "cmd /c ping -n 1 " & str_Equipo & " > """ & _
                  str_FicheroTemporal & """", 0, True

    'Abrimos el fichero temporal sobre el objeto fichero
    Set obj_Fichero = obj_FileSystem.OpenTextFile( _
                              str_FicheroTemporal, 1, False)

    'Volcamos el contenido del fichero temporal
    'en str_ContenidoFichero
    str_ContenidoFichero = obj_Fichero.ReadAll

    'Cerramos el fichero temporal y vaciamos su variable
    obj_Fichero.Close
    Set obj_Fichero = Nothing

    'Borramos el fichero temporal y vaciamos
    'los objetos Shell y FileSystem
    obj_FileSystem.DeleteFile (str_FicheroTemporal)
    Set obj_FileSystem = Nothing
    Set obj_Shell = Nothing

    'Si encontramos la cadena "TTL=" significa
    'que el equipo respondió y por tanto la función
    'devuelve True, en caso contrario significa que
    'no respondió el equipo y por tanto devuelve
    'False
    If InStr(str_ContenidoFichero, "TTL=") > 0 Then
        f_EquipoResponde = True
    Else
        f_EquipoResponde = False
    End If

End Function 'f_EquipoResponde

 

Nota: debo avisar de que este script puede fallar, sobre todo en equipos con 4GB de memoria RAM, a la hora de mostrar los valores de la memoria virtual, debido a una mala implantación de la clase Win32_OperatingSystem. A pesar de que MS dice que se soluciona con un parche, hemos probado este parche y no se ha instalado, pues el SP2 se supone que ya lo lleva y hace que no se deje instalar, con lo que el error se sigue produciendo. Al menos sí que funciona la parte de memoria física.

The “Win32_OperatingSystem WMI” class may display incorrect values for the TotalVirtualMemorySize parameter or for the FreeVirtualMemory parameter on a Windows Server 2003-based computer

Some memory-related results that are returned from the Win32_OperatingSystem WMI class are incorrect in Windows 2000 and in Windows Server 2003

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: