El Blog de Gualtrysoft

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

Script VBScript Para Listar Los Propietarios De Los Ficheros

Posted by urpiano en Miércoles 18 \18\UTC abril \18\UTC 2007

Script VBScript que lista los ficheros de una ruta recibida junto con la información del propietario de los mismos. Permite que los resultados salgan por pantalla o en un fichero de texto en valores separados por tabuladores o también en un libro Excel.

Sintaxis

cscript [//nologo] listar-propietarios-de-ficheros.vbs [/R] [/E:nombre equipo] [/U:usuario] [/C:contraseña]] [/?] [/TXT:fichero TXT de salida] [/XLS:fichero XLS de salida] carpeta

Siendo

Parámetro ¿Requerido? Descripción
/R No
Listado recursivo; se listarán los ficheros
de la carpeta recibida como parámetro y los de todas las carpetas contenidas en ella. Si se omite sólo se listan los fichero que están en la carpeta.
/E No
Nombre del equipo donde está la carpeta; en
caso de omitirse se considerará que está en el equipo local.
/U No
Nombre del usuario que se utilizará para conectar
con el servicio WMI del equipo. En caso de omitirse se utilizará el usuario que lanza el script. Si se trata del equipo local se ignora, pues no se puede conectar al servicio WMI con credenciales alternativas en el equipo local; en este caso se debe ejecutar desde una ventana de comandos (cmd.exe) abierta con un administrador local usando RunAs, por ejemplo.
/C No
Cuando está establecido el parámetro
/U, este parámetro nos permite especificar la contraseña del usuario que conectará con el servicio WMI. Si no está especificado el parámetro U se ignorará. Si está establecido el parámetro U y este parámetro es omitido, el script presentará una ventana de Internet Explorer donde entrar la contraseña. Es recomendable no usar este parámetro, pues implica que se teclea la contraseña y alguien puede verla; como el usuario debe tener derechos administrativos, es peligroso que tengamos la contraseña expuesta. Al usar una ventana de IE para teclear la contraseña, esto se realiza en una caja de texto de tipo password, quedando enmascarada, protegida de ojos indiscretos.
/TXT No
Especifica la ruta y nombre de un fichero TXT al
que se volcará la información como datos separados por tabuladores.
/XLS No
Especifica la ruta y nombre de un Libro Excel en
el que se volcarán los resultados. Si se omiten este parámetro
y el parámetro /TXT, el resultado se mostrará por pantalla.
/? No
Muestra la ayuda en línea.
carpeta
Ruta de la carpeta que se quiere listar.

Ejemplos

cscript //nologo listar-propietarios-de-ficheros.vbs "c:Mis Scripts"

cscript //nologo listar-propietarios-de-ficheros.vbs /u:comarcaperegrin "c:Mis Scripts"

cscript //nologo listar-propietarios-de-ficheros.vbs /u:comarcaperegrin /c:soyuntuk "c:Mis Scripts"

cscript //nologo listar-propietarios-de-ficheros.vbs /txt:c:listadosmisscripts "c:Mis Scripts"

cscript //nologo listar-propietarios-de-ficheros.vbs /xls:c:listadosmisscripts /r "c:Mis Scripts"

cscript //nologo listar-propietarios-de-ficheros.vbs /txt:c:listadosmisscripts /xls:c:listadosmisscripts /r "c:Mis Scripts"

Este es el código del script:

'listar-propietarios-de-ficheros.vbs
 '
'Script VBScript que lista los ficheros de una ruta recibida
'junto con la información del propietario de los mismos.
'
'Sintaxis
'
'cscript [//nologo] listar-propietarios-de-ficheros.vbs [/R]
'        [/E:nombre equipo] [/U:usuario] [C:contraseña]] [/?]
'        [/TXT:fichero TXT de salida] [/XLS:fichero XLS de salida]
'        <carpeta>
'
'Siendo:
'
'        - /R (opcional):
' 
'               Listado recursivo; se listarán los ficheros
'               de la carpeta recibida como parámetro y los de
'               todas las carpetas contenidas en ella. Si se omite
'               sólo se listan los fichero que están en la carpeta
'
'        - /E (opcional):
'
'               Nombre del equipo donde está la carpeta; en caso de
'               omitirse se considerará que está en el equipo local.
'
'        - /U (opcional):
'
'               Nombre del usuario que se utilizará para conectar
'               con el servicio WMI del equipo. En caso de
'               omitirse se utilizará el usuario que lanza el
'               script. Si se trata del equipo local se ignora,
'               pues no se puede conectar al servicio WMI con
'               credenciales alternativas en el equipo local; en
'               este caso se debe ejecutar desde una ventana de
'               comandos (cmd.exe) abierta con un administrador
'               local usando RunAs, por ejemplo.
'
'        - /C (opcional):
'
'               Cuando está establecido el parámetro /U, este 
'               parámetro nos permite especificar la contraseña
'               del usuario que conectará con el servicio WMI.
'               Si no está especificado el parámetro U se 
'               ignorará. Si está establecido el parámetro U
'               y este parámetro es omitido, el script presentará
'               una ventana de Internet Explorer donde entrar la
'               contraseña. Es recomendable no usar este parámetro,
'               pues implica que se teclea la contraseña y alguien
'               puede verla; como el usuario debe tener derechos
'               administrativos, es peligroso que tengamos la
'               la contraseña expuesta. Al usar una ventana de IE
'               para teclear la contraseña, esto se realiza en
'               una caja de texto de tipo password, quedando
'               enmascarada, protegida de ojos indiscretos.
'
'        - /? (opcional):
'
'               Muestra la ayuda en línea.
'
'        - /TXT (opcional):
'
'               Especifica la ruta y nombre de un fichero TXT al
'               que se volcará la información como datos separados
'               por tabuladores.
'
'        - /XLS (opcional):
'
'               Especifica la ruta y nombre de un Libro Excel
'               en el que se volcarán los resultados. Si se omiten
'               este parámetro y el parámetro /TXT, el resultado
'               se mostrará por pantalla.
'
'        - carpeta (requerido):
'
'               Ruta de la carpeta que se quiere listar.
'
'Ejemplos
'
'cscript //nologo listar-propietarios-de-ficheros.vbs 
'              "c:Mis Scripts"
'
'cscript //nologo listar-propietarios-de-ficheros.vbs 
'        /u:comarcaperegrin "c:Mis Scripts"
'
'cscript //nologo listar-propietarios-de-ficheros.vbs 
'        /u:comarcaperegrin /c:soyuntuk "c:Mis Scripts"
'
'cscript //nologo listar-propietarios-de-ficheros.vbs 
'         /txt:c:listadosmisscripts "c:Mis Scripts"
'
'cscript //nologo listar-propietarios-de-ficheros.vbs 
'         /xls:c:listadosmisscripts /r "c:Mis Scripts"
'
'cscript //nologo listar-propietarios-de-ficheros.vbs 
'        /txt:c:listadosmisscripts /xls:c:listadosmisscripts
'        /r "c:Mis Scripts"
'
'© Fernando Reyes - Abril 2007

'Requerimos la declaración de variables
Option Explicit

Const xlRangeAutoFormatSimple = -4154

'Declaramos las variables globales
Dim str_Carpeta, str_Usuario, str_Clave, str_Equipo
Dim str_TXT, str_XLS, obj_ServicioWMI, app_Excel
Dim lng_Linea, obj_FS, obj_TS, wb_Libro, ws_Hoja
Dim int_HojasEnLibro

'Revisamos parámetros
Call s_RevisarParametros

'Conectamos con el servicio WMI, en caso de error
'salimos del script con error 2
If Not f_ServicioWMI(obj_ServicioWMI, str_Usuario, _
                            str_Clave, str_Equipo) Then
                            
    Call s_Ayuda("Error 2: No se ha podido conectar con el" & _
                 " servicio WMI")
    
    'Salimos del script con devolución 2
    WScript.Quit 2
    
End If

'Si hay que generar fichero TXT, lo creamos
If Len(str_TXT) > 0 Then

    Call s_IniciarTXT
    
End If

'Si hay que generar libro de Excel, lo creamos
If Len(str_XLS) > 0 Then
      
    Call s_IniciarExcel
               
End If

'Si hay que volcar la información por pantalla
If Not (Len(str_TXT) > 0 Or Len(str_XLS) > 0) Then

    'Ponemos los encabezados
    WScript.Echo "Fichero" & vbTab & _
                 "Tamaño (KB)" & vbTab & _
                 "SID Propietario" & vbTab & _
                 "sAMAccountName Propietario" & vbTab & _
                 "distinguishedName Propietario"

End if

'Realizamos el listado
Call s_Listar (str_Carpeta,str_Equipo)

'Cerramos los ficheros que corresponda
If Len(str_TXT) > 0 Then

    obj_TS.Close
    Set obj_TS = Nothing
    Set obj_FS = Nothing
    
End If

If Len(str_XLS) > 0 Then

    'Pasamos la hoja por el steticiene
    ws_Hoja.Columns.Autofit
    ws_Hoja.Rows.Autofit
    ws_Hoja.Range("A1").AutoFilter
    ws_Hoja.UsedRange.AutoFormat xlRangeAutoFormatSimple
    
    wb_Libro.SaveAs str_XLS
    Set ws_Hoja = Nothing
    
    wb_Libro.Close
    Set wb_Libro = Nothing
    app_Excel.Quit
    Set app_Excel = Nothing
    
End If

'Terminamos el script con devolución 0
WScript.Quit 0

'*********** Funciones y Procedimientos ********************

Sub s_Listar(str_RutaRecibida, str_Equipo)
'Este procedimiento es el núcleo del script. Recibe una ruta, un nombre de
'de equipo y una booleana. Listará los ficheros de la ruta local de ese
'equipo y si la booleana es True, utilizará recursión para listar los 
'ficheros de las carpetas contenidas en la ruta. esta recursividad sólo 
'funciona con rutas locales, no con unidades de red; de todas maneras
'como se puede especificar el nopmbre del equipo en que se debe listar,
'siempre se podrá listar los ficheros de cualquier equipo, si suministramos
'las credenciales adecuadas

    Dim str_DN, int_Indice, str_Letra, str_Ruta, str_RutaSubcarpeta
    Dim str_Consulta, col_Ficheros, obj_Fichero, col_SIDs, obj_SID
    Dim str_NombreNT, col_SubCarpetas, obj_Subcarpeta
    
    'Obtenemos la ruta tal como la necesitamos para filtar por Path en la
    'consulta WQL y la letra de unidad
    str_Ruta = f_Ruta(str_RutaRecibida,str_Letra)
    
    'Revisamos si termina en barra invertida la ruta recibida; en caso
    'afirmativo, la quitamos, ya que la búsqueda WQL de subcarpeta requiere
    'que la ruta recibida no acabe en barra invertida. El resultado lo 
    'guardamos en la variable str_RutaSubcarpeta
    If Right(str_RutaRecibida,1)="" Then
    
        str_RutaSubcarpeta = Left(str_RutaRecibida,Len(str_RutaRecibida)-1)
        
    Else
    
        str_RutaSubcarpeta = str_RutaRecibida
        
    End If
    

    'Montamos la cadena de consulta
    str_Consulta = "Select * from CIM_DataFile where Path = '" _
                    & str_Ruta & "'"

    'En el caso de que la letra de unidad se haya recibido, añadimos
    'el filtro por unidad a la consulta
    If Len(str_Letra) > 0 Then _
        str_Consulta = str_Consulta & _
                                " And Drive = '" & str_Letra & "'"
                                

	'Ejecutamos la consulta
	Set col_Ficheros = obj_ServicioWMI.ExecQuery(str_Consulta)
    
    On Error Resume Next
    'Recorremos los ficheros encontrados en la consulta
    For Each obj_Fichero in col_Ficheros

         'Obtenemos el objeto Win32_SID del fichero en curso.
         'Se trata de una colección de un sólo elemento
         Set col_SIDs = obj_ServicioWMI.ExecQuery _
            ("ASSOCIATORS OF {Win32_LogicalFileSecuritySetting='" & _
                                                obj_Fichero.Name & "'}" _ 
          & " WHERE AssocClass=Win32_LogicalFileOwner ResultRole=Owner")

        'Recorremos el único elemento de la colección de Win32_SID
        For Each obj_SID in col_SIDs
        
            str_NombreNT = obj_SID.ReferencedDomainName & "" & _
                                   obj_SID.AccountName
                                   
            str_DN = f_NTaDN(str_NombreNT)
            
            'Si no se hace salida por fichero, volcamos la información
            'en pantalla
            If Not (Len(str_TXT) > 0 Or Len(str_XLS) > 0) Then
            
                'Mostramos en pantalla el nombre del fichero, el SID
                'del propietario, su nombre NT y su nombre distinguido
                'separados por tabuladores
                WScript.Echo obj_Fichero.Name & vbTab & _
                             FormatNumber( _
                              obj_Fichero.FileSize / 1024,1,0,-1) & _
                                                   vbTab & _
                             obj_SID.SID & vbTab & _
                             str_NombreNT & vbTab & _
                             str_DN
                             
            End If
            
            'Si hay que volcar la información en fichero de texto
            If Len(str_TXT) > 0 Then
            
                obj_TS.WriteLine obj_Fichero.Name & vbTab & _
                             FormatNumber( _
                              obj_Fichero.FileSize / 1024,1,0,-1) & _
                                                   vbTab & _
                             obj_SID.SID & vbTab & _
                             str_NombreNT & vbTab & _
                             str_DN
                             
            End If
            
            'Si hay que volcar la información en libro de Excel
            If Len(str_XLS) > 0 Then
            
                With ws_Hoja
                
                    .Range("A" & lng_Linea).Value = obj_Fichero.Name
                    .Range("B" & lng_Linea).Value = _
                                         obj_Fichero.FileSize / 1024
                    .Range("B" & lng_Linea).NumberFormat = "#,##0.0"
                    .Range("C" & lng_Linea).Value = obj_SID.SID
                    .Range("D" & lng_Linea).Value = str_NombreNT
                    .Range("E" & lng_Linea).Value = str_DN
                
                End With
                
                'Por si se ha producido un error que impida que se
                'haya escrito nada, evitamos que se incremente el
                'contador de líneas, y así no habrá líneas en blanco
                If Not ws_Hoja.Range("A" & lng_Linea).Value = "" Then
                
                    'Preparamos la próxima vuelta
                    lng_Linea = lng_Linea + 1
                    
                End If
                
                'Si sobrepasamos el límite de líneas por hoja
                'debemos crear una nueva hoja y volcar en ella
                'a partir de ahora
                If lng_Linea= 65537 Then
                
                    'establecemos la línea actual
                    lng_Linea = 2
                    
                    'Recogemos el índice de la hoja
                    int_Indice = ws_Hoja.Index
                    
                    'Pasamos la hoja por el steticiene
                    ws_Hoja.Columns.Autofit
                    ws_Hoja.Rows.Autofit
                    ws_Hoja.Range("A1").AutoFilter
                    ws_Hoja.UsedRange.AutoFormat _
                                     xlRangeAutoFormatSimple
                    
                    'Vaciamos el objeto hoja
                    Set ws_Hoja = Nothing
                    
                    'Cargamos el objeto hoja con una nueva
                    'agregada a continuación de la anterior
                    Set ws_Hoja = wb_Libro.Worksheets.Add( _
                                                  ,int_Indice)
                    ws_Hoja.Name = "Resultados " & _
                                 Right("00" & ws_Hoja.Index,3)
                    
                    'Ponemos los encabezados a la hoja
                    With ws_Hoja
       
                        .Range("A1").Value = "Fichero"
                        .Range("B1").Value = "Tamaño (KB)"
                        .Range("C1").Value = "SID Propietario"
                        .Range("D1").Value = _
                                  "sAMAccountName Propietario"
                        .Range("E1").Value = _
                               "distinguishedName Propietario"
        
                    End With
                
                End If
                
             End If
            
        Next 'obj_SID


    Next 'obj_Fichero
    
    'Si se ha pasado el modificador de listado recursivo
    'debemos hacer una llamada recursiva por cada subcarpeta
    If WScript.Arguments.Named.Exists("R") Then

        'Hacemos una consulta de las subacarpetas
        Set col_SubCarpetas = obj_ServicioWMI.ExecQuery _
            ("Associators of {Win32_Directory.Name='" & _
             str_RutaSubcarpeta & "'} " _
            & "Where AssocClass = Win32_Subdirectory " _
                & "ResultRole = PartComponent")
    
        'Recorremos cada subcarpeta
        For Each obj_Subcarpeta in col_SubCarpetas
        
            'Llamada recursiva con el nombre de la carpeta
            Call s_Listar(obj_Subcarpeta.Name,str_Equipo)
            
        Next 'obj_Subcarpeta
        
    End If

End Sub 's_Listar


Function f_Ruta(str_Ruta,str_Letra)
'Esta función recibe una ruta del estilo "c:carpeta"
'y la devuelve tal y como la necesita una consulta WQL
'para ser pasada como filtro de ruta de los objetos
'CIM_DataFile, en el ejemplo "\carpeta\". Como se ve,
'esto no incluye la letra de unidad; para ello la función
'recibe el parámetro str_Letra, que usa como parámetro de 
'salida y en el que devolverá la letra, en el ejemplo "c:",
'y de esa manera se podrá incluir en la consulta WQL el
'filtro de unidad 

    'Necesitamos que la ruta termine en barra invertida para
    'la consulta WQL, por ello si no es así, concatenamos una
    If Not Right(str_Ruta,1)="" Then str_Ruta = str_Ruta & ""
        
    'Comprobamos que se incluya o no una unidad, si no se incluye
    'se buscará en todas las unidades. Para ver si se incluye la
    'unidad, miramos que el segundo carcater por la izquierda sea ":"
    If Mid(str_Ruta,2,1)=":" Then
    
        'Obtenemos la letra
        str_Letra = Left(str_Ruta,2)
        
        'A la ruta sin la letra le sustituimos una barra invertida
        'por dos barras invertidas y el resultado será la devolución
        f_Ruta = Replace(Right(str_Ruta,Len(str_Ruta)-2),"","\")
        
    Else
    
        'Dejamos la letra vacía
        str_Letra = ""
        
        'Sustituimos una barra invertida por dos barras invertidas y
        'el resultado será la devolución
        f_Ruta = Replace(str_Ruta,"","\")
        
    End If
    
    
End Function 'f_Ruta



Function f_EntrarClave(str_HTML)
'El propósito de esta función es el proveer al usuario de una caja
'de texto en la que teclear una contraseña sin revelarla, pues
'la caja de texto es de tipo password. Para ello se crea una página
'web que es cargada en un Internet Explorer y se recoge de éste
'la contraseña tecleada y se convierte en la devolucion de la función.
'La ruta y nombre de la página es recibida como parámetro por la
'función, lo que permite reutilizar esta función en más scripts y
'personalizar la página para cada script, lo único que debe ser igual
'en todas las páginas que se quieran utilizar es que el botón debe
'llamarse Aceptar, el control oculto AceptarPulsado y la caja de texto
'Clave.

'Esta función está basada en:
'http://www.microsoft.com/technet/scriptcenter/guide/sas_ent_lppm.mspx?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; de hecho esta es la opción deseable si se hace de forma
'segura (hhtps) pues así no podría cazar la contraseña algún gracioso
'que estuviese ejecutando un sniffer.

    'Declaramos variables
    Dim obj_IE

    'Creamos un objeto Internet Explorer
    Set obj_IE = WScript.CreateObject _
              ("InternetExplorer.Application", "IE_")
              
    'Cargamos el navegador con la página recibida como parámetro
    obj_IE.Navigate "file:///" & str_HTML
    
    'Con este bucle esperamos a que la página esté completamente cargada
    Do

        WScript.Sleep 10
    
    Loop Until obj_IE.ReadyState = 4    
    
    'Establecemos propiedades del navegador
    obj_IE.ToolBar = 0
    obj_IE.StatusBar = 0
    obj_IE.Width = 400
    obj_IE.Height = 250
    obj_IE.Left = 0
    obj_IE.Top = 0
    obj_IE.Visible = 1
    
    'En este bucle esperamos a que se haya pulsado el botón
    '"Aceptar"
    Do While (obj_IE.Document.All.AceptarPulsado.Value = "")
    
        WScript.Sleep 250
        
    Loop

    'Recogemos la contraseña entrada
    str_Clave = obj_IE.Document.All.Clave.Value
    
    'Cerramos el navegador
    obj_IE.Quit
    
    'Esperamos a que esté cerrado
    WScript.Sleep 250
    
    'Establecemos la contraseña como devolución de la función
    f_EntrarClave = str_Clave  
    
    'Limpiadita de culito :-)
    Set obj_IE = Nothing

End Function 'f_EntrarClave


Function f_ServicioWMI(obj_ServicioWMI, str_Usuario, _
                       str_Clave, str_Equipo)
'Esta función permite conectar con el servicio WMI de un equipo.
'La conexión puede ser realizada directamente por el usuario
'que ha lanzado el script o por otro usuario cuyas credenciales
'son recibidas como parámetros. La función recibe como parámetro
'un objeto que será utilizado como parámetro de salida, siendo
'creado por la función como objeto de servicio WMI del equipo
'recibido como parámetro
    
    Dim obj_LocalizadorWMI                                                
    Dim lng_Respuesta


    'Si hemos recibido nombre de usuario, debemos conectar 
    'al servicio WMI del equipo como el usuario
    'recibido
    If Len(str_Usuario) > 0 Then
        
        'Para poder especificar unas credenciales alternativas,
        'debemos crear primero un localizador WMI
        Set obj_LocalizadorWMI = CreateObject( _
                                  "WbemScripting.SWbemLocator")
        
        'Establecemos control de errores
        On Error Resume Next
        'Conectamos con el servicio WMI del equipo con las 
        'credenciales pasadas
        Set obj_ServicioWMI = obj_LocalizadorWMI.ConnectServer( _
                                       str_Equipo, "rootcimv2", _
                                       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 & _
                                        "rootCIMV2")
    
        '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_NTaDN(str_RutaWinNT)
'Esta función recibe el nombre NT de un objeto de dominio y devuelve
'el nombre distinguido de ese objeto

'Basada en el código (prácticamente sólo traducir) de Richard Mueller,
'MVP de Scripting y ADSI (http://www.rmueller.net)

    'Constantes para el objeto NameTranslate
    Const ADS_NAME_INITTYPE_GC = 3
    Const ADS_NAME_TYPE_NT4 = 3
    Const ADS_NAME_TYPE_1779 = 1

    Dim obj_TraductorDeNombres, str_DN

    'Creamos el objeto NameTranslate.
    Set obj_TraductorDeNombres = CreateObject("NameTranslate")

    On Error Resume Next

    'Lo iniciamos localizando el catálogo global
    obj_TraductorDeNombres.Init ADS_NAME_INITTYPE_GC, ""

    'Establecemos el parámetro de nombre WinNT recibido como nombre
    'WinNT en el traductor de nombres
    obj_TraductorDeNombres.Set ADS_NAME_TYPE_NT4, str_RutaWinNT

    'Usamos el método Get del traductor de nombres para obtener el
    'nombre LDAP (RFC 1779) del objeto (nombre distinguido)
    f_NTaDN = obj_TraductorDeNombres.Get(ADS_NAME_TYPE_1779)

    'Limpieza de kks :-)
    Set obj_TraductorDeNombres = Nothing
    
    On Error Goto 0

End Function 'f_NTaDN

Sub s_Ayuda(str_Error)

    If Len(str_Error) > 0 Then _
               WScript.Echo vbCrLf & vbCrLf & _
               str_Error
               
    WScript.Echo vbCrLf & vbCrLf
    WScript.Echo "listar-propietarios-de-fic" & _
                 "heros.vbs"
    WScript.Echo ""
    WScript.Echo "Script VBScript que lista " & _
                 "los ficheros de una ruta r" & _
                 "ecibida"
    WScript.Echo "junto con la información d" & _
                 "el propietario de los mism" & _
                 "os."
    WScript.Echo ""
    WScript.Echo "Sintaxis"
    WScript.Echo ""
    WScript.Echo "cscript [//nologo] listar-pro" & _
                 "pietarios-de-ficheros.vbs [" & _
                 "/R]"
    WScript.Echo "        [/E:nombre equipo] " & _
                 "[/U:usuario] [C:contraseña]] "
    WScript.Echo "        [/TXT:fichero TXT d" & _
                 "e salida] [/XLS:fichero XLS" & _
                 " de salida]"
    WScript.Echo "        <carpeta>"
    WScript.Echo ""
    WScript.Echo "Siendo:"
    WScript.Echo ""
    WScript.Echo "        - /R (opcional):"
    WScript.Echo "" 
    WScript.Echo "               Listado recur" & _
                 "sivo; se listarán los ficher" & _
                 "os"
    WScript.Echo "               de la carpeta" & _
                 " recibida como parámetro y l" & _
                 "os de"
    WScript.Echo "               todas las car" & _
                 "petas contenidas en ella. Si" & _
                 " se omite"
    WScript.Echo "               sólo se lista" & _
                 "n los fichero que están en l" & _
                 "a carpeta"
    WScript.Echo ""
    WScript.Echo "        - /E (opcional):"
    WScript.Echo ""
    WScript.Echo "               Nombre del eq" & _
                 "uipo donde está la carpeta; " & _
                 "en caso de"
    WScript.Echo "               omitirse se c" & _
                 "onsiderará que está en el eq" & _
                 "uipo local."
    WScript.Echo ""
    WScript.Echo "        - /U (opcional):"
    WScript.Echo ""
    WScript.Echo "               Nombre del us" & _
                 "uario que se utilizará para " & _
                 "conectar"
    WScript.Echo "               con el servic" & _
                 "io WMI del equipo. En caso de"
    WScript.Echo "               omitirse se ut" & _
                 "ilizará el usuario que lanza " & _
                 "el"
    WScript.Echo "               script. Si se " & _
                 "trata del equipo local se ign" & _
                 "ora,"
    WScript.Echo "               pues no se pue" & _
                 "de conectar al servicio WMI c" & _
                 "on"
    WScript.Echo "               credenciales a" & _
                 "lternativas en el equipo loca" & _
                 "l; en"
    WScript.Echo "               este caso se d" & _
                 "ebe ejecutar desde una ventan" & _
                 "a de"
    WScript.Echo "               comandos (cmd." & _
                 "exe) abierta con un administr" & _
                 "ador"
    WScript.Echo "               local usando R" & _
                 "unAs, por ejemplo."
    WScript.Echo ""
    WScript.Echo "        - /C (opcional):"
    WScript.Echo ""
    WScript.Echo "               Cuando está es" & _
                 "tablecido el parámetro /U, es" & _
                 "te "
    WScript.Echo "               parámetro nos " & _
                 "permite especificar la contra" & _
                 "seña"
    WScript.Echo "               del usuario qu" & _
                 "e conectará con el servicio W" & _
                 "MI."
    WScript.Echo "               Si no está esp" & _
                 "ecificado el parámetro U se "
    WScript.Echo "               ignorará. Si e" & _
                 "stá establecido el parámetro U"
    WScript.Echo "               y este parámet" & _
                 "ro es omitido, el script pres" & _
                 "entará"
    WScript.Echo "               una ventana de" & _
                 " Internet Explorer donde entr" & _
                 "ar la"
    WScript.Echo "               contraseña. Es" & _
                 " recomendable no usar este pa" & _
                 "rámetro,"
    WScript.Echo "               pues implica q" & _
                 "ue se teclea la contraseña y " & _
                 "alguien"
    WScript.Echo "               puede verla; c" & _
                 "omo el usuario debe tener der" & _
                 "echos"
    WScript.Echo "               administrativo" & _
                 "s, es peligroso que tengamos " & _
                 "la"
    WScript.Echo "               la contraseña " & _
                 "expuesta. Al usar una ventana" & _
                 " de IE"
    WScript.Echo "               para teclear l" & _
                 "a contraseña, esto se realiza" & _
                 " en"
    WScript.Echo "               una caja de te" & _
                 "xto de tipo password, quedand" & _
                 "o"
    WScript.Echo "               enmascarada, p" & _
                 "rotegida de ojos indiscretos."
    WScript.Echo ""
    WScript.Echo "        - /? (opcional):"
    WScript.Echo ""
    WScript.Echo "               Muestra la ayu" & _
                 "da en línea."
    WScript.Echo ""
    WScript.Echo "        - /TXT (opcional):"
    WScript.Echo ""
    WScript.Echo "               Especifica la " & _
                 "ruta y nombre de un fichero T" & _
                 "XT al"
    WScript.Echo "               que se volcará" & _
                 " la información como datos se" & _
                 "parados"
    WScript.Echo "               por tabuladore" & _
                 "s."
    WScript.Echo ""
    WScript.Echo "        - /XLS (opcional):"
    WScript.Echo ""
    WScript.Echo "               Especifica la " & _
                 "ruta y nombre de un Libro Exc" & _
                 "el"
    WScript.Echo "               en el que se v" & _
                 "olcarán los resultados. Si se" & _
                 " omiten"
    WScript.Echo "               este parámetro" & _
                 " y el parámetro /TXT, el resu" & _
                 "ltado"
    WScript.Echo "               se mostrará po" & _
                 "r pantalla."
    WScript.Echo ""
    WScript.Echo "        - carpeta (requerido)" & _
                 ":"
    WScript.Echo ""
    WScript.Echo "               Ruta de la carp" & _
                 "eta que se quiere listar."
    WScript.Echo ""
    WScript.Echo "Ejemplos"
    WScript.Echo ""
    WScript.Echo "cscript //nologo listar-propie" & _
                 "tarios-de-ficheros.vbs ""c:Mis Scripts"""
    WScript.Echo ""
    WScript.Echo "cscript //nologo listar-propie" & _
                 "tarios-de-ficheros.vbs /u:coma" & _
                 "rcaperegrin ""c:Mis Scripts"""
    WScript.Echo ""
    WScript.Echo "cscript //nologo listar-propie" & _
                 "tarios-de-ficheros.vbs /u:coma" & _
                 "rcaperegrin /c:soyuntuk ""c:" & _
                 "Mis Scripts"""
    WScript.Echo ""
    WScript.Echo "cscript //nologo listar-propie" & _
                 "tarios-de-ficheros.vbs /txt:c:" & _
                 "listadosmisscripts ""c:Mis " & _
                 "Scripts"""
    WScript.Echo ""
    WScript.Echo "cscript //nologo listar-propie" & _
                 "tarios-de-ficheros.vbs /xls:c:" & _
                 "listadosmisscripts /r ""c:M" & _
                 "is Scripts"""
    WScript.Echo ""
    WScript.Echo "cscript //nologo listar-propie" & _
                 "tarios-de-ficheros.vbs /txt:c:" & _
                 "listadosmisscripts /xls:c:l" & _
                 "istadosmisscripts /r ""c:Mis" & _
                 " Scripts"""
    WScript.Echo ""
    WScript.Echo ""
    WScript.Echo "© Fernando Reyes - Abril 2007"

End Sub 's_Ayuda

Sub s_RevisarParametros()

    'Se se ha pedido la ayuda, se muestra y se termina
    'el script
    If WScript.Arguments.Named.Exists("?") Then
    
        Call s_Ayuda("********************" & vbCrLf & _
                     "        AYUDA       " & vbCrLf & _
                     "********************")
                 
        'Terminamos con devolución 3
        WScript.Quit 3
    
    End If

    'Comprobamos que se haya recibido la ruta a listar,
    'único parámetro requerido
    If WScript.Arguments.Unnamed.Count < 1 Then
    
        Call s_Ayuda("Error 1: No se ha recibido la ruta "& _
                     "a listar.")
                 
        'Salimos del script con devolución 1
        WScript.Quit 1
    
    Else

        'Recogemos la carpeta
        str_Carpeta = WScript.Arguments.Unnamed(0)
    
    End If

    'Miramos si se ha recibido el parámetro de usuario
    If WScript.Arguments.Named.Exists("U") Then
   
        'Como se ha recibido, lo recogemos
        str_Usuario = WScript.Arguments.Named("U")

        'Miramos si se ha recibido contraseña
        If WScript.Arguments.Named.Exists("C") Then
    
            'si se ha recibido lo recogemos
            str_Clave = WScript.Arguments.Named("C")
        
        Else
    
            'Como no se ha recibido, llamamos a la función
            'que pedirá al usuario que entre la contraseña
            str_Clave= f_EntrarClave("\fernandor-fcom" & _
                                 "partidousuario-conexion.htm")
                             
        End If
   
    'No se ha recibido parámetro de usuario, dejamos las
    'variables vacías
    Else
   
        str_Usuario = ""
        str_Clave = ""
       
    End If

    'Vemos ahora si hemos recibido nombre de equipo
    If WScript.Arguments.Named.Exists("E") Then
   
        'Recogemos el nombre de equipo en la variable 
        'correspondiente
        str_Equipo = WScript.Arguments.Named("E")
        
    Else
   
        'Establecemos el equipo local
        str_Equipo ="."
    
        'Al ser equipo local, no se usarán las credenciales
        'de usuario, pues no se puede conectar al equipo
        'local con credenciales alternativas. Para el equipo
        'local lo deseable es que el script lo lance un
        'administrador local desde una ventana de comandos
        'abierta con RunAs, por ejemplo.
        If Len(str_Usuario) > 0 Then 
    
            MsgBox "No se conectará con las credenciales " & _
                   "suministradas (usuario: " & str_Usuario & _
                   ") debido a que se procesará el equipo " & _
                   "local, y WMI no permite conectar con " & _
                   "credenciales alternativas al equipo " & _
                   "local. Es necesario, por tanto, que el " & _
                   "usuario que lanza el script tenga derechos" & _
                   "suficientes para acceder a WMI", vbOKOnly, _
                   "Credenciales ignoradas"
               
            str_Usuario = ""
            str_Clave = ""
        
        End If
       
    End If
    
    'Vamos a revisar si se ha pedido salida en fichero TXT
    If WScript.Arguments.Named.Exists("TXT") Then
    
         'Recogemos el nombre del fichero a generar
         str_TXT = WScript.Arguments.Named("TXT")
        
    Else
    
         str_TXT = ""
        
    End If
     
    'Vamos a revisar si se ha pedido salida en libro Excel
     If WScript.Arguments.Named.Exists("XLS") Then
    
         'Recogemos el nombre del libro a generar
         str_XLS = WScript.Arguments.Named("XLS")
        
     Else
     
         str_XLS = ""
                
     End If
     

End Sub 's_RevisarParametros

Sub s_IniciarExcel()

    If Not UCase(Right(str_XLS,4))=".XLS" Then _
                 str_XLS = str_XLS & ".xls"

    'Creamos un objeto aplicación de Excel
    Set app_Excel = CreateObject("Excel.Application")
    app_Excel.Visible = True
 
    'Recogemos las hojas que tiene un libro cuando se crea
    int_HojasEnLibro = app_Excel.SheetsInNewWorkbook
    
    'Establecemos que se cree el libro con una sola hoja
    app_Excel.SheetsInNewWorkbook = 1
  
    'Creamos el libro Excel
    Set wb_Libro = app_Excel.Workbooks.Add 
      
    'Restauramos el número de hojas por libro nuevo
    app_Excel.SheetsInNewWorkbook = int_HojasEnLibro
      
    'Cargamos el objeto Worksheet
    Set ws_Hoja = wb_Libro.Worksheets(1)
       
    'Establecemos su nombre
    ws_Hoja.Name = "Resultados " & Right("00" & ws_Hoja.Index,3)
        
    'Ponemos los encabezados a la hoja
    With ws_Hoja
       
        .Range("A1").Value = "Fichero"
        .Range("B1").Value = "Tamaño (KB)"
        .Range("C1").Value = "SID Propietario"
        .Range("D1").Value = "sAMAccountName Propietario"
        .Range("E1").Value = "distinguishedName Propietario"
        
    End With
        
    'Establecemos la línea actual en la hoja
    lng_Linea = 2

End Sub 's_IniciarExcel

Sub s_IniciarTXT()
        
    If Not UCase(Right(str_TXT,4))=".TXT" Then _
                 str_TXT = str_TXT & ".txt"
    
    'Creamos el objeto FileSystemObject
    Set obj_FS = CreateObject("Scripting.FileSystemObject")
        
    'Creamos el objeto TextStream en el que volcaremos
    'los resultados
    Set obj_TS = obj_FS.CreateTextFile(str_TXT,True)
    
    'Ponemos los encabezados
    obj_TS.WriteLine "Fichero" & vbTab & _
                     "Tamaño (KB)" & vbTab & _
                     "SID Propietario" & vbTab & _
                     "sAMAccountName Propietario" & vbTab & _
                     "distinguishedName Propietario"
            
End Sub 's_IniciarTXT

2 comentarios to “Script VBScript Para Listar Los Propietarios De Los Ficheros”

  1. yeikler said

    hola, gracias de antemano por el script, estoy trabajando en una red y tengo un equipo con windows NT y cuando trato de usar este script remoto desde una maquina con xp apuentando a la maquina con nt me genera el siguiente error

    -2147221164: Class not registered

    Error 2: No se ha podido conectar con el servicio WMI

    el script que estoy usando es listar-propietarios-de-ficheros.vbs

    Muchas gracias

  2. urpiano said

    yeikler,

    Me temo que en NT no te va a funcionar, por no tener las clases WMI adecuadas.

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: