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…

Dos Scripts Que Permiten Ver La ACL De Un Árbol De Directorios

Posted by urpiano en Jueves 30 \30\UTC noviembre \30\UTC 2006

Estos dos script permiten ver la ACL de un árbol de directorios. Uno lo hace usando WSH directamente, el otro por medio de llamadas a CACLS.EXE:

1.- lee-acls.vbs:
 
<pego lee-acls.vbs>

Option Explicit

'*****************Descripción********************************
'Este script muestra las ACLs del directorio pasado como
'argumento y de aquellos que contiene. Muestra las
'ACLs de los directorios únicamente.

'Sintaxis:

'cscript lee-acls.vbs [carpeta]

'-carpeta: ruta de la carpeta inicio del árbol del que
'queremos obtener sus ACLs; parámetro opcional, si se
'omite se considera el directorio actual del inductor
'de la ventana de comandos desde la que se lanza.

'Ejemplos:

'cscript lee-acls.vbs
'cscript lee-acls.vbs c:Moria

'© 8/2005 Fernando Reyes
'*****************Fin de la descripción**********************


'********* Declaración de variables ****************************
Dim str_CarpetaOrigen       'Albergará el nombre de la
                                     'carpeta a la que se liste
                                     'su ACL
Dim obj_ServicioWMI          'Objeto para acceder al
                                     'servicio WMI
Dim obj_EntradasDeSeguridadDeCarpeta 'Objeto para
                                          'albergar las entradas
                                          'ACL de la carpeta
Dim obj_DescriptorDeSeguridad       'Objeto para albergar
                                          'el descriptor de
                                          'seguridad de la carpeta
Dim int_Devolucion                  'Recogerá la devolucion de
                                            'la llamada al método WMI
                                            'GetSecurityDescriptor
Dim int_FlagsDeControl              'Contendrá los flags de
                                            'control del descriptor
                                            'de seguridad
Dim arr_ACEs                        'Array que contendrá las
                                            'entradas de seguridad
                                            'del descriptor de 
                                            'seguridad
Dim obj_ACE                         'Albergará el objeto
                                            'de cada entrada de
                                            'seguridad
Dim obj_FileSystemObject            'Objeto FileSystem para
                                            'navegar la carpeta 
                                            'str_Carpeta

'********* Fin de la Declaración de variables ******************

'********* Declaración de constantes ***************************
Const SE_DACL_PRESENT = &h4
Const ACCESS_ALLOWED_ACE_TYPE = &h0
Const ACCESS_DENIED_ACE_TYPE  = &h1

Const FILE_ALL_ACCESS         = &h1f01ff
Const FOLDER_ADD_SUBDIRECTORY = &h000004
Const FILE_DELETE             = &h010000
Const FILE_DELETE_CHILD       = &h000040
Const FOLDER_TRAVERSE         = &h000020
Const FILE_READ_ATTRIBUTES    = &h000080
Const FILE_READ_CONTROL       = &h020000
Const FOLDER_LIST_DIRECTORY   = &h000001
Const FILE_READ_EA            = &h000008
Const FILE_SYNCHRONIZE        = &h100000
Const FILE_WRITE_ATTRIBUTES   = &h000100
Const FILE_WRITE_DAC          = &h040000
Const FOLDER_ADD_FILE         = &h000002
Const FILE_WRITE_EA           = &h000010
Const FILE_WRITE_OWNER        = &h080000
'********* Fin de la Declaración de constantes *****************

'********* Cuerpo del script ***********************************

'Recogemos la carpeta suministrada como argumento; en caso de
'no ser pasado se asume el directorio actual
If Wscript.Arguments.Count = 0 Then

    str_CarpetaOrigen = "."

Else

    str_CarpetaOrigen = Wscript.Arguments(0)

End If

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

'Llamamos a la rutina que obtiene las ACLs pasando un objeto
'carpeta obtenido con la ruta recibida como parámetro y el
'método GetFolder del objeto FileSystem
Call s_Muestra_ACLs(obj_FileSystemObject.GetFolder(str_CarpetaOrigen))

Sub s_Muestra_ACLs(obj_Carpeta)

