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:
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
}
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.