2008 R2: Automatizando tareas administrativas: Powershell(5)

Copiar y guardar los eventos, y al tiempo limpiar el registro.

Hay que descargarse la extensión Pscx-2.0.0.1.zip desde http://pscx.codeplex.com, y extraerla en el directorio de modulos del usuario: ‘Mis DocumentosWindowsPowerShellModules’, o en el directorio de modulos de PS, valor que devuelve la variable $PSHome desde el ISE, en mi caso:

variablePSHOME

El Script en castellano (más o menos).

<#

   .Sipnosis

    Este script guarda los log de Eventos

   .Descripción

    Se puede ejecutar de forma periódica (regularmente) para el archivo o copia de los log de eventos

    NB, este script los guarda y limpia el registro de eventos, no solamente hace una copia de seguridad.

    El script se ha diseñado con el ánimo de investigar y auditar los log de seguridad.

    De hecho copia los log en memoria, y luego los borra, y entonces los guarda en archivos csv, 

    por ello se recomienda ejecutarlo de forma local o vía PS en remoto.

   .Ejemplo

    .Inicia-copiasegEventLogs.ps1

   .Entradas

    Ninguna

   .Salidas

    Ninguna

   .Notas

    Nombre: Inicia-copiasegEventLogs.ps1

    AUTHOR: Benjamin R Wilkinson

    TRADUCCIÓN y ADAPTACIÓN CASTELLANO: Juansa

    DESARROLLADO: Mediante Windows PowerShell ISE.

    VERSIÓN: 1.0.0

    ULTIMA EDICIÓN: 20/07/2010

    CLAVES: 

   .Link

#>

#Se requiere -Versión 2.0

[CmdletBinding()]

 Param 

   (

    [Parameter(Mandatory=$false,

               ValueFromPipeline=$true,

               ValueFromPipelineByPropertyName=$true)]

    [String]

    $computer = "$ENV:COMPUTERNAME",            

    [ValidateSet("Application", "Security", "System")]

    [Alias("l","log")]

    [String]

    $LogName = "Security",

    #$MinBackupSize = "209715200", # 200MB

    #$MinBackupSize = "204472320", # 195MB

    $MinBackupSize = "1024", # 1MB

    [String]$BackupLocal = "D:COPIALOGS",

    #[String]$Backupremote = "D:COPIALOGS"

    #[String]$Backupremote = "\ADTEST04logsseclogs"

    [String]$Backupremote = "srvpl01COPIALOGS"

   )#End Param

Begin

{

 # El cmdlet para exportar a zip es de: http://pscx.codeplex.com/

 Import-Module PSCX

 Write-Host "Procesando $Logname Logs .. .. Server:"$computer (get-date)

}

Process

{

    $BaseDirLocal = "$BackupLocal{0:yyyy_MM}-Logs" -f [DateTime]::now

    $LogFileName = "{0}-{1:yyyyMMdd_HHmm}-{2}.csv" -f $Computer,[DateTime]::now,$LogName

    $PathLocal = Join-Path -Path $BaseDirLocal -ChildPath $LogFileName

    Write-Host "  + Procesando $LogName Log"

    Write-Host "    - Leyendo $LogName Log"

    

    $Query = "Select * from Win32_NTEventLogFile where LogfileName = '$LogName'"

    if ((Get-WmiObject -Query $Query -ComputerName "localhost").FileSize -gt $MinBackupSize)

       {

        #Guarda los log a un Objeto de PS en memoria

        $SecLogs = get-eventlog -LogName $LogName

        

        #Limpia los log de eventos

        Write-Host "    - Limpiando $LogName Log"

        Clear-EventLog -LogName $LogName

        

        # Se asegura que existe el directorio local

        If(!(Test-Path $BaseDirLocal))

        {

          New-Item $BaseDirLocal -type Directory -force | out-Null

        }

        Write-Host "    - Exportando a CSV"

        

        # Exporta desde la memoria a CSV 

        $SecLogs | ForEach-Object {$RString = $_.ReplacementStrings | ForEach-Object {$_}

        $Hash = @{             

        EventID       =$_.EventID

        MachineName   =$_.MachineName

        Category      =$_.Category

        CategoryNumber=$_.CategoryNumber

        EntryType     =$_.EntryType

        ReplStrings   ="$RString"

        TimeGenerated =$_.TimeGenerated

        UserName      =$_.UserName}

        New-Object PSObject -Property $Hash

        } | Export-Csv -Path $PathLocal -NoTypeInformation

        Write-Host "    - exportación a CSV completada"

        

        # Empaquetar en Zip

        Write-Host "    - Empaquetando Zip"

        $ZipLogArchiveFile = Get-ChildItem $PathLocal | write-zip -level 9

        if (Test-Path -Path $ZipLogArchiveFile)

        {

         Remove-Item -Path $PathLocal

        }

        

        # Copia los Log/CSV a carpeta compartida

        $BaseDirRemote = "$Backupremote{0:yyyy_MM}-Logs" -f [DateTime]::now

        If(!(Test-Path -Path $BaseDirRemote))

        {

          New-Item $BaseDirRemote -type Directory -force | out-Null

        }

        

        # Elimina el archivo anterior

        If(Test-Path -Path $BaseDirLocal)

        {

          # Mueve todos los archivos desde el directorio local y lo limpia

          Write-Host "    - Archivando en Zip:"$ZipLogArchiveFile.Name

          Move-Item "$BaseDirLocal*.zip" -Destination $BaseDirRemote -Force

          Remove-Item -Path $BaseDirLocal

        }

       }

    else

       {

        $Skip = $True

       }    

}

End

{

 if (!$Skip)

    {

     $Msg = "Proceso de $LogName log completado, hay {0} logs exportados." -f $SecLogs.count

     $Msg2 = "Logs guardados a {0}{1}" -f $BaseDirRemote, $ZipLogArchiveFile.Name

     Write-Host $Msg

     Write-Host $Msg2

     (get-date)

    }

 else

    {

     Write-Host "El tamaño de los Log es menor de $($MinBackupSize/1MB) MB, no se realizan cambios" 

    }

$Skip = $Null

}

limpiasecuritylog

Este scrip nos sirve para vaciar los logs. En el ejemplo lo hace con el de seguridad, pero podemos cambiar el valor de la variable $LogName a Application o System.

Por supuesto hay otras variables a explicar:

$LogName Security, Application o Security

$MinBackupSize Tamaño mínimo del registro de Seguridad, Aplicación o Sistema para realizar la copia, guardado y limpieza.

$BackupLocal Directorio local donde se vuelca la info a archivos CSV que serán empaquetados en zip y eliminados de dicho directorio (temporal)

$BackupRemote Directorio donde se guarda el zip empaquetado con el CSV.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *