Введение
В реальной жизни, периодически возникают задачи оценки загруженности принтеров в различных разрезах. В ОС Windows имеются инструменты, позволяющие регистрировать события, связанные с печатью документов, однако их последующая обработка и анализ требуют определенных усилий. С другой стороны, платформа 1С:Предприятие обладает развитыми инструментами для хранения данных и построения отчетов, однако не обладает развитыми средствами для сбора информации, в частности из журналов событий Windows. Таким образом настоящая статья является одним из примеров того, как можно при помощи компонента для работы с PowerShell из 1С совместить плюсы обеих систем для решения практической задачи.
Описание
Пример реализован в виде демонстрационной конфигурации. Функционал примера, может быть протестирован при использовании совместно с продуктивной версией библиотеки для работы с PowerShell либо при использовании тестовой базы online.
ВАЖНО!
Конфигурация в аттачменте НЕ ВКЛЮЧАЕТ компонент для работы с PowerShell. Для получения полной функциональности его нужно приобрести отдельно.
Для упрощения, в качестве примера, все дальнейшие настройки будем производить на локальном компьютере с учетной записью, имеющей права администратора. Протестировать работу online можно при помощи демонстрационной базы.
Настраиваем аудит событий печати
Для того, чтобы события печати начали регистрироваться в журнале событий Windows, необходимо настроить аудит событий печати на сервере печати (в нашем случае в качестве сервера печати используется локальный компьютер).
Включаем журнал аудита событий печати
В оснастке Event Viewer выбираем Applications and Services Logs->Microsoft->Windows->Print Service->Operational.
В панели Action (находится справа) нажимаем Enable Log (см. рис. 1.).
В производственной среде данную настройку можно сделать при помощи групповых политик.
Настраиваем принтеры для генерации событий аудита
В панели управления выбираем Devices and Printers.
Выбираем нужный нам принтер (для тестов используем Microsoft XPS Writer, который установлен по умолчанию) и переходим к его свойствам (прваой кнопкой мыши на принтере->Printer Properties) (см. рис. 2.).
Выбираем вкладку Security и переходим к дополнительным свойствам (кнопка Advanced) (см. рис 3.).
В открывшемся окне переходим на вкладку Auditing и добавляем запись параметров аудита.
В окне добавления записи аудита выбираем пользователя или группу, для которой будет осуществляться аудит (в нашем случае Everyone), выбираем тип событий - Success (успех) и тип разрешений Print (Печать) (см. рис. 4.).
Далее сохраняем сделанные настройки.
Проверка генерации событий аудита
Открываем notepad.
Распечатываем документ на принтере, который мы настроили ранее.
Если все настроено корректно, в журнале Applications and Services Logs->Microsoft->Windows->Print Service->Operational появятся соответствующие события, среди которых будет событие с кодом 307.
Импорт данных в 1С:Предприятие
Как можно увидеть (см. рис. 5.), в событии с кодом 307 есть информация о пользователе, который распечатал документ, компьютере, с которого пользователь осуществлял печать, имени принтера, на который осуществлялась печать, а также количестве распечатанных страниц. В принципе этой информации нам достаточно и теперь, необходимо передать ее в 1С:Предприятие для последующей обработки и анализа.
Возможно несколько вариантов организации импорта, однако в нашем случае мы воспользуемся компонентом для работы с PowerShell из 1С:Предприятие.
Скрипт PowerShell
Недолгий поиск дает нам заготовку скрипта PowerShell, которую мы можем использовать для извлечения необходимых нам событий из журнала Windows (https://gist.github.com/9to5IT/9619820).
Немного модифицировав скрипт под нашу задачу, получим что-то типа:
param
(
$computer,
$EventStartTime,
$EventEndTime
)
if ($EventStartTime -eq $null)
{
$EventStartTime = (([System.DateTime]::Now.addDays(-1)).Date)
}
else
{
$EventStartTime = [System.DateTime]::ParseExact($EventStartTime,'yyyyMMddHHmmss',$null)
}
if ($eventEndTime -eq $null)
{
$eventEndTime = [System.DateTime]::Now
}
else
{
$EventEndTime = [System.DateTime]::ParseExact($EventEndTime,'yyyyMMddHHmmss',$null)
}
$aPrinterList = @()
$Results = Get-WinEvent -Computer $computer -FilterHashTable @{LogName="Microsoft-Windows-PrintService/Operational"; ID=307; StartTime=$EventStartTime; EndTime=$EventEndTime; }
ForEach($Result in $Results)
{
$ProperyData = [xml]$Result.ToXml()
$hItemDetails = New-Object -TypeNamepsobject -Property @{
DocName = $ProperyData.Event.UserData.DocumentPrinted.Param2
UserName = $ProperyData.Event.UserData.DocumentPrinted.Param3
MachineName = $ProperyData.Event.UserData.DocumentPrinted.Param4
PrinterName = $ProperyData.Event.UserData.DocumentPrinted.Param5
PageCount = $ProperyData.Event.UserData.DocumentPrinted.Param8
TimeCreated = $Result.TimeCreated.ToString("yyyyMMddHHmmss") }
$aPrinterList += $hItemDetails
}
return $aPrinterList
Разрешаем удаленное подключение к серверу печати посредством PowerShell
Поскольку скрипт использует удаленное подключение к серверу печати, необходимо разрешить удаленное администрирование сервера печати через PowerShell.
Это можно сделать запустив команду winrm quickconfig из консоли с правами администратора или выполнив командлет Enable-PSRemoting из консоли PowerShell, запущеной с правами администратора.В производственной среде данную настройку можно сделать при помощи групповых политик.
1C:Предприятие
Создаем общий макет и помещаем туда созданный ранее скрипт.
Создаем объекты конфигурации, которые необходимы для хранения полученных данных (см. рис. 6.).
Создаем процедуру импорта данных. Фрагмен ткода, иллюстрирующий работу с компонентом представлен ниже:
// Инициализируем компонент PowerShell
Компонент = PS.ЗагрузитьКомпонент();
Конвейер = PS.СоздатьКонвейерКоманд(Компонент);
Конвейер.ReceiveTimeout = ПолучитьТаймаутЗапроса();
// Получаем текст скрипта PowerShell
Текст =PSСлужебный.ПолучитьТекстИзОбщегоМакета("PSРаботаСПринтерами");
// Формируемпараметры
МассивПараметров = НовыйМассив;
МассивПараметров.Добавить(ПолучитьНаименованиеСервераПечати(СерверПечати));
МассивПараметров.Добавить(Формат(ДатаНачала, "ДФ=yyyyMMddHHmmss"));
МассивПараметров.Добавить(Формат(ДатаОкончания, "ДФ=yyyyMMddHHmmss"));
// Выполняемскрипт
Результаты = PS.ВыполнитьPowerShell(Текст, МассивПараметров, Компонент, Конвейер);
ЕслиPS.БылиОшибки(Компонент, Конвейер) Тогда
Ошибки = PS.ПолучитьОшибки(Компонент, Конвейер);
Попытка
Рез = 1/0;
Исключение
ЕслиТипЗнч(Ошибки.Objects.Object.Property) = Тип("Массив") Тогда
ВызватьИсключениеОшибки.Objects.Object.Property[0].Exception;
Иначе
ВызватьИсключениеОшибки.Objects.Object.Property.Exception;
КонецЕсли;
КонецПопытки;
КонецЕсли;
// Обновляем/добавляемданные
ПринтерыСервер.ОбновитьИнформациюОРаспечатанныхДокументах(СерверПечати, ДатаНачала, Результаты);
// Освобождаемресурсы
PS.ВыгрузитьКомпонент(Компонент);
Тестируем работу online
Создаем демонстрационную базу online.
Задаем таймаут выполнения запроса, равным скажем 300000 (см. рис. 7.). Это максимальное время ожидание ответа от сервера PowerShell в миллисекундах (время работы скрипта).
Создаем элемент справочника Серверы печати (см. рис. 8.).
Распечатываем несколько документов на тестовый принтер.
Запускаем обработку импорта данных.
Смотрим результаты в отчете (см. рис. 9.).