Централизованный сбор и обработка журналов печати Windows

Централизованный сбор и обработка журналов печати Windows

1160
ПОДЕЛИТЬСЯ

Данную задачку может быть решить без доп ПО используя интегрированные средства управления журнальчиками Windows и скриптом на Powershell. В маленьких кабинетах далековато не постоянно употребляются сетевые принтеры и МФУ, потому получить статистику использования печатающих устройств получить довольно трудно. Тем наиболее , раз это требуется произвести с минимальными затратами. Такие данные сумеют посодействовать найти более активно используемые устройства, оценить нагрузку на их и принять своевременные решения по закупке расходных материалов, техническом обслуживании либо даже подмене на наиболее экономичные и производительные.

Используя поисковые системы можно отыскать готовые программные продукты для аудита печати в кабинете, к примеру:

www.papercut.com/products/free_software/print_logger
www.printaudit.com/print-audit-6.asp
Предлагаю применять для решения задачки интегрированные средства операционной системы Windows 7/2008R2 и скрипты на Powershell. Такие системы далековато не постоянно подступают, так как они требуют покупки, бесплатные версии имеют ограниченную функциональность, нужна установка как центрального ПО на сервер, так и агентов на клиентские компы, некие программы работают лишь с принт-сервером и так дальше.

Итак, примем за начальные данные последующую информацию:

В организации есть домен Active Directory
В организации употребляются компы c операционной системой не ниже Windows 7, сервера – с ОС не ниже Windows Server 2008R2
Есть как сетевые, так и локальные принтеры и МФУ.
Существует необходимость централизовано обрабатывать журнальчики печати с принтеров и иметь статистику использования и перегрузки на печатающие устройства.

Подготовка инфраструктуры
Первым делом нужно приготовить инфраструктуру для централизованного сбора журналов событий с клиентских компов.
Для работы подписки на действия Windows на компе-источнике нужны последующие опции:
Наличие юзера в группе Читатели журнальчика событий (Event Log Readers), от имени которого будет читаться журнальчик
Доступ по удаленному управлению (Windows Remote Management с сервера-коллектора
Настроенное разрешение на пересылку событий на сервер-коллектор логов.
Включенный журнальчик событий печати (выключен по умолчанию)

Создаем в оснастке Юзеры и Компы новейшего юзера, в качестве полного имени и логина указываем EventCollectorUser. Назначаем непростой пароль и ставим галочки «Запретить смену пароля пользователем» и «Срок деяния пароля неограничен».

Дальше создаем на контроллер домена новейшую групповую политику и называем ее, к примеру, GPO-EventCollector.
В политике задаем последующие характеристики:
В разделе «Конфигурация компа — Настройка — Характеристики панели управления — Службы» создаем запись службы «Автозагрузка: Автоматом (отложенный пуск)», «Имя службы — Служба удаленного управления Windows (MS-Management) (WinRM)», «Действие службы: Пуск службы»
В разделе «Конфигурация компа — Политики — Административные шаблоны — Составляющие Windows — Удаленное управление Windows — Служба удаленного управления Windows» задать параметр «Разрешить автоматическую настройку прослушивателей: Включить» и разделе параметра «Фильтр IPv4″ поставить значение «*».
В разделе «Конфигурация компа – Политики – Конфигурация Windows – Характеристики сохранности – Брандмауэр Windows в режиме завышенной сохранности – Брандмауэр Windows в режиме завышенной сохранности – Правила для входящих подключений» создаем новое правило. Избираем пункт «Предопределенные правила» и в перечне избираем «Удаленное управление Windows (HTTP — входящий трафик)»
В разделе «Конфигурация компа — Политики — Административные шаблоны — Составляющие Windows — Пересылка событий» задать параметр «Настроить конечный диспетчер подписки» и в разделе параметра «SubscriptionManagers» вписать полный FQDN путь до сервера–коллектора.
В разделе «Конфигурация компа – Политики – Конфигурация Windows – Характеристики сохранности – Группы с ограниченным доступом» добавляем новейшую группу «Читатели журнальчика событий». В члены группы добавляем сделанного нами юзера EventCollectorUser.

Опосля сотворения групповой политики нужно перезагрузить мотивированные компы либо выполнить на их команду gpupdate /force.

Включить журнальчик печати на мотивированном компе можно через оснастку MMC «Просмотр событий» по пути «Журналы приложений и служб – Microsoft – Windows – PrintService – Работает» (кликнуть правой клавишей мыши на журнальчике и выбрать «включить»). Этот вариант подступает, раз компов не так много.
В случае, раз требуется включить журнальчик на большой группе ПК, то можно пользоваться последующим методом:
К примеру, d:tempcomputers.txt Приготовить текстовый файл со перечнем имен компов.
Запустить последующую команду от имени юзера с правами админа домена:
For /F %i in (d:tempcomputers.txt) do wevtutil sl Microsoft-Windows-PrintService/Operational /e:true /r:%i

Update: Также, как правильно увидел NeSvist, можно установить ключ реестра:
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionWINEVTChannelsMicrosoft-Windows-PrintService/Operational — Enabled равным 1.
Данный параметр можно пораздавать в групповой политике, которую мы сделали выше.
Для справки: О работе с реестром в GPO

Создание подписки на действия
Опосля подготовки инфраструктуры можно перебегать конкретно к настройке подписки на действия на сервере-коллекторе.
Идем в оснастку «Просмотр событий – Подписки».
Избираем справа в меню «Создать подписку…»
Вводим имя подписки, к примеру, «Test Subscription». Добавляем понятное описание.
Так что вариант по-умолчанию остается практически единственным. Дальше избираем журнальчик, в который будут попадать принимаемые действия. Рекомендую бросить все по умолчанию – «Перенаправленные события». Здесь стоит увидеть, что отыскать метод помещать действия в журнальчик, сделанный вручную, мне не удалось.
Клавишей «Проверить» можно проверить доступность мотивированных машин по протоколу удаленного управления, итог покажут в информационном окне. В открывшемся окне клавишей «Добавить» добавляем нужные компы-источники. Дальше щелкаем на кнопочке «Выбрать компы…».
Избираем действия, которые будем собирать с источников. Нас интересует уровень событий «Сведения» из журнальчика «Microsoft-Windows-PrintService/Работает» с кодом событий 307. Все другие опции оставляем по умолчанию.
Щелкаем по кнопочке «Дополнительно», в открывшемся окне избираем пункт «определенный пользователь» и указываем сделанного нами юзера и его пароль. Опции оптимизации доставки событий оставляем в положение «Обычная».
Щелкаем «ОК» и подписка сотворена. При возникновении событий в логе компов-источников, они в течение 15 минут будут загружены на сервер-коллектор в журнальчик «Перенаправленные события».

Скрипт обработки собранных событий
Потому я предлагаю вариант обработки приобретенных событий средствами Powershell для удобства их предстоящего использования. Собранные действия можно выгрузить в формате CSV средствами оснастки «Просмотр событий», но приобретенные данные будут не чрезвычайно информативны и не дозволят на их базе получить увлекательную статистику, которую можно показать управлению.
Поиском на просторах Веба был найден скрипт анализа журналов печати для Windows Server 2003. (http://trevorsullivan.net/2009/11/06/windows-2003-print-log-parsing-script-powershell/) Так как есть определенные различия в командлетах Powershell новейших версий, и метод получения событий различается от предложенного в статье, то скрипт был мной переработан.
Логика работы скрипта последующая: Общую структуру скрипта я поменять не стал, он разбит по функциям, которые просто модифицировать (в случае локализации, к примеру).
Получаем перечень событий из журнальчика
Парсим свойство Message каждого действия и записываем поля в объект PrintJob
Сохраняем приобретенный перечень объектов в формате CSV

Получаем перечень событий из журнальчика «Перенаправленные события» по коду 307 (на вариант, раз в указанный журнальчик пересылаются еще какие-или действия).
Function GetPrintEntriesFromLog()
{
$PrintEntries = get-winevent -FilterHashTable @{LogName=’ForwardedEvents’; ID=307;}
return $PrintEntries
}
Создаем новейший объект PrintJob. Добавляем в него требуемые поля.
Сокрытый текстFunction CreatePrintJob()
{
$PrintJob = New-Object PsObject
Add-Member -Force -InputObject $PrintJob -MemberType NoteProperty -Name PageCount -Value $null
Add-Member -Force -InputObject $PrintJob -MemberType NoteProperty -Name UserName -Value $null
Add-Member -Force -InputObject $PrintJob -MemberType NoteProperty -Name DocumentName -Value $null
Add-Member -Force -InputObject $PrintJob -MemberType NoteProperty -Name Size -Value $null
Add-Member -Force -InputObject $PrintJob -MemberType NoteProperty -Name Printer -Value $null
Add-Member -Force -InputObject $PrintJob -MemberType NoteProperty -Name Time -Value $null
return $PrintJob
}
Вытаскиваем это все из строчки постоянными выражениями. При английском журнальчике меняем строчки в постоянных выражениях на остальные, соответственно. Получаем из характеристики Message действия поля Имя юзера, Имя принтера, Количество написанных страничек в документе, Имя документа.
Сокрытый текст#Парсим характеристики объекта
Function ParsePrintEntry($PrintEntry)
{
$NewPrintJob = CreatePrintJob

$NewPrintJob.PageCount = GetPageCount $PrintEntry.Message
$NewPrintJob.UserName = GetUserName $PrintEntry.Message
$NewPrintJob.DocumentName = GetDocumentName $PrintEntry.Message
$NewPrintJob.Size = GetPrintSize $PrintEntry.Message
$NewPrintJob.Printer = GetPrinterName $PrintEntry.Message
$NewPrintJob.Time = $PrintEntry.TimeCreated.ToString()

return $NewPrintJob
}

#Получаем имя юзера
Function GetUserName($PrintEntry)
{
If ($PrintEntry -eq "" -or $PrintEntry -eq $null) { return $null }
$rxUserName = [regex]"которым обладает ([0-9a-zA-Z.]{1,})"
$rxMatches = $rxUserName.Match($PrintEntry)
return $rxMatches.Groups[1].Value
}

#Получаем имя принтера
Function GetPrinterName($PrintEntry)
{
If ($PrintEntry -eq "" -or $PrintEntry -eq $null) { return $null }
$rxPrinterName = [regex]"распечатан на (.{1,}) через"
$rxMatches = $rxPrinterName.Match($PrintEntry)
return $rxMatches.Groups[1].Value
}

#Получаем размер распечатки в б
Function GetPrintSize($PrintEntry)
{
If ($PrintEntry -eq "" -or $PrintEntry -eq $null) { return $null }
$rxPrintSize = [regex]"Размер в б: ([0-9]+)."
$rxMatches = $rxPrintSize.Match($PrintEntry)
return $rxMatches.Groups[1].Value
}

#Получаем количество страничек (самый принципиальный параметр)
Function GetPageCount($PrintEntry)
{
If ($PrintEntry -eq "" -or $PrintEntry -eq $null) { return $null }
$rxPageCount = [regex]"Страничек написано: ([0-9]+)"
$rxMatches = $rxPageCount.Match($PrintEntry)
return $rxMatches.Groups[1].Value
}

#Получаем имя документа
Function GetDocumentName($PrintEntry)
{
If ($PrintEntry -eq "" -or $PrintEntry -eq $null) { return $null }
$rxDocumentName = [regex]", (.{1,}) которым обладает"
$rxMatches = $rxDocumentName.Match($PrintEntry)
return $rxMatches.Groups[1].Value
}

Ставим шифровку UTF8 для корректного отображения кириллицы и разделитель «;» для читаемого открытия файла в Excel. Получаем перечень событий и в цикле превращаем его в объект PrintJob. Каждые 100 событий пишем лог, это комфортно при отладке. Основная функция. Позже делаем экспорт приобретенного перечня объектов в указанный файл.
Main Function Main()
{
$PrintEntries = GetPrintEntriesFromLog
$Global:ParsedEntries = @{}; $i = 0

ForEach ($PrintEntry in $PrintEntries)
{
$ParsedEntries.Add($i, $(ParsePrintEntry $PrintEntry))
$i++
if ($i % 100 -eq 0)
{ Write-Host "Processed $i records" }
}
$ParsedEntries.Values | Export-Csv "D:PrintReportsPrintUsageReport.csv" -NoTypeInformation -Encoding UTF8 -Delimiter ‘;’
}

#Запускаем главную функцию.
При подготовке постоянных выражений для скрипта употреблялся веб-сайт Regex101.com. Чрезвычайно информативно и комфортно, рекомендуется к употреблению. Веб-сайт понятный, с короткой документацией, подсветкой результата поиска в начальной строке, расшифровкой смысла постоянного выражения на лету.
Приобретенный скрипт можно использовать по требованию, запуская в командной оболочке PowerShell, а можно назначить в качестве задания в Планировщике заданий.
Для этого нужно:
Открыть Планировщик заданий (Запуск – Администрирование – Планировщик заданий)
Выбрать пункт «Создать простую задачку…»
Ввести имя задачки, описание, выбрать интервал выполнения
В качестве программы выбрать «C:WindowsSystem32WindowsPowerShellv1.0powershell.exe», а в качестве аргумента – путь к скрипту. Выбрать действие «запустить программу».
Открыть характеристики задачки и выставить переключатель «Выполнять вне зависимости от регистрации пользователя», выбрать юзера, от имени которого обязана выполняться задачка и ввести пароль от него.

Таковым образом, в указанном при разработке скрипта каталоге будет с данным интервалом обновляться файл со списков написанных документов.

Решение заморочек
Раз при запуске скрипта возникает ошибка вида:
Для получения доп Нереально загрузить файл D:PrintReportsPrintInfo.ps1, так как выполнение сценариев отключено в данной системе.
сведений см. about_Execution_Policies по адресу go.microsoft.com/fwlink/?LinkID=135170.
+ CategoryInfo: Ошибка сохранности: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId: UnauthorizedAccess
это значит, что политика сохранности для исполняемых скриптов Powershell не дозволяет запустить програмку. Для пуска сделанного скрипта нужно снизить уровень сохранности до «Remote Signed», то есть будет разрешено выполнение всех сценариев, сделанных локально, а сценарии, сделанные на удаленных системах, выполняются лишь в том случае, раз подписаны доверенным издателем. Для этого в консоли Powershell, запущенной от имени админа, нужно выполнить команду Set-ExecutionPolicy RemoteSigned.
Эта утилита дозволяет создавать действия вручную в определенном журнальчике. Раз все настроено верно и есть сбор событий из указанного журнальчика, то событие окажется на сервере-коллекторе в течение минутки. Для тестирования пересылки и сбора событий можно применять инструмент командной строчки eventcreate.exe. К примеру, можно сделать событие с ID 100 в логе Приложение при помощи последующей команды: eventcreate /t error /id 100 /l application /d «Custom event».
Раз событие не попало на сервер-коллектор, нужно проверить последующее:

Раз характеристики задавались групповой политикой, то проверить, что политика применяется. При необходимости, можно принудительно применить групповую политику командой gpupdate /force
Эта команда конфигурирует службу WinRM, делает прослушиватель winrm и делает правило исключения брандмауэра. Статус службы Windows Remote Management (WinRM) (Служба удаленного управления Windows). При необходимости на клиентском компе можно сконфигурировать данную службу командой winrm quickconfig. Служба обязана быть запущена и настроена на автоматический пуск.
Для проверки, что сервер-коллектор может соединиться с компом-источником с помощью WinRM можно пользоваться последующей командой: winrm id -remote:<Имя мотивированного компа> -u:<Имя юзера> -p:<Пароль>. Указываются учетная запись и пароль юзера, имеющего возможность подключения по winrm.
Юзер EventCollectorUser заходит в состав группы Читатели журнальчика событий. Лишь члены данной группы могут читать действия на определенном компе.

Что можно сделать лучше
Предложенный скрипт обработки не является всепригодным решением и может быть улучшен в разных направлениях, к примеру,

Подборка событий по времени (за день, недельку, месяц) и запись их в надлежащие отдельные листы электронной таблицы либо выходные CSV-файлы. Можно предугадать задание спектра дат при помощи входных характеристик скрипта.
Добавление графического представления данных с внедрением сводных таблиц по юзерам и печатающим устройствам и графиков. Таковой отчет можно сходу класть на стол руководителю.
Настроить архивирование и ротацию журнальчика «Перенаправленные события», добавить функцию анализа соответственных архивных файлов. Это будет уместно при работе с довольно огромным числом компов (наиболее 50).

Итак, в данной статье я постарался показать принцип централизованного сбора событий с журналов Windows и их предстоящей обработки средствами Powershell. Данный метод подступает для решения задачки в маленьких организациях. Очевидно, спец программное обеспечение справляется с поставленными целями наиболее отлично, но оно недешево, наиболее громоздко, его установка приносит IT-спецу меньше новейших познаний и способностей, осознания работы обслуживаемого им программного обеспечения.

При подготовке данной статьи были применены последующие материалы и источники:
mcp.su/windows-server-2008/event-collector-in-windows-server-2008
windowsnotes.ru/powershell-2/nastrojka-udalennogo-vzaimodejstviya-v-powershell-chast-1
social.technet.microsoft.com/Forums/en-US/8e7399f6-ffdc-48d6-927b-f0beebd4c7f0/enabling-print-history-through-group-policy?forum=winserverprint
mywinsysadm.wordpress.com/2012/07/16/powershell-audit-printer-event-logs
www.winblog.ru/admin/1147767392-29031101.html
windowsitpro.com/security/q-what-are-some-simple-tips-testing-and-troubleshooting-windows-event-forwarding-and-collec
habrahabr.ru