Аудит сервера печати. Версия 2

 Статья для настройки аудита сервера печати 2012 R2 с помощью PowerShell и хранением данных в MS SQL Server 2016 (установленном на Linux). Подробное описание всех переменных в предыдущей статье. Создание базы данных и необходимых таблиц в PowerShell:

$SQLServer = "192.168.0.111"
$uid ="SA"
$pwd = "********"
Invoke-Sqlcmd -Query "CREATE DATABASE [PRINT];" -ServerInstance "$SQLServer" -Username $uid -Password $pwd
Invoke-Sqlcmd -Query "USE [PRINT]
CREATE Table LOG
(
UserName varchar(30) NOT NULL,
Printer varchar(30) NOT NULL,
Port varchar(30) NOT NULL,
PrintedTime datetime NOT NULL,
DocumentName varchar(250) NOT NULL,
Pages varchar(11) NOT NULL,
Copies varchar(11),
Size varchar (11) NOT NULL);" -ServerInstance "$SQLServer" -Username $uid -Password $pwd

 Включение отображения в логах имён распечатанных документов:


 Скрипт для чтения и записи всех логов за все дни кроме текущего. Скрипт выполняется на сервере печати. В противном случае, на сервере печати нужно разрешать удалённое чтение логов и добавлять ключ -ComputerName к команде Get-WinEvent. Данный скрипт запускается только один раз при начальной конфигурации:

$SQLServer = "192.168.0.111"
$uid ="SA"
$pwd = "********"
$today = get-date -DisplayHint date -UFormat %Y-%m-%d
Get-WinEvent -FilterHashTable @{LogName="Microsoft-Windows-PrintService/Operational";endtime="$today";id=307} | Foreach {
$event = [xml]$_.ToXml()
if($event)
{
$Time = Get-Date $_.TimeCreated -UFormat "%Y-%m-%d %H:%M:%S"
# $Job = $event.Event.UserData.DocumentPrinted.Param1
$Document = $event.Event.UserData.DocumentPrinted.Param2.ToString().Replace("\","\\")
$User = $event.Event.UserData.DocumentPrinted.Param3
$Port = $event.Event.UserData.DocumentPrinted.Param6
$Printer = $event.Event.UserData.DocumentPrinted.Param5
$Size = $event.Event.UserData.DocumentPrinted.Param7
$Pages = $event.Event.UserData.DocumentPrinted.Param8
Invoke-Sqlcmd -Query "USE [PRINT]; INSERT INTO [LOG] (
UserName,Printer,Port,PrintedTime,DocumentName,Pages,Size) VALUES ('$User','$Printer','$Port','$Time','$Document','$Pages','$Size'

);" -ServerInstance "$SQLServer" -Username $uid -Password $pwd
}
}
Get-WinEvent -FilterHashTable @{LogName="Microsoft-Windows-PrintService/Operational";endtime="$today";id=805} | Foreach {
$event = [xml]$_.ToXml()
if($event)
{
$Time = Get-Date $_.TimeCreated -UFormat "%Y-%m-%d %H:%M:%S"
$Copy = $event.Event.UserData.RenderJobDiag.Copies
Invoke-Sqlcmd -Query "USE [PRINT]; UPDATE [LOG] SET Copies='$Copy' WHERE PrintedTime='$Time';" -ServerInstance "$SQLServer" -Username $uid -Password $pwd
}
}

 Скрипт на чтение логов и запись в базу данных за текущий день, который выполняется на сервере печати каждый вечер в 23:55 (при условии, что в последние 5 минут суток никто печатать не будет):

$SQLServer = "192.168.0.111"
$uid ="SA"
$pwd = "********"
$today = get-date -DisplayHint date -UFormat %Y-%m-%d
Get-WinEvent -FilterHashTable @{LogName="Microsoft-Windows-PrintService/Operational";starttime="$today";id=307} | Foreach {
$event = [xml]$_.ToXml()
if($event)
{
$Time = Get-Date $_.TimeCreated -UFormat "%Y-%m-%d %H:%M:%S"
# $Job = $event.Event.UserData.DocumentPrinted.Param1
$Document = $event.Event.UserData.DocumentPrinted.Param2.ToString().Replace("\","\\")
$User = $event.Event.UserData.DocumentPrinted.Param3
$Port = $event.Event.UserData.DocumentPrinted.Param6
$Printer = $event.Event.UserData.DocumentPrinted.Param5
$Size = $event.Event.UserData.DocumentPrinted.Param7
$Pages = $event.Event.UserData.DocumentPrinted.Param8
Invoke-Sqlcmd -Query "USE [PRINT]; INSERT INTO [LOG] (
UserName,Printer,Port,PrintedTime,DocumentName,Pages,Size) VALUES ('$User','$Printer','$Port','$Time','$Document','$Pages','$Size'
);" -ServerInstance "$SQLServer" -Username $uid -Password $pwd
}
}
Get-WinEvent -FilterHashTable @{LogName="Microsoft-Windows-PrintService/Operational";starttime="$today";id=805} | Foreach {
$event = [xml]$_.ToXml()
if($event)
{
$Time = Get-Date $_.TimeCreated -UFormat "%Y-%m-%d %H:%M:%S"
$Copy = $event.Event.UserData.RenderJobDiag.Copies
Invoke-Sqlcmd -Query "USE [PRINT]; UPDATE [LOG] SET Copies='$Copy' WHERE PrintedTime='$Time';" -ServerInstance "$SQLServer" -Username $uid -Password $pwd
}
}

 Вот так примерно выглядит заполненная база данных:

UserName PrinterName                     PrintersIpAddress PrintedTime              DocumentName                 Pages Copies Size
User1 HP LaserJet 200 color MFP M276 192.168.0.22 2016-12-20 10:03:18.000 Microsoft Word - Document1 2 1 631304
User1 HP LaserJet 200 color MFP M276 192.168.0.22 2016-12-19 11:17:19.000 Microsoft Outlook - Subject 2 1 155984
User2 HP LaserJet 200 color MFP M276 192.168.0.22 2016-12-19 11:16:48.000 Google Translate 2 1 157755
User2 HP LaserJet 200 color MFP M276 192.168.0.22 2016-12-16 17:35:10.000 Invoice 2016.12.13.pdf 1 1 319200
User3 HP LaserJet 200 color MFP M276 192.168.0.22 2016-12-16 17:13:14.000 11-2016.pdf 1 1 459720

 Веб-интерфейс настраивается в моём случае на сервере Linux (там же где установлен MS SQL Server 2016). Так же его можно настроить на любом Веб-сервере.