'*****************Descripción********************************
'Esta rutina muestra la ACL de la carpeta recibida y realiza
'una llamada recursiva para todas las subcarpetas que contiene
'*****************Fin de la descripción**********************

    Dim obj_SubCarpeta 'Objeto que albergará cada carpeta contenida en la
                    'carpeta obj_Carpeta

    'Mostramos la ruta de la carpeta actual
 WScript.Echo "ACL de la carpeta " & obj_Carpeta.Path

 'Creamos un objeto servicio WMI
 Set obj_ServicioWMI = GetObject("winmgmts:")
 
 'Creamos un objeto con las entradas de seguridad de la carpeta
 Set obj_EntradasDeSeguridadDeCarpeta = _
                obj_ServicioWMI.Get _
       ( _
        "Win32_LogicalFileSecuritySetting='" & _
     obj_Carpeta.Path & "'" _
     )
     
 'Creamos un objeto descriptor de seguridad con el método
 'GetSecurityDescriptor del objeto que contiene las
 'entradas de seguridad
 int_Devolucion = _
         obj_EntradasDeSeguridadDeCarpeta.GetSecurityDescriptor _
                        (obj_DescriptorDeSeguridad)
 
 'Almacenamos los flags de control del descriptor de seguridad
 int_FlagsDeControl = obj_DescriptorDeSeguridad.ControlFlags
 
 'Vamos revisando la existenca de las diferentes entradas de
 'control den los flags; en caso de aparecer se muestran
 If (int_FlagsDeControl AND SE_DACL_PRESENT) _
           = SE_DACL_PRESENT Then
    arr_ACEs = obj_DescriptorDeSeguridad.DACL

    For Each obj_ACE in arr_ACEs

        WScript.Echo obj_ACE.Trustee.Domain & "" & obj_ACE.Trustee.Name

        If (obj_ACE.AceType = ACCESS_ALLOWED_ACE_TYPE) _
           = ACCESS_ALLOWED_ACE_TYPE Then
            WScript.Echo vbTab & "Permitido:"

        ElseIf (obj_ACE.AceType = ACCESS_DENIED_ACE_TYPE) _
           = ACCESS_DENIED_ACE_TYPE Then

            WScript.Echo vbTab & "Denegado:"

        End If

        If (obj_ACE.AccessMask AND FILE_ALL_ACCESS) _
           = FILE_ALL_ACCESS Then

            WScript.Echo vbTab & vbTab & "FILE_ALL_ACCESS "

        End If

        If (obj_ACE.AccessMask AND FOLDER_ADD_SUBDIRECTORY) _
           = FOLDER_ADD_SUBDIRECTORY Then

            WScript.Echo vbTab & vbTab & " FOLDER_ADD_SUBDIRECTORY "

        End If

        If (obj_ACE.AccessMask AND FILE_DELETE) _
           = FILE_DELETE Then

            WScript.Echo vbTab & vbTab & "FILE_DELETE "

        End If

        If (obj_ACE.AccessMask AND FILE_DELETE_CHILD) _
           = FILE_DELETE_CHILD Then

            WScript.Echo vbTab & vbTab & "FILE_DELETE_CHILD "

        End If

        If (obj_ACE.AccessMask AND FOLDER_TRAVERSE) _
           = FOLDER_TRAVERSE Then

            WScript.Echo vbTab & vbTab & " FOLDER_TRAVERSE "

        End If

        If (obj_ACE.AccessMask AND FILE_READ_ATTRIBUTES) _
           = FILE_READ_ATTRIBUTES Then

            WScript.Echo vbTab & vbTab & "FILE_READ_ATTRIBUTES "

        End If

        If (obj_ACE.AccessMask AND FILE_READ_CONTROL) _
           = FILE_READ_CONTROL Then

            WScript.Echo vbTab & vbTab & "FILE_READ_CONTROL "

        End If

        If (obj_ACE.AccessMask AND FOLDER_LIST_DIRECTORY) _
           = FOLDER_LIST_DIRECTORY Then

            WScript.Echo vbTab & vbTab & " FOLDER_LIST_DIRECTORY "

        End If

        If (obj_ACE.AccessMask AND FILE_READ_EA) _
           = FILE_READ_EA Then

            WScript.Echo vbTab & vbTab & "FILE_READ_EA "

        End If

        If (obj_ACE.AccessMask AND FILE_SYNCHRONIZE) _
           = FILE_SYNCHRONIZE Then

            WScript.Echo vbTab & vbTab & "FILE_SYNCHRONIZE "

        End If

        If (obj_ACE.AccessMask AND FILE_WRITE_ATTRIBUTES) _
           = FILE_WRITE_ATTRIBUTES Then

            WScript.Echo vbTab & vbTab & "FILE_WRITE_ATTRIBUTES "

        End If

        If (obj_ACE.AccessMask AND FILE_WRITE_DAC) _
           = FILE_WRITE_DAC Then

            WScript.Echo vbTab & vbTab & "FILE_WRITE_DAC "

        End If

        If (obj_ACE.AccessMask AND FOLDER_ADD_FILE) _
           = FOLDER_ADD_FILE Then

            WScript.Echo vbTab & vbTab & " FOLDER_ADD_FILE "

        End If

        If (obj_ACE.AccessMask AND FILE_WRITE_EA) _
           = FILE_WRITE_EA Then

            WScript.Echo vbTab & vbTab & "FILE_WRITE_EA "

        End If

        If (obj_ACE.AccessMask AND FILE_WRITE_OWNER) _
           = FILE_WRITE_OWNER Then

            WScript.Echo vbTab & vbTab & "FILE_WRITE_OWNER "

        End If

    Next

 Else

    WScript.Echo "No existen ACLs para esta carpeta ¿Volumen formateado con FAT?"

 End If
 
 'Realizamos una llamada recursiva en cada una de las carpetas
 'contenidas en la carpeta recibida como parámetro.
 For Each obj_SubCarpeta In obj_Carpeta.SubFolders

     Call s_Muestra_ACLs(obj_Subcarpeta)

 Next
 
End Sub

</pego lee-acls.vbs>
 
2.- lee-acls-con-cacls-vbs
 
<pego lee-acls-con-cacls-vbs>

Option Explicit

'*****************Descripción********************************
'Este script vuelca al fichero pasado como primer argumento
'las ACLs obtenidas de las llamadas recursivas a CACLS.EXE
'a partir del directorio pasado como argumento. Muestra las
'ACLs de los directorios únicamente.

'Sintaxis:

'cscript lee-acls-con-cacls.vbs fichero_destino [carpeta]

'-fichero_destino: [ruta]nombre_de_fichero en el cual
'queremos que se guarden los resultados. Parámetro requerido

'-carpeta: ruta de la carpeta inicio del árbol del que
'queremos obtener sus ACLs; parámetro opcional, si se
'omite se considera el directorio actual del inductor
'de la ventana de comandos desde la que se lanza.

'Ejemplos:

'cscript lee-acls-con-cacls.vbs d:SecInfoACLsMoria.txt
'cscript lee-acls-con-cacls.vbs d:SecInfoACLsMoria.txt c:Moria

'© 8/2005 Fernando Reyes
'*****************Fin de la descripción**********************

Dim str_CarpetaOrigen  'Recibirá la carpeta de origen de 
                       'los argumentos
Dim obj_FileSystem     'Albergará un objeto FileSystem
dim str_FicheroDestino 'Recibirá el nombre del fichero donde
                       'se volcarán los resultados

'Control de argumentos; debe haber al menos un argumento:
'el nombr del fichero en el que se vuelcan los resultados
'de CACLS. El segundo es opcional, y es el nombre de la carpeta
'a revisar, si se omite se revisa el directorio desde el que
'se lanza el script (".")
If WScript.Arguments.Count = 0 Then

    Wscript.Echo "Al menos se debe pasar un argumento: " & _
              "el nombre del fichero donde se vuelcan " & _
              "los resultados"
    Wscript.Quit(1)
ElseIf Wscript.Arguments.Count = 1 Then

    str_CarpetaOrigen = "."
	
Else

    str_CarpetaOrigen = Wscript.Arguments(1)
	
End If

str_FicheroDestino = WScript.Arguments(0)

'Creamos un objeto FileSystem con el que obtenemos
'un objeto carpeta con la ruta de la carpeta requerida
'y lo pasamos como argumento a la función s_MuestraSubCarpetas
Set obj_FileSystem = CreateObject("Scripting.FileSystemObject")

'Volcamos la información de cabecera en el fichero destino
Call RunCmd ("@echo lee-acls-con-cacls.vbs: Resultados para " & _
                str_CarpetaOrigen & ">" & _
    str_FicheroDestino)
Call RunCmd ("@echo *****************************************>>" & _
    str_FicheroDestino)

'Llamamos a la rutina que vuelca las ACLs en el fichero
s_MuestraSubCarpetas obj_FileSystem.GetFolder(str_CarpetaOrigen)

Sub s_MuestraSubCarpetas(obj_Folder)
'*****************Descripción********************************
'Esta rutina escribe en el fichero destino la información
'ACL de la carpeta recibida y realiza una llamada recursiva
'a las carpetas que contiene.
'*****************Fin de la descripción**********************
    
    Dim obj_SubFolder  'Objeto que albergará las subcarpetas
                       'contenidas en el objeto carpeta pasado
 
    'Volcamos la ACL de la carpeta recibida en el fichero por
    'medio de una llamada a RunCmd pasando una instrucción
    'CACLS sobre el directorio recibido
    Call RunCmd("cacls.exe " & obj_Folder.Path & ">>" & str_FicheroDestino)
 
    'En este bucle hacemos una llamda recursiva a cada ubna de las
    'carpetas contenidas en el directorio recibido
    For Each obj_Subfolder in obj_Folder.SubFolders
 
        'Wscript.Echo obj_Subfolder.Path
        Call s_MuestraSubCarpetas(obj_Subfolder)
		
    Next
	
End Sub

Sub RunCmd(str_Comando)
'*****************Descripción********************************
'Esta rutina lanza el comando recibido como parámetro como
'si desde una ventana de comandos fuese lanzado
'*****************Fin de la descripción**********************

    Dim str_Shell  'Alberga la cadena que permite lanzar
                   'la ventana de comandos predeterminada
                   '(COMSPEC)
    Dim obj_Shell  'Contiene un objeto Shell
 
    'Creamos un objeto Shell
    Set obj_Shell = CreateObject ("Wscript.Shell")
 
    'Obtenemos la cadena que lanza la ventana de comandos 
    'predeterminada
    str_Shell = obj_Shell.Environment("Process").Item("COMSPEC")
 
    'Lanzamos el comando por medio de una llamada al método Run
    'del objeto Shell
    obj_Shell.Run str_Shell & " /c """ & str_Comando & """", 0,True
 
End Sub

 

</pego lee-acls-con-cacls-vbs>

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: