Calendário

Setembro 2010
STQQSSD
«Jul Out »
 12345
6789101112
13141516171819
20212223242526
27282930 

Enquetes

O que precisa melhorar neste blog?

Ver os resultados

Loading ... Loading ...

Script para arquivamento de logs em WindowsScript para arquivamento de logs em Windows

Muito trabalho com os seus logs?

Se tem que gerir múltiplos servidores,cuidar dos logs de segurança de todos eles é um trabalho árduo!

A melhor solução é a automação! A criação de um script automatizado para recuperar os logs de cada servidor,excluir os eventos do Event Viewer e armazenar tudo numa pasta do servidor de arquivos (ou qualquer outra pasta de rede).

O script abaixo exemplifica como percorrer uma listagem de servidores (através do arquivo servidores.txt),recuperar o log de segurança e enviar para uma localização remota central:

' VB Script Document'Para executar:"cscript logs.vbs"'--------------------------------------------strDate = Year(Now) &"-" &String(2 - Len(Month(Now)),"0") &Month(Now) &_"-" &String(2 - Len(Day(Now)),"0") &Day(Now)pastaLocal = "C:\logs" 'pastaLocal tem que ser a pasta indicada em arquivoLogarquivoLog = "C:\logs\" &strDate &"-SEG.evt"   'arquivo de log local de cada máquina remotapastaRemota = "\\arquivos2\logs"arquivoSRV = "\\arquivos2\logs\servidores.txt"WScript.Echo vbCRLF &"Coletor de Eventos de Segurança" &vbCRLF &vbCRLF &_"Lista de entrada:" &vbTAB &arquivoSRV &vbCRLF &_"Pasta Log Local:" &vbTAB &arquivoLog &" (em cada máquina remota)" &vbCRLF &_"Pasta Log Remota:" &vbTAB &pastaRemota &vbCRLF &vbCRLFSet oFS = CreateObject("Scripting.FileSystemObject")'Abrir o arquivo de texto com a listagem de servidores'Apenas um computador por linha,SEM ESPAÇOS E SEM TABS!Set oTS = oFS.OpenTextFile(arquivoSRV)'percorre o arquivo de textoDo Until oTS.AtEndOfStream'busca o próximo computadorsComputer = oTS.ReadLineWScript.StdOut.Write "conexão a " &sComputer &"..."Set oWMIService = GetObject("winmgmts:" _&"{impersonationLevel=impersonate,(Security,Backup)}!\\" &_sComputer &"\root\cimv2")WScript.StdOut.Write " estabelecida." &vbCRLF &"recuperando arquivo de log remoto..."'efetua um query ao log de segurançaSet cLogFiles = oWMIService.ExecQuery ("Select * from Win32_NTEventLogFile where " &"LogFileName='Security'")'pesquisa a coleção de logsFor Each oLogfile in cLogFilesIf(oFS.FolderExists(pastaLocal)) = 0 ThenoFS.CreateFolder pastaLocalEnd IfIf (oFS.FileExists(arquivoLog)) ThenoFS.Deletefile arquivoLogEnd If'faz o backup do log para um arquivo local na máquina remotaerrBackupLog = oLogFile.BackupEventLog(arquivoLog)'verifica se ocorreu algum erroIf errBackupLog <>0 Then'se ocorreu - apresentar o erroWscript.Echo vbCRLF &"Não foi possível recuperar o log de " &sComputer &".  Erro:" &errBackupLogElseWScript.StdOut.Write " terminado." &vbCRLF &"Excluíndo log de eventos remoto..."'sem erros - é seguro apagar o logoLogFile.ClearEventLog()WScript.StdOut.Write " terminado." &vbCRLF &"Copiando arquivo da máquina remota para repositório central..."If (Not oFS.FolderExists(pastaRemota &"\" &sComputer)) ThenWScript.StdOut.Write " (Nova pasta)..."oFS.CreateFolder pastaRemota &"\" &sComputerEnd IfoFS.CopyFile "\\" &sComputer &"\" &Replace(arquivoLog,":","$"),pastaRemota &"\" &sComputer &"\" &strDate &"-SEG.evt"WScript.StdOut.Write " terminado." &vbCRLF &"excluíndo arquivo de log da máquina remota..."oFS.Deletefile "\\" &sComputer &"\" &Replace(arquivoLog,":","$")WScript.Echo " terminado."End IfWScript.EchoNextLoop'fechar o arquivo de servidoresoTS.Close'--------------------------------------------

Os arquivos de log no formato .evt ocupam bastante espaço,poderemos efetuar ainda um script (ou adicionar ao já existente) para após a cópia dos arquivos guardá-los em formato comprimido (ZIP) para economizar espaço.

Segue abaixo uma demonstração:

' VB Script Document'Para executar:"cscript arquivar.vbs"sub shell(cmd)' Executar um comando pela linha de comandos (Shell)dim objShellSet objShell = WScript.CreateObject( "WScript.Shell" )objShell.Run(cmd)Set objShell = Nothingend sub'--------------------------------------------strDate = Year(Now) &"-" &String(2 - Len(Month(Now)),"0") &Month(Now) &_"-" &String(2 - Len(Day(Now)),"0") &Day(Now)pastaRemota = "\\arquivos2\logs"arquivoSRV = "\\arquivos2\logs\servers.txt"'pastaRemota = "\\server\grps\is\dumpTest"'arquivoSRV = "\\server\grps\is\dumpTest\servers.txt"WScript.Echo vbCRLF &"Arquivador de Eventos" &vbCRLF &vbCRLF &_"Arquivo de entrada:" &vbTAB &arquivoSRV &vbCRLF &_"Repositório central:" &vbTAB &pastaRemota &vbCRLF &vbCRLFSet oFS = CreateObject("Scripting.FileSystemObject")'Abrir o arquivo de texto com os nomes dos servidores'apenas um computador por linha,SEM ESPAÇOS OU TABS!Set oTS = oFS.OpenTextFile(arquivoSRV)'Percorrer o arquivo de textoDo Until oTS.AtEndOfStream'Buscar computadorComputador = oTS.ReadLineWScript.StdOut.Write "Arquivando arquivos do servidor:" &Computador &"..."If (oFS.FileExists(Computador &"\" &strDate &"-SEG.evt")) ThenFileExists = "Verdadeiro"ElseFileExists = "Falso"End IfIf (FileExists="Verdadeiro") Then'Executar 7z para comprimir arquivosArquivosZip = "7za.exe a " &Computador &"\" &strDate &".zip " &Computador &"\" &"*.evt"shell ArquivosZipIf (oFS.FileExists(Computador &"\" &strDate &".zip")) ThenWScript.StdOut.Write " Ok!" &vbCRLF &vbCRLF &"Eliminando arquivos de evento..."oFS.Deletefile Computador &"\*.evt"ElseWScript.StdOut.Write " FALHA!" &vbCRLF &vbCRLF &"Ocorreu um erro! Programa"End IfWScript.Echo " terminado."WScript.EchoElseWScript.StdOut.Write " FALHA!" &vbCRLF &vbCRLF &"Não foram localizados registros de evento!"WScript.EchoEnd IfLoop'fechar o arquivo de entradaoTS.Close'--------------------------------------------

Com estas dicas fica mais eficiente a administração dos logs de eventos e evitará que eles fiquem cheios. Se quiser dá para integrar os dois scripts acima em um único script,além que dá para efectuar o arquivamento de outros tipos de log. Para tanto basta substituir o LogFileName na linha:

Set cLogFiles = oWMIService.ExecQuery ("Select * from Win32_NTEventLogFile where " &"LogFileName='Security'")

Por:

LogFileName=’Application’para Logs de aplicação.

LogFileName=’System’para Logs de sistema.

LogFileName=’File Replication Service’para Logs de replicação de arquivos.

LogFileName=’Directory Service’para Logs do serviço de diretório.

LogFileName=’DNS Server’para Logs do servidor DNS.

LogFileName=’Internet Explorer’para Logs do Internet Explorer.

LogFileName=’Windows PowerShell’para Logs da Shell do Windows.

O comando para comprimir (zipar) os arquivos é do 7zip,um software open-source para compressão de arquivos. Pode ser baixado gratuitamente em www.7zip.org. Neste caso foi usada a versão de linha de comandos que não requer qualquer instalação.

Agora resta apenas agendar este script através do agendador de tarefas do windows (Task Scheduler) e programar para execução diária.

3 comments to Script para arquivamento de logs em Windows

  • Martins

    Bom dia!

    È possivel efetuar a compactação de log so IIS,e excluir os logs originas apos a compactação ?/

    Grato

    Martins

    Like or Dislike:Thumb up 0 Thumb down 0

    • Olá Martins,é possível sim!

      O código abaixo arquiva (comprime) os logs IIS com x nr de dias e permite também se você quiser excluir arquivos comprimidos também por data:

      Option Explicit
      WScript.Timeout = 82800

      ' This Script archives (compresses to a zip file,then deletes the
      ' original) IIS log files older than a specified number of days.
      ' The script can also delete the compressed archive files older
      ' than another specified number of days.
      '
      ' Run it as a daily scheduled task on high traffic web servers to
      ' avoid running out of disc space. IIS logs can typically be
      ' compressed to well below 1/20 of the original file size.
      '
      ' The script needs the command line version of the free 7-Zip
      ' compressor available on http://www.7-zip.org/
      '
      ' The ArchiveLogFiles function takes three parameters:
      ' "Path to log dir"
      ' "Compress log files older than n days and delete the original files"
      ' "Delete compressed log files older than n days"
      '
      ' Multiple function calls can be added to archive files in different
      ' log folders with different log retentions.
      '
      ' Note that the function runs through subfolders recursively,so if
      ' the same log retention should be used on a whole log folder tree
      ' structure,only one call with the root log folder is needed.
      ' Additional calls with specific subfolders can then be made to have
      ' shorter retentions on those.
      '
      ' Edit the example lines below to match the log folder paths,
      ' archive and retention values needed on the server.

      ArchiveLogFiles "D:\Logfiles",30,180
      ArchiveLogFiles "D:\Logfiles\W3SVC1",14,30
      ArchiveLogFiles "D:\Logfiles\W3SVC243",5,30
      ArchiveLogFiles "D:\Logfiles\SMTPSVC1",7,60

      Function ArchiveLogFiles(strLogPath,intZipAge,intDelAge)
      Dim objFs
      Dim objFsCheck
      Dim objFolder
      Dim objSubFolder
      Dim objFile
      Dim objWShell
      Set objWShell = CreateObject("WScript.Shell")
      Set objFs = CreateObject("Scripting.FileSystemObject")
      Set objFsCheck = CreateObject("Scripting.FileSystemObject")
      If Right(strLogPath,1) "\" Then
      strLogPath = strLogPath &"\"
      End If
      If objFs.FolderExists(strLogPath) Then
      Set objFolder = objFs.GetFolder(strLogPath)
      For Each objSubFolder in objFolder.subFolders
      ArchiveLogFiles strLogPath &objSubFolder.Name,intZipAge,intDelAge
      Next
      For Each objFile in objFolder.Files
      If (InStr(objFile.Name,"ex") >0) _
      And (Right(objFile.Name,4) = ".log") Then
      If DateDiff("d",objFile.DateLastModified,Date) >intZipAge Then
      objWShell.Run "7za.exe a -tzip """ &strLogPath &_
      Left(objFile.Name,Len(objFile.Name)-3) &"zip"" """ &_
      strLogPath &objFile.Name &"""",7,true
      If objFsCheck.FileExists(strLogPath &_
      Left(objFile.Name,Len(objFile.Name)-3) &"zip") And _
      (objFsCheck.FileExists(strLogPath &objFile.Name)) Then
      objFsCheck.DeleteFile(strLogPath &objFile.Name)
      End If
      End If
      ElseIf (InStr(objFile.Name,"ex") >0) _
      And (Right(objFile.Name,4) = ".zip") Then
      If DateDiff("d",objFile.DateLastModified,Date) >intDelAge Then
      objFsCheck.DeleteFile(strLogPath &objFile.Name)
      End If
      End If
      Next
      Set objFs = Nothing
      Set objFsCheck = Nothing
      Set objFolder = Nothing
      Set objWShell = nothing
      End If
      End Function

      (Retirado de http://www.808.dk/?code-iis-log-housekeeping)

      Like or Dislike:Thumb up 0 Thumb down 0

  • piva

    Security Event Log do windows ? ,necessito ler esses logs para buscar dandos e armazenar em um banco de dados.

    Like or Dislike:Thumb up 0 Thumb down 0

Deixar uma Resposta

  

  

  


*

You can use these HTML tags

<a href=""title=""><abbr title=""><acronym title=""><b><blockquote cite=""><cite><code><del datetime=""><em><i><q cite=""><strike><strong>