Ir al contenido principal

Archivado de carpetas obsoletas.

Pongamos que eres un administrador de sistemas, y una de tus responsabilidades es administrar el servidor de ficheros de tu empresa. Pongamos también que en ese servidor de ficheros, tienes una carpeta que se llama, por ejemplo, proyectos, donde se han ido almacenando en carpetas individuales los proyectos que tu empresa ha ido realizando desde que a alguien se le ocurrió hacerlo. Supongamos que nadie, nunca, se ha molestado en archivar las carpetas de los proyectos que iban finalizando. Y supongamos por último, que el volumen de información ha ido creciendo hasta alcanzar el máximo de tamaño que tu pequeña SAN permite (2TB). En ese preciso instante te despiertas empapado en sudor pensando que todo ha sido un mal sueño. Pero a veces, solo a veces, algunos sueños pueden hacerse realidad.

El tema del archivado de información obsoleta es algo que me preocupa hace tiempo, aunque hasta ahora no he tenido tiempo de poder analizar en profundidad el problema. La principal barrera que siempre nos ha impedido realizar un archivado tradicional en cinta, es que el sistema que se utiliza para archivar en cinta, no archiva estructuras completas de carpetas, sino que analiza cada archivo y carpeta de forma individual y lo compara con el patrón de archivado que hayas definido (por fecha de modificación, de acceso, etc.). Desgraciadamente para mi, nosotros no podemos archivar de esa forma, ya que necesitamos que cuando se archiva un proyecto se archive toda la información relativa a ese proyecto de forma consistente. La gente de Microsoft ha hecho un gran trabajo al incluir de forma nativa en Windows 2008 R2 herramientas de archivado que facilitan mucho la vida del administrador, pero desgraciadamente (¿porque en informática siempre hay un desgraciadamente detrás de cada esquina?), estas herramientas no son demasiado aplicables a información obsoleta, además, habría que migrar el servidor de ficheros a Windows 2008 R2, con todo lo que ello implica.

En fin, la pregunta es: ¿Hay alguna solución para archivar carpetas completas basándonos en la última fecha de acceso? Mi aproximación al problema, como hago normalmente cuando algo se complica, es programar algo específico. En este caso, el script que he preparado comprueba todos los archivos que hay dentro de las carpetas de una ruta dada (nuestra inquietante carpeta de proyectos) e imprime el nombre de la carpeta, la ruta UNC a la carpeta y la fecha del acceso más reciente a cualquiera de los archivos contenidos en ella. El script en sí, es una modificación de un script posteado en el blog de Hey, scripting Guy! El código del script es el siguiente:

Set objFSO = CreateObject("Scripting.FileSystemObject")
objStartFolder = "C:\Scripts"

Set objFolder = objFSO.GetFolder(objStartFolder)
Wscript.Echo objFolder.Path
Set colFiles = objFolder.Files
For Each objFile in colFiles
Wscript.Echo objFile.Name
Next
Wscript.Echo

ShowSubfolders objFSO.GetFolder(objStartFolder)

Sub ShowSubFolders(Folder)
For Each Subfolder in Folder.SubFolders
Wscript.Echo Subfolder.Path
Set objFolder = objFSO.GetFolder(Subfolder.Path)
Set colFiles = objFolder.Files
For Each objFile in colFiles
Wscript.Echo objFile.Name
Next
Wscript.Echo
ShowSubFolders Subfolder
Next
End Sub


Como podéis ver, el script realiza las siguientes acciones:
•Crea un objeto FSO para trabajar con ficheros locales
•Define en una variable la carpeta que se va a examinar
•Enlaza el objeto FSO creado a la carpeta que se ha definido en la variable
•Muestra la ruta de acceso de la carpeta (como se explica en el enlace, esta ruta puede ser local, o una ruta UNC usando carpetas compartidas).
•Se introducen los ficheros que hay dentro de la carpeta en una colección para poder acceder a las propiedades de cada fichero individualmente.
•Se muestra el nombre de cada fichero
•Se llama a una función (Sub) la cual hace lo mismo que hemos comentado antes por cada subcarpeta de forma anidada. Es decir, en cada subcarpeta, la función se llama a si misma hasta que se llegue a una subcarpeta en la que no haya más carpetas.

Este script, está muy bien, pero aun así, no nos sirve para lo que nosotros queremos exactamente, por lo que le añadimos algunas líneas de código más:

On Error Resume next
Set objFSO = CreateObject("Scripting.FileSystemObject")
objStartFolder = “\\Ruta_UNC\carpeta”

fecha2 = CDate("30/11/1990 22:20:59")

ShowSubfolders objFSO.GetFolder(objStartFolder), 1, fecha2

Sub ShowSubFolders(Folder, level, fecha2)
On Error Resume next
For Each Subfolder in Folder.SubFolders
If level = 1 Then
Wscript.StdOut.write Subfolder.name & ";" & Subfolder.Path
End if
Set objFolder = objFSO.GetFolder(Subfolder.Path)
Set colFiles = objFolder.Files
For Each objFile in colFiles
If fecha <>
fecha = objFile.DateLastAccessed
End if
Next
If Err.Number <> 0 Then
fecha = Now()
Err.clear
End If
ShowSubFolders Subfolder, level + 1, fecha2
If level = 1 Then
WScript.StdOut.writeline ";" & fecha
fecha = fecha2
End If
Next
End Sub

