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…

VBScript Para Listar Los Servicios Lanzados Por Usuarios No Del Sistema

Posted by urpiano en Martes 13 \13\UTC enero \13\UTC 2009

Este script lista los servicios y usuarios que los lanzan, cuando estos usuarios no son LocalSystem, ni NT AUTHORITY\NetworkService ni NT AUTHORITY\LocalService. Permite hacer esto en el equipo desde el que se lanza y en equipos remotos.

Sintaxis

cscript [//nologo] listar-usuarios-servicios.vbs [/E:equipos] [/F:fichero] [/U:usuario] [/C:contraseña] [/S:fichero] [/?]

Siendo

Etiqueta Dato ¿Requerido? Descripción
E equipos No
Lista de nombres de equipos separados por comas. Si está presente /F, será ignorado. Si se omite y se omite /O, se listarán los servicios en el equipo local
F fichero No
ruta y ombre de fichero de texto con lo nombres de los equipos a listar, uno por línea. En el caso de omitirse y omitirse también /E, se listarán los servicios del equipo local
U usuario No
Usuario con el que se conectará al servicio WMI de los equipos. En caso de omitirse se conectará por medio de impersonate, es decir, con el usuario que lanza el script
C contraseña No
Contraseña del usuario especificado con /U. Si se ha pasado /U y se omite, el script solicitará que se entre la contraseña de forma interactiva
S fichero No
Fichero de valores separados por tabuladores en el que se volcarán los resultados. Si se omite, se volcarán por pantalla exclusivamente
?   No
Muestra la ayuda en línea.

Ejemplos:

– Lista por pantalla los servicios, que son lanzados por algún usuario no del sistema, del equipo local:

cscript //nologo listar-usuarios-servicios.vbs

– Lista por pantalla los servicios, que son lanzados por algún usuario no del sistema, de los equipos mortadelo-srv,vicente-srv,bacterio-des:

cscript //nologo listar-usuarios-servicios.vbs /E:mortadelo-srv,vicente-srv,bacterio-des

– Lista por pantalla los servicios, que son lanzados por algún usuario no del sistema, de los equipos listados en el fichero \\filemon-pc\listados\servidores-cpd.lst:

cscript //nologo listar-usuarios-servicios.vbs /F:\\filemon-pc\listados\servidores-cpd.lst

– Lista por pantalla los servicios, que son lanzados por algún usuario no del sistema, de los equipos listados en el fichero \\filemon-pc\listados\servidores-cpd.lst. Para acceder al servicio WMI de los equipos, se hará con el usuario TIA\ofelia y el script solicitará que se entre la contraseña:

cscript //nologo listar-usuarios-servicios.vbs /F:\\filemon-pc\listados\servidores-cpd.lst /U:TIA\ofelia

– Lista por pantalla los servicios, que son lanzados por algún usuario no del sistema, de los equipos listados en el fichero \\filemon-pc\listados\servidores-cpd.lst. Para acceder al servicio WMI de los equipos, se hará con el usuario TIA\ofelia y la contraseña “mortadelo me ama”:

cscript //nologo listar-usuarios-servicios.vbs /F:\\filemon-pc\listados\servidores-cpd.lst /U:TIA\ofelia /C:"mortadelo me ama"

– Lista por pantalla los servicios, que son lanzados por algún usuario no del sistema, de los equipos listados en el fichero \\filemon-pc\listados\servidores-cpd.lst. Para acceder al servicio WMI de los equipos, se hará con el usuario TIA\ofelia y la contraseña “mortadelo me ama”. Los resultados se guardarán en el fichero c:\listados\servicios-usuarios.tsv:

cscript //nologo listar-usuarios-servicios.vbs /F:\\filemon-pc\listados\servidores-cpd.lst /U:TIA\ofelia /C:"mortadelo me ama" /S:c:\listados\servicios-usuarios.tsv

Este es el código del script



'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'* listar-usuarios-servicios.vbs                                       *
'*                                                                     *
'* Este script lista los servicios y usuarios que los lanzan, cuando   *
'* estos usuarios no son LocalSystem, ni NT AUTHORITY\NetworkService   *
'* ni NT AUTHORITY\LocalService. Permite hacer esto en el equipo desde *
'* el que se lanza y en equipos remotos.                               *
'*                                                                     *
'* Sintaxis                                                            *
'*                                                                     *
'* cscript [//nologo] listar-usuarios-servicios.vbs [/E:equipos]       *
'* [/F:fichero] [/U:usuario] [/C:contraseña] [/S:fichero] [/?]         *
'*                                                                     *
'* Siendo                                                              *
'*                                                                     *
'* - /E: equipos (Opcional):                                           *
'*         Lista de nombres de equipos separados por comas. Si está    *
'*         presente /F, será ignorado. Si se omite y se omite /O, se   *
'*         listarán los servicios en el equipo local                   *
'*                                                                     *
'* - /F: fichero (Opcional):                                           *
'*         ruta y ombre de fichero de texto con lo nombres de los      *
'*         equipos a listar, uno por línea. En el caso de omitirse y   *
'*         omitirse también /E, se listarán los servicios del equipo   *
'*         local                                                       *
'*                                                                     *
'* - /U: usuario (Opcional):                                           *
'*         Usuario con el que se conectará al servicio WMI de los      *
'*         equipos. En caso de omitirse se conectará por medio de      *
'*         impersonate, es decir, con el usuario que lanza el script   *
'*                                                                     *
'* - /C: contraseña (Opcional):                                        *
'*         Contraseña del usuario especificado con /U. Si se ha pasado *
'*         /U y se omite, el script solicitará que se entre la         *
'*         contraseña de forma interactiva                             *
'*                                                                     *
'* - /S: fichero (Opcional):                                           *
'*         Fichero de valores separados por tabuladores en el que se   *
'*         volcarán los resultados. Si se omite, se volcarán por       *
'*         pantalla exclusivamente                                     *
'*                                                                     *
'* - /?: ayuda (Opcional):                                             *
'*         Muestra la ayuda en línea                                   *
'*                                                                     *
'*                                                                     *
'* Ejemplos:                                                           *
'*                                                                     *
'* - Lista por pantalla los servicios, que son lanzados por algún      *
'* usuario no del sistema, del equipo local:                           *
'*                                                                     *
'* cscript //nologo listar-usuarios-servicios.vbs                      *
'*                                                                     *
'* - Lista por pantalla los servicios, que son lanzados por algún      *
'* usuario no del sistema, de los equipos                              *
'* mortadelo-srv,vicente-srv,bacterio-des:                             *
'*                                                                     *
'* cscript //nologo listar-usuarios-servicios.vbs                      *
'* /E:mortadelo-srv,vicente-srv,bacterio-des                           *
'*                                                                     *
'* - Lista por pantalla los servicios, que son lanzados por algún      *
'* usuario no del sistema, de los equipos listados en el fichero       *
'* \\filemon-pc\listados\servidores-cpd.lst:                           *
'*                                                                     *
'* cscript //nologo listar-usuarios-servicios.vbs                      *
'* /F:\\filemon-pc\listados\servidores-cpd.lst                         *
'*                                                                     *
'* - Lista por pantalla los servicios, que son lanzados por algún      *
'* usuario no del sistema, de los equipos listados en el fichero       *
'* \\filemon-pc\listados\servidores-cpd.lst. Para acceder al servicio  *
'* WMI de los equipos, se hará con el usuario TIA\ofelia y el script   *
'* solicitará que se entre la contraseña:                              *
'*                                                                     *
'* cscript //nologo listar-usuarios-servicios.vbs                      *
'* /F:\\filemon-pc\listados\servidores-cpd.lst /U:TIA\ofelia           *
'*                                                                     *
'* - Lista por pantalla los servicios, que son lanzados por algún      *
'* usuario no del sistema, de los equipos listados en el fichero       *
'* \\filemon-pc\listados\servidores-cpd.lst. Para acceder al servicio  *
'* WMI de los equipos, se hará con el usuario TIA\ofelia y la          *
'* contraseña "mortadelo me ama":                                      *
'*                                                                     *
'* cscript //nologo listar-usuarios-servicios.vbs                      *
'* /F:\\filemon-pc\listados\servidores-cpd.lst /U:TIA\ofelia           *
'* /C:"mortadelo me ama"                                               *
'*                                                                     *
'* - Lista por pantalla los servicios, que son lanzados por algún      *
'* usuario no del sistema, de los equipos listados en el fichero       *
'* \\filemon-pc\listados\servidores-cpd.lst. Para acceder al servicio  *
'* WMI de los equipos, se hará con el usuario TIA\ofelia y la          *
'* contraseña "mortadelo me ama". Los resultados se guardarán en el    *
'* fichero c:\listados\servicios-usuarios.tsv:                         *
'*                                                                     *
'* cscript //nologo listar-usuarios-servicios.vbs                      *
'* /F:\\filemon-pc\listados\servidores-cpd.lst /U:TIA\ofelia           *
'* /C:"mortadelo me ama" /S:c:\listados\servicios-usuarios.tsv         *
'*                                                                     *
'*                                                                     *
'*                                                                     *
'*                                                                     *
'* © Fernando Reyes                                                    *
'* Enero De 2009                                                       *
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*

'Exigimos la declaración de variables
Option Explicit


Dim str_Error 'As String
Dim int_Error 'As String
Dim arr_Equipos 'As String
Dim str_Usuario 'As String
Dim str_Clave 'As String
Dim str_Fichero 'As String
Dim str_Salida 'As String
Dim str_Equipo 'As String
Dim str_Resultado 'As String

Dim obj_FS 'As Scripting.FileSystemObject
Dim obj_TS 'As Scripting.TextStream



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

    Call s_Ayuda(str_Error)
    WScript.Quit int_Error

End If

str_Salida = "Equipo" & vbTab & _
             "Conexión a WMI" & vbTab & _
             "Servicio" & vbTab & _
             "Etiqueta" & vbTab & _
             "Descripción" & vbTab & _
             "Tipo de Inicio" & vbTab & _
             "Usuario de inicio"
             
WScript.Echo str_Salida & vbCrLf & _
             "======" & vbTab & _
             "==============" & vbTab & _
             "========" & vbTab & _
             "========" & vbTab & _
             "===========" & vbTab & _
             "==============" & vbTab & _
             "================="

'Recorremos los equipos a procesar
For Each str_Equipo In arr_Equipos

    'Si el equipo responde a PING
    If f_EquipoResponde(str_Equipo) Then
    
        'Procesamos el equipo y almacenamos el resultqado
        str_Resultado = f_ListarServicio(str_Equipo)
        
        'Mostramos el resultado por pantalla
        WScript.Echo str_Resultado
        
        'Almacenamos el resultado en la variable de
        'salida a fichero
        str_Salida = str_Salida & vbCrLf & _
                     str_Resultado        
                     
    Else
    
        'Si no responde, reflejamos esta circunstancia
        WScript.Echo str_Equipo & vbTab & "No responde a PING."
        str_Salida = str_Salida & vbCrLf & _
                     str_Equipo & vbTab & "No responde a PING."
        
    End If

Next 'str_Equipo

'Si hay que volcar información en el fichero
'de salida de ruta y nombre str_Fichero
If Len(str_Fichero) > 0 Then

    'Creamos un objeto FileSystemObject
    Set obj_FS = CreateObject("Scripting.FileSystemObject")

    'Creamos el fichero de salida
    Set obj_TS = obj_FS.CreateTextFile(str_Fichero)

    'Volcamos la información de salida en el fichero
    obj_TS.Write str_Salida

    'Cerramos el fichero de salida
    obj_TS.Close

    'Limpieza de popa :-)
    Set obj_TS = Nothing
    Set obj_FS = Nothing

End If

Function f_ListarServicio(str_Equipo)
'***********************************************************************
'* Procedimiento: f_ListarServicio                                     *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 13/01/2009 9:50:40                                   *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : esta función conecta al servicio WMI del equipo      *
'*                recibido como parámetro y lista los servicios que    *
'*                son lanzados por usuarios no del sistema, así como   *
'*                los nombres de esos usuarios. La devolución de la    *
'*                función es la lista obtenida                         *
'***********************************************************************

    Dim obj_ServicioWMI 'As WbemServices
    Dim str_Consulta 'As String
    Dim col_Servicios 'As Win32_Service Collection
    Dim obj_Servicio 'As Win32_Service
    Dim str_Devolucion 'As String
    
    'Conectamos al servicio WMI del equipo
    If Not f_ServicioWMI(obj_ServicioWMI, _
                         str_Usuario, _
                         str_Clave, _
                         str_Equipo, _
                         "") Then
    
        'Se produjo error, lo registramos y salimos de la función
        f_ListarServicio = str_Equipo & vbTab & _
                           "No se pudo conectar al servicio WMI."
                           
        Exit Function
        
    End If   

    'Creamos la cadena de consulta de servicios
    str_Consulta = "SELECT * FROM Win32_Service"
    
    'Ejecutamos la consulta
    Set col_Servicios = obj_ServicioWMI.ExecQuery(str_Consulta)
    
    'Recorremos los servicios obtenidos por la consulta
    For Each obj_Servicio In col_Servicios
    
        'Listaremos los servicios que no sean inicados por usuarios
        'del sistema
        If UCase(obj_Servicio.StartName) <> "LOCALSYSTEM" _
        And UCase(obj_Servicio.StartName) <> _
                                    "NT AUTHORITY\NETWORKSERVICE" _
        And UCase(obj_Servicio.StartName) <> _
                                    "NT AUTHORITY\LOCALSERVICE" Then
        
            'Agregamos el servicio a la lista
            str_Devolucion = str_Devolucion & _
                             str_Equipo & vbTab & _
                             "Conectado a WMI con éxito" & vbTab & _
                             obj_Servicio.Name & vbTab & _
                             obj_Servicio.Caption & vbTab & _
                             obj_Servicio.Description & vbTab & _
                             obj_Servicio.StartMode & vbTab & _
                             obj_Servicio.StartName & vbCrLf
                             
        End If
    
    Next 'obj_Servicio
    
    'Si se ha producido alguna devolución, quitamos el salto de
    'línea final
    If Len(Trim(str_Devolucion)) > 0 Then 
        
        str_Devolucion = Left(str_Devolucion,Len(str_Devolucion) - 2)
        
    Else
    
        'No hay servicios lanzados por usuarios del sistema, lo
        'reflejamos en la devolución
        str_Devolucion = str_Equipo & vbTab & _
                        "Conectado a WMI con éxito" & vbTab & _
                        "No hay servicios lanzados" & vbCrLf & _
                        " por un usuario no del sistema."
        
    End if
    
    'Devolvemos el resultado
    f_ListarServicio = str_Devolucion
    
    'Limpieza de bullarenga :-)
    Set obj_Servicio = Nothing
    Set col_Servicios = Nothing
    Set obj_ServicioWMI = Nothing

End Function 'f_ListarServicio

Function f_RevisarArgumentos( _
                             str_Error, _
                             int_Error _
                             ) 'As Boolean
'***********************************************************************
'* Procedimiento: f_RevisarArgumentos                                  *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 13/01/2009 9:35:07                                   *
'* 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
    Dim obj_FS 'As Scripting.FileSystemObject
    Dim obj_TS 'As Scripting.TextStream

    '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 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")
                   
        Else
        
            str_Clave = f_EntrarClave( _
                        "https://bestiajez.tia.org/login.htm")

        End If

    End If

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

        str_Fichero =  _
               WScript.Arguments.Named("S")

    End If

    'Revisamos si ha sido pasado el argumento
    '/F (fichero)
    If WScript.Arguments.Named.Exists("F") Then

        Set obj_FS = CreateObject( _
                           "Scripting.FileSystemObject")
        Set obj_TS = obj_FS.OpenTextFile( _
                             Wscript.Arguments.Named("F"))

        arr_Equipos = Split( _
               obj_TS.ReadAll,vbCrLf)

        obj_TS.Close

        Set obj_TS = Nothing
        Set obj_FS = Nothing

    'Revisamos si ha sido pasado el argumento
    '/E (equipos)
    Elseif WScript.Arguments.Named.Exists("E") Then

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

    Else

        arr_Equipos = Array(".")

    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 : 13/01/2009 10:54:20                                  *
'* 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 lista los servicios y usuarios que lo" & _
                 "s lanzan, cuando estos"
    WScript.Echo "usuarios no son LocalSystem, ni NT AUTHORITY\Netw" & _
                 "orkService ni NT"
    WScript.Echo "AUTHORITY\LocalService. Permite hacer esto en el " & _
                 "equipo desde el que se lanza y"
    WScript.Echo "en equipos remotos."
    WScript.Echo ""
    WScript.Echo "Sintaxis"
    WScript.Echo ""
    WScript.Echo "cscript [//nologo] listar-usuarios-servicios.vbs " & _
                 "[/E:equipos] [/F:fichero]"
    WScript.Echo "[/U:usuario] [/C:contraseña] [/S:fichero] [/?]"
    WScript.Echo ""
    WScript.Echo "Siendo"
    WScript.Echo ""
    WScript.Echo "- /E: equipos (Opcional):"
    WScript.Echo "Lista de nombres de equipos separados por comas. " & _
                 "Si está"
    WScript.Echo "presente /F, será ignorado. Si se omite y se omit" & _
                 "e /O, se"
    WScript.Echo "listarán los servicios en el equipo local"
    WScript.Echo ""
    WScript.Echo "- /F: fichero (Opcional):"
    WScript.Echo "ruta y ombre de fichero de texto con lo nombres d" & _
                 "e los equipos"
    WScript.Echo "a listar, uno por línea. En el caso de omitirse y" & _
                 " omitirse"
    WScript.Echo "también /E, se listarán los servicios del equipo " & _
                 "local"
    WScript.Echo ""
    WScript.Echo "- /U: usuario (Opcional):"
    WScript.Echo "Usuario con el que se conectará al servicio WMI d" & _
                 "e los equipos."
    WScript.Echo "En caso de omitirse se conectará por medio de imp" & _
                 "ersonate, es"
    WScript.Echo "decir, con el usuario que lanza el script"
    WScript.Echo ""
    WScript.Echo "- /C: contraseña (Opcional):"
    WScript.Echo "Contraseña del usuario especificado con /U. Si se" & _
                 " ha pasado /U"
    WScript.Echo "y se omite, el script solicitará que se entre la " & _
                 "contraseña de"
    WScript.Echo "forma interactiva"
    WScript.Echo ""
    WScript.Echo "- /S: fichero (Opcional):"
    WScript.Echo "Fichero de valores separados por tabuladores en e" & _
                 "l que se"
    WScript.Echo "volcarán los resultados. Si se omite, se volcarán" & _
                 " por pantalla"
    WScript.Echo "exclusivamente"
    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 "- Lista por pantalla los servicios, que son lanza" & _
                 "dos por algún usuario no del"
    WScript.Echo "sistema, del equipo local:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo listar-usuarios-servicios.vbs"
    WScript.Echo ""
    WScript.Echo "- Lista por pantalla los servicios, que son lanza" & _
                 "dos por algún usuario no del"
    WScript.Echo "sistema, de los equipos mortadelo-srv,vicente-srv" & _
                 ",bacterio-des:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo listar-usuarios-servicios.vbs"
    WScript.Echo "/E:mortadelo-srv,vicente-srv,bacterio-des"
    WScript.Echo ""
    WScript.Echo "- Lista por pantalla los servicios, que son lanza" & _
                 "dos por algún usuario no del"
    WScript.Echo "sistema, de los equipos listados en el fichero"
    WScript.Echo "\\filemon-pc\listados\servidores-cpd.lst:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo listar-usuarios-servicios.vbs"
    WScript.Echo "/F:\\filemon-pc\listados\servidores-cpd.lst"
    WScript.Echo ""
    WScript.Echo "- Lista por pantalla los servicios, que son lanza" & _
                 "dos por algún usuario no del"
    WScript.Echo "sistema, de los equipos listados en el fichero"
    WScript.Echo "\\filemon-pc\listados\servidores-cpd.lst. Para ac" & _
                 "ceder al servicio WMI de los"
    WScript.Echo "equipos, se hará con el usuario TIA\ofelia y el s" & _
                 "cript solicitará que se entre"
    WScript.Echo "la contraseña:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo listar-usuarios-servicios.vbs"
    WScript.Echo "/F:\\filemon-pc\listados\servidores-cpd.lst /U:TI" & _
                 "A\ofelia"
    WScript.Echo ""
    WScript.Echo "- Lista por pantalla los servicios, que son lanza" & _
                 "dos por algún usuario no del"
    WScript.Echo "sistema, de los equipos listados en el fichero"
    WScript.Echo "\\filemon-pc\listados\servidores-cpd.lst. Para ac" & _
                 "ceder al servicio WMI de los"
    WScript.Echo "equipos, se hará con el usuario TIA\ofelia y la c" & _
                 "ontraseña ""mortadelo me ama"":"
    WScript.Echo ""
    WScript.Echo "cscript //nologo listar-usuarios-servicios.vbs"
    WScript.Echo "/F:\\filemon-pc\listados\servidores-cpd.lst /U:TI" & _
                 "A\ofelia /C:""mortadelo me ama"""
    WScript.Echo ""
    WScript.Echo "- Lista por pantalla los servicios, que son lanza" & _
                 "dos por algún usuario no del"
    WScript.Echo "sistema, de los equipos listados en el fichero"
    WScript.Echo "\\filemon-pc\listados\servidores-cpd.lst. Para ac" & _
                 "ceder al servicio WMI de los"
    WScript.Echo "equipos, se hará con el usuario TIA\ofelia y la c" & _
                 "ontraseña ""mortadelo me ama""."
    WScript.Echo "Los resultados se guardarán en el fichero c:\list" & _
                 "ados\servicios-usuarios.tsv:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo listar-usuarios-servicios.vbs"
    WScript.Echo "/F:\\filemon-pc\listados\servidores-cpd.lst /U:TI" & _
                 "A\ofelia /C:""mortadelo me ama"""
    WScript.Echo "/S:c:\listados\servicios-usuarios.tsv"
    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 root\CIMV2, en caso contrario     *
'*                con el espacio pasado.                               *
'***********************************************************************

    Dim obj_LocalizadorWMI
    Dim lng_Respuesta

    If Len(str_Espacio) = 0 Then str_Espacio = "root\CIMV2"

    '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 el control de errores a Cscript
            On Error Goto 0

            '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

        'Establecemos control de errores
        On Error Resume Next

        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 el control de errores a Cscript
            On Error Goto 0

            '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

    'Devolvemos el control de errores a Cscript
    On Error Goto 0

    '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:\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; 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")

    'Si nombre de equipo es un punto, lo sustituimos por su nombre
    'según la variable de entorno COMPUTERNAME
    If str_Equipo = "." Then _
        str_Equipo = UCase( _
           obj_Shell.ExpandEnvironmentStrings("%COMPUTERNAME%"))    
    
    '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)

    '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 o que se trata de Windows
    'Vista, Windows 7, o Windows Server 2008
    If InStr(str_ContenidoFichero, "TTL=") > 0 Then
    
        f_EquipoResponde = True
        
    Else
    
        'Vamos a repetir el mecanismo de búsqueda, especificando
        'las opciones para hacer sólo ping en IPv4
        obj_Shell.Run "cmd /c ping -n 1 -v IPv4-only " & 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)
        If InStr(str_ContenidoFichero, "TTL=") > 0 Then
            f_EquipoResponde = True
        Else
            f_EquipoResponde = False
        End If
        
    End If
    
    Set obj_FileSystem = Nothing
    Set obj_Shell = Nothing


End Function 'f_EquipoResponde

2 comentarios to “VBScript Para Listar Los Servicios Lanzados Por Usuarios No Del Sistema”

  1. Nacho said

    Buenas Fernando. Soy Nacho, del CCR de Clece.

    Estaba intentando ejecutar este script (VBScript Para Listar Los Servicios Lanzados Por Usuarios No Del Sistema) que creo recordar desarrollaste cuando estabas en JCamarillo para ACS, y me da unos fallos, que te indico, a ver si me puedes echar un cable.
    La idea es sacar los servicios que se ejecutan con el usuario administrador del dominio.
    ____________
    D:\Scripts>cscript Listar_Servicios.vbs /E:acscpd1801 /u:administrador /S:expor
    tando.txt
    Microsoft (R) Windows Script Host versión 5.7
    Copyright (C) Microsoft Corporation 1996-2001. Reservados todos los derechos.

    D:\Scripts\Listar_Servicios.vbs(840, 5) Microsoft VBScript runtime error: Object
    doesn’t support this property or method: ‘obj_IE.Document.All.AceptarPulsado’
    ________
    A la vez, sale una ventana de IE, la típica de que no puede mostrar la página, y ahí se queda. Por tus comentarios, (carpetafichero.asp)no entiendo muy bien cómo toma la ruta para coger ese fichero. Creo que por ahí van los tiros, pero…

    Bueno, a ver si quedamos para un “Hard Rock” o unas cañas…. je je. Y vente un día a uno de los conciertos….

    Un saludo
    Nacho

    • urpiano said

      Nacho,

      Prueba a pasarle la contraseña al script. Esa ventana es para que se solicite de forma interactiva la entrada de la contraseña y apunta a una página web ficticia, que debes crear, siguiendo lo que dicen los comentarios y albergar en un servidor web, cambiando la URL del código por la que hayas establecido tú. Eso o, como te he dicho al principio, pasarle en la línea de comando el parámetro de la contraseña.

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: