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 Documentos\WindowsPowerShell\Modules', 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 = "\\ADTEST04\logs\seclogs"
    [String]$Backupremote = "\\srvpl01\COPIALOGS"
   )#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.

Published 12/8/2011 13:54 por Juansa
Comparte este post: