Salvar log de impressões do Windows Server 2012 em banco de dados MySQL

Existem vários scripts powershell na internet que identificam os eventos de impressões nos arquivos de log do Windows e geram um arquivo texto com dados das impressões, porém geralmente não geram o nome do arquivo impresso, por causa de uma opção que vem por padrão desabilitada no Windows Server  e geralmente não geram esta informação em tempo real.
Procurando um pouco mais a fundo descobri que é possível ativar uma opção no Windows Server que consegue mostrar o nome do arquivo que foi impresso nos logs. Essa informação nos logs, me instigou a ir atrás de alguma alternativa para fazer um possível controle das impressões mais automatizado.

Este post ficou bem extenso pelo fato de ter que fazer várias configurações, então tenha bastante atenção em seguir os passos corretamente.

Requisitos para funcionamento

Fazer o download dos arquivo “printlog.zip” e salvar na pasta “c:\printlog”. Este arquivo compactado contém os seguintes arquivos:
– printlog.sql (script de criação do banco de dados e da tabelas no MySQL )
– printlog.ps1 (script powershell que vai ler os logs de impressão e fazer a inserção no banco de dados MySQL)
– EventID307_PrintLog.xml (Tarefa do agendador de tarefas com as as devidas modificações)
– microsoft_office_word_forcesetcopycount.ps1 (script powershell para forçar o Microsoft Word à enviar para os logs de impressão o valor correto do número de cópias)

Para editar os arquivos, recomendo que seja utilizado o editor de textos “Notepad++” que pode ser baixado em https://notepad-plus-plus.org/download.

Para o powershell poder interagir com o MySQL é preciso instalar “MySQL Connector/Net” que pode ser baixado em: http://dev.mysql.com/downloads/connector/net/
Não vou abordar a criação do banco de dados no MySQL, então se tiver alguma dúvida procure no Google que existem inúmeros tutoriais.

Após baixar o arquivo printlog.zip e extrair na pasta “c:\printlog”, deve-se editar o arquivo printlog.ps1 e alterar as seguintes variáveis de conexão com o banco de dados MySQL:
$DBAddress, $DBUser, $DBPassword e $DBName.

Primeira parte
É preciso ativar os logs de impressão e também a opção de mostrar o nome do arquivo impresso no log.

Abrir o event viewer e localizar a opção:
Log de Aplicações e Serviços -> Microsoft -> Windows -> PrintService -> Microsoft-Windows-PrintService/Operational

Clicar em propriedades

Marcar a opção “Ativar Logs” e definir o tamanho do log de acordo com a sua estrutura. Deixe a opção “Substituir eventos (quando necessário)”

Acessar o “gpedit.msc” no servidor onde estão instaladas as impressoras e localizar a opção: Configuração do Computador -> Modelos Administrativos -> Impressoras -> “Allow job name in event logs”

Acessar o gerenciador de impressão, em impressoras, clicar em propriedades e na aba “compartilhamento” desabilitar a opção “Processar trabalhos de impressão em computadores cliente”

Em algumas versões do Windows Server pode ser necessário ativar a opção através do registro:[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Policies\Microsoft\Windows NT\Printers]
“ShowJobTitleInEventLogs”=dword:00000001
Caso o nome do documento não apareça nos logs, pode ser necessário a instalação de uma atualização: https://support.microsoft.com/pt-br/kb/2938013

Após realizar os passos acima é preciso realizar algumas impressões e verificar o arquivo de logs para ver se o nome do arquivo está sendo mostrado de acordo com o esperado.

Segunda parte
É preciso anexar uma tarefa ao log dos eventos e passar estas informações para o script powershell, que vai pegar os dados das impressões e salvar no banco de dados MySQL.

Voltando para o visualizador de eventos, na mesma tela onde foi ativado os logs, clicar sobre o EventID 307 e clicar na opção “Anexar Tarefa à este Evento” e configurar conforme as telas abaixo:

Agora é preciso acessar o Gerenciador de Tarefas e procurar a tarefa previamente cadastrada, clicar com o botão direito do mouse em cima da tarefa e clicar em “Exportar” e  salvar em uma pasta qualquer.

Para simplificar, o arquivo printlog.zip contém o XML da tarefa já alterada, então é possível importar esse arquivo diretamente e pular os passos abaixo e ir direto para a “Terceira parte”. Caso tenha algum problema na importação, será preciso seguir os passos abaixo.

Abrir o arquivo com o Notepad++ e abaixo da tag “</Subscription>” incluir as tags conforme abaixo.

Arquivo Original:
<Triggers>
  <EventTrigger>
    <Enabled>true</Enabled>
    <Subscription>&lt;QueryList&gt;&lt;Query Id="0" Path="Microsoft-Windows-PrintService/Operational"&gt;&lt;Select Path="Microsoft-Windows-PrintService/Operational"&gt;*[System[Provider[@Name='Microsoft-Windows-PrintService'] and EventID=307]]&lt;/Select&gt;&lt;/Query&gt;&lt;/QueryList&gt;</Subscription>     
  </EventTrigger>
</Triggers>

...

<Actions Context="Author">
   <Exec>
     <Command>powershell.exe</Command>
   </Exec>
</Actions>



Arquivo Alterado:
<Triggers>
  <EventTrigger>
    <Enabled>true</Enabled>
    <Subscription>&lt;QueryList&gt;&lt;Query Id="0" Path="Microsoft-Windows-PrintService/Operational"&gt;&lt;Select Path="Microsoft-Windows-PrintService/Operational"&gt;*[System[Provider[@Name='Microsoft-Windows-PrintService'] and EventID=307]]&lt;/Select&gt;&lt;/Query&gt;&lt;/QueryList&gt;</Subscription>
    <ValueQueries>
       <Value name="Address">Event/UserData/DocumentPrinted/Param6</Value>
       <Value name="Client">Event/UserData/DocumentPrinted/Param4</Value>
       <Value name="EventID">Event/System/EventID</Value>
       <Value name="FileName">Event/UserData/DocumentPrinted/Param2</Value>
       <Value name="JobBytes">Event/UserData/DocumentPrinted/Param7</Value>
       <Value name="JobID">Event/UserData/DocumentPrinted/Param1</Value>
       <Value name="PageCount">Event/UserData/DocumentPrinted/Param8</Value>
       <Value name="Printer">Event/UserData/DocumentPrinted/Param5</Value>
       <Value name="TimeCreated">Event/System/TimeCreated/@SystemTime</Value>
       <Value name="User">Event/UserData/DocumentPrinted/Param3</Value>
    </ValueQueries>
  </EventTrigger>
</Triggers>

...

<Actions Context="Author">
   <Exec>
     <Command>powershell.exe</Command>
     <Arguments>-command C:\printlog\printlog.ps1 '$(EventID)' '$(TimeCreated)' '$(JobID)' '$(FileName)' '$(User)' '$(Client)' '$(Printer)' '$(Address)' '$(JobBytes)' '$(PageCount)'</Arguments>
   </Exec>
</Actions>


Após feita as alterações no arquivo XML, deve-se excluir a tarefa que foi exportada, clicar com o botão direito do mouse e importar o arquivo XML que foi alterado.

Importada a tarefa novamente, é preciso ajustar alguns parâmetros, para isso selecione a tarefa e clique com o botão direito do mouse em propriedades.
– Na aba Geral, marcar a opção: “Executar estando o usuário conectado ou não” e também “Executar com privilégios mais altos”
– Na aba Condições, desmarcar a opção: “Iniciar a tarefa somente se o computador estiver ligado à rede elétrica”
– Na aba Configurações, alterar a opção: “Se a tarefa já estiver sendo executada,a seguinte regra será aplicada” para “Colocar uma nova instância na fila”

Terceira parte
Se tudo ocorreu bem o script vai gerar um arquivo das impressões em arquivo texto e também no banco de dados MySQL. Agora que os dados estão no banco de dados, basta realizar as consultas de acordo com a necessidade.

Consulta MySQL

Quarta parte
Geralmente as impressões do Microsoft Word quando é utilizado impressão e é marcado a opção para imprimir várias cópias, elas não são contabilizadas corretamente, então é preciso executar o script powershell “microsoft_office_word_forcesetcopycount.ps1” nas estações para forçar que a quantidade de páginas seja gerada da maneira correta.

Considerações Finais
Até onde realizei os os testes, não consegui uma contagem apurada em 100% batendo com a numeração das impressoras, pois segundo minhas pesquisas, os drivers das impressoras e os aplicativos podem interferir nessa contabilização de páginas, além de que os usuários pode ter as impressoras instaladas localmente também.

Fontes consultadas:
http://www.analistadeti.com/print-server-gerar-evento-de-impressao-event-viewer/
https://gallery.technet.microsoft.com/Script-to-generate-print-84bdcf69
http://www.thomasmaurer.ch/2011/04/powershell-run-mysql-querys-with-powershell/
https://blogs.technet.microsoft.com/wincat/2011/08/25/trigger-a-powershell-script-from-a-windows-event/
https://support.microsoft.com/en-us/kb/919736

Facebooktwittergoogle_pluslinkedinFacebooktwittergoogle_pluslinkedinby feather