Como podéis ver, he añadido un par de opciones:
•En primer lugar, elimino el recorrido inicial que se ha ce por la carpeta raíz, ya que ese dato no me interesa.
•Inicializo una variable de fecha, que se mantendrá constante. Se inicializa a una fecha suficientemente antigua, y para darle formato de tipo date a la variable, usamos la función CDate, que convierte la cadena de fecha al tipo de variable fecha. De este modo podemos inicializar las variables a la fecha que queramos.
•Llamamos a la función de mostrar subcarpetas y a parte del objeto folder que contiene la carpeta raíz con la que trabajamos, le pasamos 2 variables mas. La primera (pasando un uno) nos dirá el nivel de la subcarpeta con respecto a la ruta UNc que hemos definido inicialmente, lo que nos permitirá después filtrar los resultados mostrados para escribir la fecha solo en las carpetas del primer nivel y reinicializar la variable fecha a fecha2. La segunda variable es la variable Fecha2, que es constante y que hemos inicializado anteriormente a una fecha suficientemente antigua.
•Al principio de la función, comprobamos que la carpeta que estamos trabajando es de nivel 1 e imprimimos su nombre y su ruta, separados por ;
•Comprobamos fichero por fichero de cada subcarpeta que la variable fecha es mas reciente que la fecha de ultimo acceso del fichero. Si no lo es, asignamos a la variable fecha la fecha de último acceso de ese fichero. De ese modo, la variable fecha, va almacenando la fecha de acceso más reciente de cualquiera de los ficheros de la subcarpeta.
•Cuando volcamos la lista de ficheros, añadimos un if con control de errores por si hay un error (no tener acceso a la carpeta es el más común), y reseteamos la fecha de acceso al día de hoy.
•Por último, después de llamar otra vez a la función de mostrar subcarpetas, comprobamos que la carpeta con la que trabajamos es de nivel 1 y si lo es, escribimos la fecha y la reinicializamos.

Con este script obtendréis una salida de texto separado por ; que podéis exportar fácilmente a Excel y filtrar de la forma que mas os convenga. Para ello, recordad que tenéis que usar la redirección de salida desde una línea de comandos, algo así:

cscript c:\miscript > c:\salida_script.txt

Saludos a todos.

Comentarios

Entradas populares de este blog

Instalación de Nagios plugin para Cacti (sobre CentOS)

En entradas anteriores (aquí, aquí y aquí), hemos explicado como instalar un servidor Centos, y sobre ese mismo servidor, instalar Nagios y Cacti. Hoy voy a explicaros como instalar el plugin de Nagios para Cacti. Este plugin, lo que hace es permitir que Cacti pueda leer datos de Nagios, proveyendo un dashboard para monitorizar Nagios desde la propia web de Cacti, así como poder importar los equipos que tenemos en Nagios de forma directa en Cacti. Podéis encontrar mas información sobre este plugin en su pagina.
   Para comenzar, nos posicionaremos en el directorio root, y descargaremos y descomprimiremos las ndoutils, que son prerrequisito para la instalación de NPC:
cd /root/ ; web http://sourceforge.net/projects/nagios/files/ndoutils-1.x/ndoutils-1.4b7/ndoutils-1.4b7.tar.gz ; tar -xvf ndoutils-1.4b7.tar.gz    Entramos en el directorio que se acaba de crear con la descompresión del archivo, compilamos e instalamos. Comprobad que la ruta a las librerías de sql es la correcta:
cd /ro…

Instalación de Cacti en Centos

Siguiendo con este post de la semana pasada en el que os indicaba como realizar la instalación de un servidor Centos, hoy vamos con un manual sobre la instalación de Cacti en Centos. Cacti es un sistema de monitorización de servicios basado en SNMP orientado a la generación de estadísticas gráficas. Podéis encontrar mas información sobre Cacti en su pagina oficial Aquí.    Para comenzar la instalación, nos conectamos a nuestro servidor por SSH, nos logamos en el con el usuario Root, y comenzamos instalando los prerrequisitos del sistema:yum install -y mysql-server mysql-devel php-mysql php-devel php php-snmp httpd net-snmp net-snmp-devel net-snmp-utils rrdtool rrdtool-devel ruby-rrdtool gcc make wget   Wget no es un prerrequisito en si, pero nos hará falta mas adelante para descargar el programa. Una vez que haya finalizado la instalación de los prerrequisitos, nos colocamos en el directorio root, descargamos la última versión de cacti de la pagina web y la descomprimimos:cd /root/…

Error id 12294, La base de datos SAM no pudo bloquear la cuenta de administrador...

Últimamente hemos estado teniendo un problema de esos que a todo administrador de sistemas le trae de cabeza... Al menos hasta que lo ha solucionado una vez. Para aquellos de vosotros que habéis llegado hasta aqui después de toparos con el en vuestro trabajo diario y no sabeis muy bien que hacer, voy a indicaros paso por paso como solucionarlo.


El error consiste en el intento reptitivo de bloqueo de la cuenta de Administrador del dominio por parte de una maquina del dominio. Estos errores se generan en el registro de eventos de sistema con el id 12294 y con origen Directory-Services-SAM si es Windows 2008 o SAM si es Windows 2003 o anterior.




El error en si no aunque parece grave, no debe preocuparnos tanto, ya que la cuenta de administrador de dominio nunca se bloquea. Lo que si nos molestara mas, es el hecho de que estos errores saturan nuestro log de eventos de sistema, así como el registro de seguridad del DC.




El problema que nos encontramos cuando intentamos solucionar e…