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 Que Sirve Para Listar Los Ficheros Y Carpetas En Una Fecha (versión WMI)

Posted by urpiano en Miércoles 13 \13\UTC febrero \13\UTC 2008

Este script permite listar las carpetas y ficheros creados, accesados o modificados por última vez (dependiendo del tipo de fecha pasado como parámetro) en el día de la fecha recibida como parámetro 2 en la ruta recibida como parámetro 1. Los resultados los muestra divididos por tabuladores, lo que permite redireccionarlo a un fichero y abrir éste con Excel (también permite llevar esta salida a un fichero especificado por el parámetro /F). debido a que utiliza WMI para listar, se puede listar los ficheros y carpetas de un equipo remoto, siempre y cuando el usuario que lance el script esté autorizado para la administración remota en el equipo de destino, o sea pasado usuario/contraseña de un usuario que tenga este permiso.

He decir algo en su contra: el mecanismo por el cual busca WMI ficheros me parece extremadamente lento y por ello sólo me parece útil este script en el caso de quere realizar la búsqueda en equipos remotos, pues si se trata del equipo local, es muchísimo más rápido el script basado en el uso del objeto FileSystemObject, publicado aquí.

Sintaxis

cscript [//nologo] listar-ruta-en-fecha-wmi.vbs [/F:fichero] [/E:equipos] [/U:usuario] [/C:contraseña] [/T:tipo_fecha] [/?] ruta fecha

Siendo

Etiqueta Dato ¿Requerido? Descripción
  ruta
Ruta de la carpeta en la que se buscarán sus carpetas y fichero creados en la fecha recibida como parámetro
  fecha
Fecha en formato DD/MM/AAAA de la cual se buscarán los ficheros y carpetas creados en ella dentro de la ruta recibida como parámetro 1
F fichero No
Ruta y nombre de fichero en el cual se volcarán los resultados; se trata de un fichero de valores separados por tabuladores. Al nombre recibido se le añadirá la fecha en formato AAAAMMDD y la extensión TSV
E equipos No
Lista de nombres NetBios de los equipos en los que se buscarán los ficheros; si se omite se buscarán en el equipo local
U usuario No
Usuario con el que se conectará al servicio WMI del equipo recibido como parámetro; si se trata del equipo local, este parámetro será ignorado, pues no se puede acceder a WMI con credenciales alternativas en el equipo local
C contraseña No
Contraseña del usuario recibido como parámetro /U. Si no se suministra, el script presentará una ventana de Internet Explorer en la que pedirá que se entre, en una caja de texto de tipo password, con lo que quedará a salvo de ojos indiscretos
T tipo_fecha No
Tipo de fecha que se revisará. Puede ser C (fecha de creación), A (fecha de último acceso) y M (fecha de modificación). Si se omite, se revisará la fecha de creación
?   No
Muestra la ayuda en línea.

Ejemplos:

– Lista los ficheros y carpetas contenidos en “c:gondor” que fueron creados el “24/11/2007”; la búsqueda se realizará en el equipo local:

cscript //nologo listar-ruta-en-fecha-wmi.vbs "c:gondor" "24/11/2007"

– Lista los ficheros y carpetas contenidos en “c:gondor” que fueron creados el “24/11/2007” y el resultado lo vuelca en el fichero de nombre x:listadosgondor22071124.tsv; la búsqueda se realizará en el equipo local:

cscript //nologo listar-ruta-en-fecha-wmi.vbs /F:x:listadosgondor22071124.tsv "c:gondor" "24/11/2007"

– Lista los ficheros y carpetas contenidos en “c:gondor” que fueron creados el “24/11/2007” y el resultado lo vuelca en el fichero de nombre x:listadosgondor22071124.tsv; la búsqueda la realizará en los equipos pc-boromir,pc-denethor,pc-peregrin:

cscript //nologo listar-ruta-en-fecha-wmi.vbs /F:x:listadosgondor22071124.tsv /E:pc-boromir,pc-denethor,pc-peregrin "c:gondor" "24/11/2007"

– Lista los ficheros y carpetas contenidos en “c:gondor” que fueron creados el “24/11/2007” y el resultado lo vuelca en el fichero de nombre x:listadosgondor22071124.tsv; la búsqueda la realizará en los equipos pc-boromir,pc-denethor,pc-peregrin, conectando como el usuario gondorfaramir, y el script solicitará la contraseña de dicho usuario:

cscript //nologo listar-ruta-en-fecha-wmi.vbs /F:x:listadosgondor22071124.tsv /E:pc-boromir,pc-denethor,pc-peregrin /U:gondorfaramir "c:gondor" "24/11/2007"

– Lista los ficheros y carpetas contenidos en “c:gondor” que fueron creados el “24/11/2007” y el resultado lo vuelca en el fichero de nombre x:listadosgondor22071124.tsv; la búsqueda la realizará en los equipos pc-boromir,pc-denethor,pc-peregrin, conectando como el usuario gondorfaramir y contraseña vamosaOsgiliath:

cscript //nologo listar-ruta-en-fecha-wmi.vbs /F:x:listadosgondor22071124.tsv /E:pc-boromir,pc-denethor,pc-peregrin /U:gondorfaramir /C:vamosaOsgiliath "c:gondor" "24/11/2007"

– Lista los ficheros y carpetas contenidos en “c:gondor” a cuya última modificación fue el “24/11/2007” y el resultado lo vuelca en el fichero de nombre x:listadosgondor22071124.tsv; la búsqueda la realizará en los equipos pc-boromir,pc-denethor,pc-peregrin, conectando como el usuario gondorfaramir y contraseña vamosaOsgiliath:

cscript //nologo listar-ruta-en-fecha-wmi.vbs /F:x:listadosgondor22071124.tsv /E:pc-boromir,pc-denethor,pc-peregrin /U:gondorfaramir /C:vamosaOsgiliath /T:a "c:gondor" "24/11/2007"

– Lista los ficheros y carpetas contenidos en “c:gondor” a cuyo último acceso fue el “24/11/2007” y el resultado lo vuelca en el fichero de nombre x:listadosgondor22071124.tsv; la búsqueda la realizará en los equipos pc-boromir,pc-denethor,pc-peregrin, conectando como el usuario gondorfaramir y contraseña vamosaOsgiliath:

cscript //nologo listar-ruta-en-fecha-wmi.vbs /F:x:listadosgondor22071124.tsv /E:pc-boromir,pc-denethor,pc-peregrin /U:gondorfaramir /C:vamosaOsgiliath /T:a "c:gondor" "24/11/2007"

Este es el código del script

'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'* listar-ruta-en-fecha-wmi.vbs                                        *
'*                                                                     *
'* Este script permite listar las carpetas y ficheros creados,         *
'* accesados o modificados por última vez (dependiendo del tipo de     *
'* fecha pasado como parámetro) en el día de la fecha recibida como    *
'* parámetro 2 en la ruta recibida como parámetro 1. Los resultados    *
'* los muestra divididos por tabuladores, lo que permite               *
'* redireccionarlo a un fichero y abrir éste con Excel (también        *
'* permite llevar esta salida a un fichero especificado por el         *
'* parámetro /F). debido a que utiliza WMI para listar, se puede       *
'* listar los ficheros y carpetas de un equipo remoto, siempre y       *
'* cuando el usuario que lance el script esté autorizado para la       *
'* administración remota en el equipo de destino, o sea pasado         *
'* usuario/contraseña de un usuariop que tenga este permiso.           *
'*                                                                     *
'* Sintaxis                                                            *
'*                                                                     *
'* cscript [//nologo] listar-ruta-en-fecha-wmi.vbs [/F:fichero]        *
'* [/E:equipos] [/U:usuario] [/C:contraseña] [/T:tipo_fecha] [/?] ruta *
'* fecha                                                               *
'*                                                                     *
'* Siendo                                                              *
'*                                                                     *
'* - ruta (Requerido):                                                 *
'*         Ruta de la carpeta en la que se buscarán sus carpetas y     *
'*         fichero creados en la fecha recibida como parámetro         *
'*                                                                     *
'* - fecha (Requerido):                                                *
'*         Fecha en formato DD/MM/AAAA de la cual se buscarán los      *
'*         ficheros y carpetas creados en ella dentro de la ruta       *
'*         recibida como parámetro 1                                   *
'*                                                                     *
'* - /F: fichero (Opcional):                                           *
'*         Ruta y nombre de fichero en el cual se volcarán los         *
'*         resultados; se trata de un fichero de valores separados por *
'*         tabuladores. Al nombre recibido se le añadirá la fecha en   *
'*         formato AAAAMMDD y la extensión TSV                         *
'*                                                                     *
'* - /E: equipos (Opcional):                                           *
'*         Lista de nombres NetBios de los equipos en los que se       *
'*         buscarán los ficheros; si se omite se buscarán en el equipo *
'*         local                                                       *
'*                                                                     *
'* - /U: usuario (Opcional):                                           *
'*         Usuario con el que se conectará al servicio WMI del equipo  *
'*         recibido como parámetro; si se trata del equipo local, este *
'*         parámetro será ignorado, pues no se puede acceder a WMI con *
'*         credenciales alternativas en el equipo local                *
'*                                                                     *
'* - /C: contraseña (Opcional):                                        *
'*         Contraseña del usuario recibido como parámetro /U. Si no se *
'*         suministra, el script presentará una ventana de Internet    *
'*         Explorer en la que pedirá que se entre, en una caja de      *
'*         texto de tipo password, con lo que quedará a salvo de ojos  *
'*         indiscretos                                                 *
'*                                                                     *
'* - /T: tipo_fecha (Opcional):                                        *
'*         Tipo de fecha que se revisará. Puede ser C (fecha de        *
'*         creación), A (fecha de último acceso) y M (fecha de         *
'*         modificación). Si se omite, se revisará la fecha de creación*
'*                                                                     *
'* - /?: ayuda (Opcional):                                             *
'*         Muestra la ayuda en línea                                   *
'*                                                                     *
'*                                                                     *
'* Ejemplos:                                                           *
'*                                                                     *
'* - Lista los ficheros y carpetas contenidos en "c:gondor" que       *
'* fueron creados el "24/11/2007"; la búsqueda se realizará en el      *
'* equipo local:                                                       *
'*                                                                     *
'* cscript //nologo listar-ruta-en-fecha.vbs "c:gondor" "24/11/2007"  *
'*                                                                     *
'* - Lista los ficheros y carpetas contenidos en "c:gondor" que       *
'* fueron creados el "24/11/2007" y el resultado lo vuelca en el       *
'* fichero de nombre x:listadosgondor22071124.tsv; la búsqueda se    *
'* realizará en el equipo local:                                       *
'*                                                                     *
'* cscript //nologo listar-ruta-en-fecha-wmi.vbs                       *
'* /F:x:listadosgondor "c:gondor" "24/11/2007"                      *
'*                                                                     *
'* - Lista los ficheros y carpetas contenidos en "c:gondor" que       *
'* fueron creados el "24/11/2007" y el resultado lo vuelca en el       *
'* fichero de nombre x:listadosgondor22071124.tsv; la búsqueda la    *
'* realizará en los equipos pc-boromir,pc-denethor,pc-peregrin:        *
'*                                                                     *
'* cscript //nologo listar-ruta-en-fecha-wmi.vbs                       *
'* /F:x:listadosgondor /E:pc-boromir,pc-denethor,pc-peregrin         *
'* "c:gondor" "24/11/2007"                                            *
'*                                                                     *
'* - Lista los ficheros y carpetas contenidos en "c:gondor" que       *
'* fueron creados el "24/11/2007" y el resultado lo vuelca en el       *
'* fichero de nombre x:listadosgondor22071124.tsv; la búsqueda la    *
'* realizará en los equipos pc-boromir,pc-denethor,pc-peregrin,        *
'* conectando como el usuario gondorfaramir, y el script solicitará   *
'* la contraseña de dicho usuario:                                     *
'*                                                                     *
'* cscript //nologo listar-ruta-en-fecha-wmi.vbs                       *
'* /F:x:listadosgondor /E:pc-boromir,pc-denethor,pc-peregrin         *
'*  /U:gondorfaramir "c:gondor" "24/11/2007"                         *
'*                                                                     *
'* - Lista los ficheros y carpetas contenidos en "c:gondor" que       *
'* fueron creados el "24/11/2007" y el resultado lo vuelca en el       *
'* fichero de nombre x:listadosgondor22071124.tsv; la búsqueda la    *
'* realizará en los equipos pc-boromir,pc-denethor,pc-peregrin,        *
'* conectando como el usuario gondorfaramir y contraseña              *
'* vamosaOsgiliath:                                                    *
'*                                                                     *
'* cscript //nologo listar-ruta-en-fecha-wmi.vbs                       *
'* /F:x:listadosgondor /E:pc-boromir,pc-denethor,pc-peregrin         *
'* /U:gondorfaramir /C:vamosaOsgiliath "c:gondor" "24/11/2007"       *
'*                                                                     *
'* - Lista los ficheros y carpetas contenidos en "c:gondor" a cuya    *
'* última modificación fue el "24/11/2007" y el resultado lo vuelca en *
'* el fichero de nombre x:listadosgondor22071124.tsv; la búsqueda la *
'* realizará en los equipos pc-boromir,pc-denethor,pc-peregrin,        *
'* conectando como el usuario gondorfaramir y contraseña              *
'* vamosaOsgiliath:                                                    *
'*                                                                     *
'* cscript //nologo listar-ruta-en-fecha-wmi.vbs                       *
'* /F:x:listadosgondor /E:pc-boromir,pc-denethor,pc-peregrin         *
'* /U:gondorfaramir /C:vamosaOsgiliath /T:a "c:gondor" "24/11/2007"  *
'*                                                                     *
'* - Lista los ficheros y carpetas contenidos en "c:gondor" a cuyo    *
'* último acceso fue el "24/11/2007" y el resultado lo vuelca en el    *
'* fichero de nombre x:listadosgondor22071124.tsv; la búsqueda la    *
'* realizará en los equipos pc-boromir,pc-denethor,pc-peregrin,        *
'* conectando como el usuario gondorfaramir y contraseña              *
'* vamosaOsgiliath:                                                    *
'*                                                                     *
'* cscript //nologo listar-ruta-en-fecha-wmi.vbs                       *
'* /F:x:listadosgondor /E:pc-boromir,pc-denethor,pc-peregrin         *
'* /U:gondorfaramir /C:vamosaOsgiliath /T:a "c:gondor" "24/11/2007"  *
'*                                                                     *
'*                                                                     *
'*                                                                     *
'*                                                                     *
'* © Fernando Reyes                                                    *
'* Febrero De 2008                                                     *
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*

'Exigimos la declaración de variables
Option Explicit


Dim str_Error 'As String
Dim int_Error 'As String
Dim str_Ruta 'As String
Dim dth_Fecha 'As Date
Dim str_Fichero 'As String
Dim str_Salida 'As String
Dim arr_Equipos 'As String
Dim int_Equipo 'As Integer
Dim str_Usuario 'As String
Dim str_Clave 'As String
Dim str_Tipo '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

'Ponemos los encabezados a la salida
str_Salida = "Equipo" & vbTab & _
             "Estado" & vbTab & _
             "Ruta" & vbTab & _
             "Nombre" & vbTab & _
             "Fecha " & str_Tipo &  vbTab & _
             "Hora " & str_Tipo
'Si no se ha pasado nombre de fichero de salida, mostramos
'los encabezados por pantalla
If Not WScript.Arguments.Named.Exists("F") Then

    WScript.Echo str_Salida
    str_Salida = ""
    
End If


For int_Equipo = LBound(arr_Equipos) To UBound(arr_Equipos)

    Call s_ProcesarEquipo(arr_Equipos(int_Equipo))
    
    'Si no se ha pasado nombre de fichero de salida, mostramos
    'los resultados del equipo actual
    If Not WScript.Arguments.Named.Exists("F") Then
    
        WScript.Echo str_Salida
        str_Salida = ""
        
    End If

Next 'int_Equipo


'Si hay que volcar información en el fichero
'de salida de ruta y nombre obj_Salida
If Len(str_Salida) > 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

Sub s_ProcesarEquipo(str_Equipo)
'***********************************************************************
'* Procedimiento: s_ProcesarEquipo                                     *
'* Tipo         : Método                                               *
'* Devolución   :                                                      *
'* Fecha y Hora : 11/02/2008 18:44:28                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Este método busca los ficheros y carpetas en el      *
'*                equipo recibido como parámetro str_Equipo            *
'***********************************************************************

    Dim obj_ServicioWMI 'As WbemServices
    Dim col_Carpetas 'As Win32_Directory Collection
    Dim obj_Carpeta 'As Win32_Collection
    Dim col_Ficheros 'As CIM_DataFile Collection
    Dim obj_Fichero 'As CIM_DataFile
    Dim str_FechaInicio 'As String
    Dim str_FechaFin 'As String
    Dim str_Dia 'As String
    Dim str_Mes 'As String
    Dim str_Anio 'As String
    Dim str_Consulta 'As String
    Dim str_Fecha 'As String
    Dim str_Hora 'As String
    Dim obj_FS 'As Scripting.FileSystemObject
    Dim bol_Devolucion 'As Boolean
    
    'Miramos si el equipo responde al PING
    If Not f_EquipoResponde(str_Equipo) Then
    
        'Como no responde, guardamos este dato y salimos del
        'procedimiento
        str_Salida = str_Salida & vbCrLf & _
                     str_Equipo & vbTab & "No responde al PING"
        Exit Sub
        
    End If
    
    If Not f_ServicioWMI(obj_ServicioWMI, _
                         str_Usuario, _
                         str_Clave, _
                         str_Equipo, _
                         "") Then
                         
        'No se ha podido conectar con el servicio WMI del equipo;
        'guardamos este dato y slimos del procedimiento
        str_Salida = str_Salida & vbCrLf & _
                     str_Equipo & vbTab & "No se pudo conectar a WMI"
        Exit Sub
        
    End If
    
    'Troceamos la fecha recibida
    str_Anio = f_ExtraerFecha(dth_Fecha, str_Dia, str_Mes)
    
    'Construimos las fechas de inicio y fin (es el mismo día a las 0
    'horas y a las "24") en el formato de la propiedad CreationDate
    str_FechaInicio = f_VTaDT(dth_Fecha,"")
    str_FechaFin = f_VTaDT(DateSerial(Year(dth_Fecha), _
                                      Month(dth_Fecha), _
                                      Day(dth_Fecha)+1),"")
    
    'Construimos la consulta que nos devolverá las carpetas
    str_Consulta = "SELECT " & _
                            "* " & _
                   "FROM " & _
                            "Win32_Directory " & _
                   "WHERE " & _
                            str_Tipo & " >= '" & str_FechaInicio & _
                        "' AND " & _
                            str_Tipo & " <= '" & str_FechaFin & _
                        "' AND " & _
                            "Name LIKE '" & _
                                    Replace(str_Ruta,"","\") & "%'"

    If Mid(str_Ruta,2,1) = ":" Then
    
        str_Consulta = str_Consulta & _
                        " AND Drive = '" & Left(str_Ruta,2) & "'"
    
    End If
    
    'Obtenemos la colección de carpetas
    Set col_Carpetas = obj_ServicioWMI.ExecQuery(str_Consulta)
    
    'Creamos un objeto FileSystemObject
    Set obj_FS = CreateObject("Scripting.FileSystemObject")
    'Recorremos la colección de carpetas
    For Each obj_Carpeta In col_Carpetas
    
        'Obtenemos la fecha y hora
        Select Case str_Tipo
        
            Case "CreationDate"
            
                str_Fecha = f_FechaFichero(obj_Carpeta.CreationDate, str_Hora)
            
            Case "LastModified"
            
                str_Fecha = f_FechaFichero(obj_Carpeta.LastModified, str_Hora)
            
            Case "LastAccessed"
            
                str_Fecha = f_FechaFichero(obj_Carpeta.LastAccessed, str_Hora)
        
        End Select
        
        'Obtenemos la información de la carpeta
        str_Salida = str_Salida & vbCrLf & _
                     str_Equipo & vbTab & _
                     "Ok" & vbTab & _
                     obj_FS.GetParentFolderName(obj_Carpeta.Name) & _
                                                vbTab & _
                     obj_Carpeta.FileName & "" & vbTab & _
                     str_Fecha & vbTab & _
                     str_Hora & vbTab
    
    Next 'obj_Carpeta
    
    'Limpiamos zurraspas carpeteras :-)
    Set obj_Carpeta = Nothing
    Set col_Carpetas = Nothing
    
    'Construimos ahora la consulta para los ficheros
    str_Consulta = "SELECT " & _
                            "* " & _
                   "FROM " & _
                            "CIM_DataFile " & _
                   "WHERE " & _
                            str_Tipo & " >= '" & str_FechaInicio & _
                        "' AND " & _
                            str_Tipo & " <= '" & str_FechaFin & _
                        "' AND " & _
                            "Name LIKE '" & _
                                    Replace(str_Ruta,"","\") & "%'"
                                    
    If Mid(str_Ruta,2,1) = ":" Then
    
        str_Consulta = str_Consulta & _
                        " AND Drive = '" & Left(str_Ruta,2) & "'"
    
    End If

    'Obtenemos la colección de ficheros
    Set col_Ficheros = obj_ServicioWMI.ExecQuery(str_Consulta)
    
    'Creamos un objeto FileSystemObject
    Set obj_FS = CreateObject("Scripting.FileSystemObject")
    
    'Recorremos la colección de ficheros
    For Each obj_Fichero In col_Ficheros
    
        'Obtenemos la fecha y hora
        Select Case str_Tipo
        
            Case "CreationDate"
            
                str_Fecha = f_FechaFichero(obj_Fichero.CreationDate, str_Hora)
            
            Case "LastModified"
            
                str_Fecha = f_FechaFichero(obj_Fichero.LastModified, str_Hora)
            
            Case "LastAccessed"
            
                str_Fecha = f_FechaFichero(obj_Fichero.LastAccessed, str_Hora)
        
        End Select
        
        'Obtenemos la información del fichero
        str_Salida = str_Salida & vbCrLf & _
                     str_Equipo & vbTab & _
                     "Ok" & vbTab & _
                     obj_FS.GetParentFolderName(obj_Fichero.Name) & _
                                                vbTab & _
                     obj_Fichero.FileName & vbTab & _
                     str_Fecha & vbTab & _
                     str_Hora & vbTab
    
    Next 'obj_Fichero    
    
    'Limpiamos zurraspas archiveras :-)
    Set obj_Fichero = Nothing
    Set col_Ficheros = Nothing
                                    
End Sub 's_ProcesarEquipo

Function f_RevisarArgumentos( _
                             str_Error, _
                             int_Error _
                             ) 'As Boolean
'***********************************************************************
'* Procedimiento: f_RevisarArgumentos                                  *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 11/02/2008 18:35:02                                  *
'* 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 str_Equipo 'As String

    '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 _
               str_Ruta = _
                       WScript.Arguments.Unnamed(0)
                       
        If Not Right(str_Ruta,1) = "" Then _
                str_Ruta = str_Ruta & ""

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


    End If

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

        str_Fichero =  _
                       WScript.Arguments.Named("F") & _
                       Year(Date) & _
                       Right("00" & Month(Date), 2) & _
                       Right("00" & Day(Date), 2) & _
                       ".tsv"

    End If

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

        arr_Equipos =  _
               Split(WScript.Arguments.Named("E"),",")
               
    Else
    
        str_Equipo = "."
        Call f_EquipoLocal(str_Equipo)
        arr_Equipos = Array(str_Equipo)

    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")
                   
        'Si no ha sido pasada la contraseña, se solicita
        Else
        
            str_Clave = f_EntrarClave("https://servidor/clave.htm")

        End If

    End If

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

        Select Case LCase(WScript.Arguments.Named("T"))
        
            Case "a"
            
                str_Tipo = "LastAccessed"
            
            Case "m"
            
                str_Tipo = "LastModified"
            
            Case Else
        
                str_Tipo = "CreationDate"
        
        End Select
        
    Else
    
        str_Tipo = "CreationDate"

    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 : 11/02/2008 18:35:02                                  *
'* 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 permite listar las carpetas y fichero" & _
                 "s creados, accesados o"
    WScript.Echo "modificados por última vez (dependiendo del tipo " & _
                 "de fecha pasado como"
    WScript.Echo "parámetro) en el día de la fecha recibida como pa" & _
                 "rámetro 2 en la ruta recibida"
    WScript.Echo "como parámetro 1. Los resultados los muestra divi" & _
                 "didos por tabuladores, lo que"
    WScript.Echo "permite redireccionarlo a un fichero y abrir éste" & _
                 " con Excel (también permite"
    WScript.Echo "llevar esta salida a un fichero especificado por " & _
                 "el parámetro /F). debido a que"
    WScript.Echo "utiliza WMI para listar, se puede listar los fich" & _
                 "eros y carpetas de un equipo"
    WScript.Echo "remoto, siempre y cuando el usuario que lance el " & _
                 "script esté autorizado para la"
    WScript.Echo "administración remota en el equipo de destino, o " & _
                 "sea pasado usuario/contraseña"
    WScript.Echo "de un usuariop que tenga este permiso."
    WScript.Echo ""
    WScript.Echo "Sintaxis"
    WScript.Echo ""
    WScript.Echo "cscript [//nologo] listar-ruta-en-fecha-wmi.vbs [" & _
                 "/F:fichero] [/E:equipos]"
    WScript.Echo "[/U:usuario] [/C:contraseña] [/T:tipo_fecha] [/?]" & _
                 " ruta fecha"
    WScript.Echo ""
    WScript.Echo "Siendo"
    WScript.Echo ""
    WScript.Echo "- ruta (Requerido):"
    WScript.Echo "Ruta de la carpeta en la que se buscarán sus carp" & _
                 "etas y fichero"
    WScript.Echo "creados en la fecha recibida como parámetro"
    WScript.Echo ""
    WScript.Echo "- fecha (Requerido):"
    WScript.Echo "Fecha en formato DD/MM/AAAA de la cual se buscará" & _
                 "n los ficheros"
    WScript.Echo "y carpetas creados en ella dentro de la ruta reci" & _
                 "bida como"
    WScript.Echo "parámetro 1"
    WScript.Echo ""
    WScript.Echo "- /F: fichero (Opcional):"
    WScript.Echo "Ruta y nombre de fichero en el cual se volcarán l" & _
                 "os resultados;"
    WScript.Echo "se trata de un fichero de valores separados por t" & _
                 "abuladores. Al"
    WScript.Echo "nombre recibido se le añadirá la fecha en formato" & _
                 " AAAAMMDD y la"
    WScript.Echo "extensión TSV"
    WScript.Echo ""
    WScript.Echo "- /E: equipos (Opcional):"
    WScript.Echo "Lista de nombres NetBios de los equipos en los qu" & _
                 "e se buscarán"
    WScript.Echo "los ficheros; si se omite se buscarán en el equip" & _
                 "o local"
    WScript.Echo ""
    WScript.Echo "- /U: usuario (Opcional):"
    WScript.Echo "Usuario con el que se conectará al servicio WMI d" & _
                 "el equipo"
    WScript.Echo "recibido como parámetro; si se trata del equipo l" & _
                 "ocal, este"
    WScript.Echo "parámetro será ignorado, pues no se puede acceder" & _
                 " a WMI con"
    WScript.Echo "credenciales alternativas en el equipo local"
    WScript.Echo ""
    WScript.Echo "- /C: contraseña (Opcional):"
    WScript.Echo "Contraseña del usuario recibido como parámetro /U" & _
                 ". Si no se"
    WScript.Echo "suministra, el script presentará una ventana de I" & _
                 "nternet"
    WScript.Echo "Explorer en la que pedirá que se entre, en una ca" & _
                 "ja de texto de"
    WScript.Echo "tipo password, con lo que quedará a salvo de ojos" & _
                 " indiscretos"
    WScript.Echo ""
    WScript.Echo "- /T: tipo_fecha (Opcional):"
    WScript.Echo "Tipo de fecha que se revisará. Puede ser C (fecha" & _
                 " de creación),"
    WScript.Echo "A (fecha de último acceso) y M (fecha de modifica" & _
                 "ción). Si se"
    WScript.Echo "omite, se revisará la fecha de creación"
    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 los ficheros y carpetas contenidos en ""c" & _
                 ":gondor"" que fueron creados el"
    WScript.Echo """24/11/2007""; la búsqueda se realizará en el eq" & _
                 "uipo local:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo listar-ruta-en-fecha-wmi.vbs ""c" & _
                 ":gondor"" ""24/11/2007"""
    WScript.Echo ""
    WScript.Echo "- Lista los ficheros y carpetas contenidos en ""c" & _
                 ":gondor"" que fueron creados el"
    WScript.Echo """24/11/2007"" y el resultado lo vuelca en el fic" & _
                 "hero de nombre"
    WScript.Echo "x:listadosgondor22071124.tsv; la búsqueda se re" & _
                 "alizará en el equipo local:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo listar-ruta-en-fecha-wmi.vbs /F:" & _
                 "x:listadosgondor ""c:gondor"" ""24/11/2007"""
    WScript.Echo ""
    WScript.Echo "- Lista los ficheros y carpetas contenidos en ""c" & _
                 ":gondor"" que fueron creados el"
    WScript.Echo """24/11/2007"" y el resultado lo vuelca en el fic" & _
                 "hero de nombre"
    WScript.Echo "x:listadosgondor22071124.tsv; la búsqueda la re" & _
                 "alizará en los equipos"
    WScript.Echo "pc-boromir,pc-denethor,pc-peregrin:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo listar-ruta-en-fecha-wmi.vbs /F:" & _
                 "x:listadosgondor /E:pc-boromir,pc-denethor,pc-pereg" & _
                 "rin ""c:gondor" & _
                 """ ""24/11/2007"""
    WScript.Echo ""
    WScript.Echo "- Lista los ficheros y carpetas contenidos en ""c" & _
                 ":gondor"" que fueron creados el"
    WScript.Echo """24/11/2007"" y el resultado lo vuelca en el fic" & _
                 "hero de nombre"
    WScript.Echo "x:listadosgondor22071124.tsv; la búsqueda la re" & _
                 "alizará en los equipos"
    WScript.Echo "pc-boromir,pc-denethor,pc-peregrin, conectando co" & _
                 "mo el usuario gondorfaramir,"
    WScript.Echo "y el script solicitará la contraseña de dicho usu" & _
                 "ario:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo listar-ruta-en-fecha-wmi.vbs /F:" & _
                 "x:listadosgondor/E:pc-boromir,pc-denethor,pc-peregr" & _
                 "in /U:gondorf" & _
                 "aramir ""c:gondor"""
    WScript.Echo """24/11/2007"""
    WScript.Echo ""
    WScript.Echo "- Lista los ficheros y carpetas contenidos en ""c" & _
                 ":gondor"" que fueron creados el"
    WScript.Echo """24/11/2007"" y el resultado lo vuelca en el fic" & _
                 "hero de nombre"
    WScript.Echo "x:listadosgondor22071124.tsv; la búsqueda la re" & _
                 "alizará en los equipos"
    WScript.Echo "pc-boromir,pc-denethor,pc-peregrin, conectando co" & _
                 "mo el usuario gondorfaramir y"
    WScript.Echo "contraseña vamosaOsgiliath:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo listar-ruta-en-fecha-wmi.vbs /F:" & _
                 "x:listadosgondor /E:pc-boromir,pc-denethor,pc-pereg" & _
                 "rin /U:gondorf" & _
                 "aramir /C:vamosaOsgiliath"
    WScript.Echo """c:gondor"" ""24/11/2007"""
    WScript.Echo ""
    WScript.Echo "- Lista los ficheros y carpetas contenidos en ""c" & _
                 ":gondor"" a cuya última"
    WScript.Echo "modificación fue el ""24/11/2007"" y el resultado" & _
                 " lo vuelca en el fichero de"
    WScript.Echo "nombre x:listadosgondor22071124.tsv; la búsqued" & _
                 "a la realizará en los equipos"
    WScript.Echo "pc-boromir,pc-denethor,pc-peregrin, conectando co" & _
                 "mo el usuario gondorfaramir y"
    WScript.Echo "contraseña vamosaOsgiliath:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo listar-ruta-en-fecha-wmi.vbs /F:" & _
                 "x:listadosgondor /E:pc-boromir,pc-denethor,pc-pereg" & _
                 "rin /U:gondorf" & _
                 "aramir /C:vamosaOsgiliath /T:a"
    WScript.Echo """c:gondor"" ""24/11/2007"""
    WScript.Echo ""
    WScript.Echo "- Lista los ficheros y carpetas contenidos en ""c" & _
                 ":gondor"" a cuyo último acceso"
    WScript.Echo "fue el ""24/11/2007"" y el resultado lo vuelca en" & _
                 " el fichero de nombre"
    WScript.Echo "x:listadosgondor22071124.tsv; la búsqueda la re" & _
                 "alizará en los equipos"
    WScript.Echo "pc-boromir,pc-denethor,pc-peregrin, conectando co" & _
                 "mo el usuario gondorfaramir y"
    WScript.Echo "contraseña vamosaOsgiliath:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo listar-ruta-en-fecha-wmi.vbs /F:" & _
                 "x:listadosgondor /E:pc-boromir,pc-denethor,pc-pereg" & _
                 "rin /U:gondorf" & _
                 "aramir /C:vamosaOsgiliath /T:a"
    WScript.Echo """c:gondor"" ""24/11/2007"""
    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

Function f_ExtraerFecha(str_Fecha, str_Dia, str_Mes)
'***********************************************************************
'* Procedimiento: f_ExtraerFecha                                       *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 11/02/2008 18:50:42                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Esta función recibe una fecha en formato DD/MM/AAAA  *
'*                y devuelve el año en 4 cifras. Recibe dos            *
'*                parámetros de salida, que contendrán, después de la  *
'*                ejecución, el día, en dos dígitos, y el mes,         *
'*                también en dos dígitos                               *
'***********************************************************************

    Dim int_Posicion1 'As Integer
    Dim int_Posicion2 'As Integer
    
    'Buscamos la primera ocurrencia de la barra de división
    int_Posicion1 = InStr(1, str_Fecha, "/")
'    WScript.Echo "Posicion 1: " & int_posicion1
    
    'Extraemos el día, asegurándonos que tenga dos dígitos
    str_Dia = Right("00" & Left(str_Fecha,int_Posicion1 - 1), 2)
'    WScript.Echo "Dia: " & str_dia
    'Buscamos la segunda ocurrencia de la barra de división
    int_Posicion2 = InStr(int_Posicion1 + 1,str_fecha, "/")
'    WScript.Echo "Posicion 2: " & int_posicion2
    
    
    'Extraemos el mes, asegurándonos que tenga dos dígitos
    str_Mes = Right("00" & Mid(str_Fecha,int_Posicion1 + 1, int_Posicion2 - (int_Posicion1 + 1)),2)
'    WScript.Echo "Mes: " & str_mes
    'Devolvemos el año
    f_ExtraerFecha = Right(str_Fecha, 4)
    
End Function 'f_ExtraerFecha

Function f_FechaFichero(str_Fecha, str_Hora)
'***********************************************************************
'* Procedimiento: f_FechaFichero                                       *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 11/02/2008 20:34:32                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Esta función recibe una fecha en formato CIM_datetime*
'*                de WMI y devuelve la fecha en formato DD/MM/YYYY.    *
'*                Recibe también una variable de salida que tendrá la  *
'*                hora al salir de la ejecución                        *
'***********************************************************************

    f_FechaFichero = Mid(str_Fecha,7,2) & "/" & _
              Mid(str_Fecha,5,2) & "/" & _
              Left(str_Fecha,4)
    str_Hora = Mid(str_Fecha,9,2) & ":" & _
               Mid(str_Fecha,11,2) & ":" & _
               Mid(str_Fecha,13,2)

End Function 'f_FechaFichero

Function f_VTaDT(str_FechaVT, str_FechaDT)
'***********************************************************************
'* Procedimiento: f_VTaDT                                              *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 12/02/2008 10:36:08                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Convierte fechas/horas de formato VT_Date            *
'*                ("dd/mm/yyyy" o "mmmm dd hh:mm:ss", etc.) a formato  *
'*                CIM_datetime (yyyymmddhhmmss.nnnnnnUUU) y            *
'*                viceversa. La función revisa si se ha pasado la      *
'*                fecha en formato VT_Date, en cuyo caso la devuelve   *
'*                en formato CIM_datetime, o si se ha pasado en        *
'*                formato CIM_datetime, en cuyo caso devuelve la       *
'*                devuelve en formato VT_Date                          *
'***********************************************************************


    Dim obj_DT 'As SWbemDateTime
    
    'Creamos un objeto SWbemDateTime
    Set obj_DT = CreateObject("WbemScripting.SWbemDateTime")
    
    If Len(str_FechaVT) > 0 Then
    
        'Establecemos la fecha hora en formato VT_Date recibida como
        'la fecha hora del objeto SWbemDateTime
        obj_DT.SetVarDate (CDate(str_FechaVT))
        
        'Devolvemos la fecha en formato CIM_DateTime
        f_VTaDT = obj_DT
        
    ElseIf Len(str_FechaDT) > 0 Then
    
        'Establecemos la fecha hora en formato CIM_datetime recibida
        'como la fecha hora del objeto SWbemDateTime
        obj_DT.Value = str_FechaDT
        
        'Devolvemos la fecha en formato VT_Date
        f_VTaDT = obj_DT.GetVarDate
    
    End If
    
    'Limpieza de parte posterior saliente :-)
    Set obj_DT = Nothing


End Function 'f_VTaDT

 

 

Una respuesta to “Script VBSCript Que Sirve Para Listar Los Ficheros Y Carpetas En Una Fecha (versión WMI)”

  1. […] Script VBSCript Sirve Que Para Listar Los Ficheros Y Carpetas En Una Fecha (versión WMI) […]

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: