Не знаю по какой причине, но что-то навеяло написать статейку по своей профессиональной сфере.
Одним весенним теплым днем на одном из принтеров руководство обнаружило пол кило распечатанных детских сказок. В общем один гав.юк распечатал и не забрал свое барахло с принтера. Руководство стильно ругалось матом и жестами требуя найти "преступника".
Windows Server 2012 R2 , аудит печати был включен, но в нем не было названия файлов. В общем гав..юк избежал наказания.
1. Создал в реестре переменную ShowJobTitleInEventLogs (REG_DWORD), со значением 1, в ветке реестра "HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows NT\Printers".
Именно с момента сохранения в журнал событий начнут записываться сведения о печати включая имена файлов отправленные на печать, старые записи изменены не будут.
2. Далее создал папку на диске C:\PRNLOG в которой будут сохранены сам отчет и скрипт.
3. Скрипт PowerShell найденный мной в просторах интернета, немного переделал под свои нужды, автору большой респект.
#///////////////////////////////////////////////////////////////////////////////////////////////////////////////
#Получаем текущую дату, она нам понадобиться в названии файла отчета
#///////////////////////////////////////////////////////////////////////////////////////////////////////////////
cls
$CurrentDate = Get-date
$date = $CurrentDate.AddDays(-1)
$yesterday = ($CurrentDate) - (new-timespan -day 1)
#///////////////////////////////////////////////////////////////////////////////////////////////////////////////
# Здесь задаем стиль таблицы в нашем отчете, так как это будет HTML
#///////////////////////////////////////////////////////////////////////////////////////////////////////////////
$a = "<style>"
$a = $a + "BODY{background-color:peachpuff;}"
$a = $a + "TABLE{border-width: 1px;border-style: solid;border-color: black;border-collapse: collapse;}"
$a = $a + "TH{border-width: 1px;padding: 0px;border-style: solid;border-color: black;background-color:thistle}"
$a = $a + "TD{border-width: 1px;padding: 0px;border-style: solid;border-color: black;background-color:PaleGoldenrod}"
$a = $a + "</style>"
#/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
$EventLog = get-winevent -logname "Microsoft-Windows-PrintService/Operational" | Select UserID, TimeCreated, UserName, MachineName, Message, ID
#/////////////////////////////////////////////////////////////////////////////////////////////////////////////
# Цикл для преобразования UserID в UserName
#////////////////////////////////////////////////////////////////////////////////////////////////////////////
$EventLog | ForEach-Object {
$_.UserName = $_.UserID.Translate([security.principal.ntaccount])
#/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#Тут я поленился разбирать сообщение и тупо заменил все не нужное,
# на символ "|"для того? чтобы было удобнее читать отчет
#/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
$_.Message=$_.Message.Replace(","," | ")
$_.Message=$_.Message.Replace(" owned by"," | ")
$_.Message=$_.Message.Replace(" on"," | ")
$_.Message=$_.Message.Replace(" was printed on"," | ")
$_.Message=$_.Message.Replace(" through "," | ")
$_.Message=$_.Message.Replace(". "," | ")
}#///////////////////////////////////////////////////////////////////////////////////////////////////////////////
# Конец основной команды. Отчет сохраняется в C:\PRNLOG в HTML формате
#///////////////////////////////////////////////////////////////////////////////////////////////////////////////
$EventLog | where {$_.ID -eq 307} | ConvertTo-Html -head $a -body "<H2>Print Task</H2>" , Message -As TABLE -Property TimeCreated, UserName, MachineName, Message | Out-File -FilePath "C:\PRNLOG\$($yesterday.ToString("yyyyMMdd")).html"
#/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
# Теперь отчет отправляется по почте по указанному адресу
#/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
$UserFrom="<userFrom@mail>"
$UserTo="<userTo@mail>"
Send-MailMessage -From $UserFrom -To $UserTo -Subject "Print Task" -Body "Print Task" -Attachments "C:\PRNLOG\$($yesterday.ToString("yyyyMMdd")).html" -Priority High -dno onSuccess, onFailure -SmtpServer "your smtp server"
4. Далее была создана задача в Диспетчере Задача которая в заданное время выполняет скрипт.
Одним весенним теплым днем на одном из принтеров руководство обнаружило пол кило распечатанных детских сказок. В общем один гав.юк распечатал и не забрал свое барахло с принтера. Руководство стильно ругалось матом и жестами требуя найти "преступника".
Windows Server 2012 R2 , аудит печати был включен, но в нем не было названия файлов. В общем гав..юк избежал наказания.
И так, что я сделал.
Именно с момента сохранения в журнал событий начнут записываться сведения о печати включая имена файлов отправленные на печать, старые записи изменены не будут.
2. Далее создал папку на диске C:\PRNLOG в которой будут сохранены сам отчет и скрипт.
3. Скрипт PowerShell найденный мной в просторах интернета, немного переделал под свои нужды, автору большой респект.
#///////////////////////////////////////////////////////////////////////////////////////////////////////////////
#Получаем текущую дату, она нам понадобиться в названии файла отчета
#///////////////////////////////////////////////////////////////////////////////////////////////////////////////
cls
$CurrentDate = Get-date
$date = $CurrentDate.AddDays(-1)
$yesterday = ($CurrentDate) - (new-timespan -day 1)
#///////////////////////////////////////////////////////////////////////////////////////////////////////////////
# Здесь задаем стиль таблицы в нашем отчете, так как это будет HTML
#///////////////////////////////////////////////////////////////////////////////////////////////////////////////
$a = "<style>"
$a = $a + "BODY{background-color:peachpuff;}"
$a = $a + "TABLE{border-width: 1px;border-style: solid;border-color: black;border-collapse: collapse;}"
$a = $a + "TH{border-width: 1px;padding: 0px;border-style: solid;border-color: black;background-color:thistle}"
$a = $a + "TD{border-width: 1px;padding: 0px;border-style: solid;border-color: black;background-color:PaleGoldenrod}"
$a = $a + "</style>"
#/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
$EventLog = get-winevent -logname "Microsoft-Windows-PrintService/Operational" | Select UserID, TimeCreated, UserName, MachineName, Message, ID
#/////////////////////////////////////////////////////////////////////////////////////////////////////////////
# Цикл для преобразования UserID в UserName
#////////////////////////////////////////////////////////////////////////////////////////////////////////////
$EventLog | ForEach-Object {
$_.UserName = $_.UserID.Translate([security.principal.ntaccount])
#/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#Тут я поленился разбирать сообщение и тупо заменил все не нужное,
# на символ "|"для того? чтобы было удобнее читать отчет
#/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
$_.Message=$_.Message.Replace(","," | ")
$_.Message=$_.Message.Replace(" owned by"," | ")
$_.Message=$_.Message.Replace(" on"," | ")
$_.Message=$_.Message.Replace(" was printed on"," | ")
$_.Message=$_.Message.Replace(" through "," | ")
$_.Message=$_.Message.Replace(". "," | ")
}#///////////////////////////////////////////////////////////////////////////////////////////////////////////////
# Конец основной команды. Отчет сохраняется в C:\PRNLOG в HTML формате
#///////////////////////////////////////////////////////////////////////////////////////////////////////////////
$EventLog | where {$_.ID -eq 307} | ConvertTo-Html -head $a -body "<H2>Print Task</H2>" , Message -As TABLE -Property TimeCreated, UserName, MachineName, Message | Out-File -FilePath "C:\PRNLOG\$($yesterday.ToString("yyyyMMdd")).html"
#/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
# Теперь отчет отправляется по почте по указанному адресу
#/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
$UserFrom="<userFrom@mail>"
$UserTo="<userTo@mail>"
Send-MailMessage -From $UserFrom -To $UserTo -Subject "Print Task" -Body "Print Task" -Attachments "C:\PRNLOG\$($yesterday.ToString("yyyyMMdd")).html" -Priority High -dno onSuccess, onFailure -SmtpServer "your smtp server"
4. Далее была создана задача в Диспетчере Задача которая в заданное время выполняет скрипт.
5. В качестве $UserTo="<userto@mail>" в скрипте я указал группу рассылки. | ||
НюансыWindows 2012
To enable this option go to:
Start → Server Manager → Tools → Event Viewer .
From here, you will want to expand
Applications and Service Logs , then go to Microsoft → Windows → Print Service → Operational . Then, right click and select Enable log ![]() Windows 2008
To enable this option go to:
Start → Administration Tools → Event Viewer → Applications and Service Logs → Microsoft → Windows → Print Service → Operational Right click and select Enable log
You may want to right click
Если Вы реально хотите добиться снижения расходов на печать, то без профессионального ПО Вам не обойтись.Operational again create a custom view for the print jobs. We suggest you enable all the different information to be logged. |