segunda-feira, 6 de abril de 2009

Pesquisando as impressões efetuadas através do seu servidor de impressão

Conforme pôde ser visto no post anterior, configuramos a auditoria no equipamento que atuará como servidor de impressão. Agora, precisamos consultar de alguma maneira as impressões realizadas.

Como as impressões são realizadas e registradas no log de eventos do Windows, agora precisamos de um script exportar o log, já que a exportação padrão do visualizador de eventos não nos fornece os dados principais da impressão (o que foi impresso, tamanho do trabalho de impressão e quantas páginas).

Continuar lendo...



Abaixo, anexo um script escrito em vbs (bem simples por sinal) que faz o trabalho para exportar para um arquivo texto no formato SQL. Confesso que este script não é dos melhores (faltou um pouco de tempo para melhorá-lo e ficar mais eficiente).

O script se conecta através de WMI para acessar os logs. A sintaxe da pesquisa é parecida com SQL e chama-se WQL (WMI Query Language).

---8<--- strComputer = "."
dim dtmData
dtmData = dateadd("d", -1, date())
strDataPesquisa = year(dtmData) & Right("0" & month(dtmData), 2) & Right("0" & day(dtmData), 2)
rem wscript.echo strDataPesquisa

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery( _
"SELECT * FROM Win32_NTLogEvent " & _
"WHERE EventCode=10 and EventType=3 " ,,48)

set objFS = CreateObject("Scripting.FileSystemObject")

set objResultado = objFS.OpenTextFile("c:\windows\temp\logimpressoras.sql", 2, true)

For Each objItem in colItems

rem extrai a data e a hora.
strData = Left(objItem.TimeGenerated, 14)
strHora = Right(strData, 6)
strData = Left(strData, 8)
rem wscript.echo(strData)

if LTrim(RTrim(strData)) = Ltrim(RTrim(strDataPesquisa)) then

rem formata a data e hora
strData = Left(strData,4) & "-" & mid(strData, 5, 2) & "-" & Right(strData, 2)
strHora = Left(strHora, 2) & ":" & mid(strHora, 3, 2) & ":" & Right(strHora, 2)

strDtm = strData & " " & strHora

rem pega o tamanho da impressao e o numero de paginas
strSize = mid(objItem.Message, inStr(objItem.Message, "Size in bytes:"))
strSize = mid(strSize, inStr(strSize, ":")+1)
strPages = RTrim(LTrim(Mid(strSize, inStr(strSize, ":")+1)))
strSize = LTrim(RTrim(Left(strSize, inStr(strSize, ";") - 1)))

rem pega a identificacao do job
strJobNumber = LTrim(RTrim(Left(objItem.Message, inStr(objItem.Message, ",") - 1)))

rem pega o nome do trabalho de impressao
strJob = Mid(objItem.Message, inStr(objItem.Message, ",") + 1)

strOwner = Mid(objItem.Message, inStr(strJob, " owned by ")+12)

strJob = LTrim(RTrim(Left(strJob, inStr(strJob, " owned by ") - 1)))

rem trata apostrofos
strJob = replace(strJob, "'", "\'")

strPrinter = Mid(strOwner, inStr(strOwner, " was printed on ") + 16)
strPrinter = LTrim(RTrim(Left(strPrinter, inStr(strPrinter, " via port ") - 1)))

strOwner = Left(strOwner, inStr(strOwner, " was printed on ") - 1)
strOwner = LTrim(RTrim(Mid(strOwner, inStrRev(strOwner, " ") + 1)))

strSQL = "INSERT INTO tblImpressoes (strJob, strJobName, strProprietario, strImpressora, dtmImpressao, dblTamanho, dblPaginas) " & _
"VALUES ('" & strJobNumber & "', '" & strJob & "', '" & strOwner & "', '" & strPrinter & "', '" & strDtm & "', " & strSize & _
", " & strPages & ");" & chr(13) & chr(10)

objResultado.Write(strSQL)

end if

Next

objResultado.Close

set objResultado = nothing
set objFS = nothing
set colItems = nothing
set objWMIService = nothing

--->8---

Feito isto, bastou agendar a tarefa para ser executada uma vez ao dia para que o log fosse exportado para o arquivo texto.

No servidor onde armazeno os logs, fiz um script para baixar o arquivo e importá-lo na base de dados em MySQL, PostgreSQL, SQL Server, etc. A partir daí foi só efetuar a consulta da maneira que eu precisava, com agrupamentos, totais, somatórias e tudo mais.

Estas consultas podem ser feitas diretamente via planilha de cálculo ou desenvolver uma pequena página web para exibí-los.

Não é a melhor solução do mercado. Apesar de artesanal, resolve meu problema.

Nenhum comentário: