Рассмотрим один из способов учёта TCP-принтеров, выявим имеющихся неудобства, узнаем, какие для этого знания понадобятся системному администратору.

 

В наше время уже не предоставляется возможным работа фирмы без принтеров и множительно-копировальной техники. Ведь все мы привыкли в считанные секунды получать на бумаге нужные отчёты, акты и договора. Как и любое устройство, принтеры и копиры закреплены за материально ответственным лицом, а, следовательно, они также подлежат инвентаризации. Процесс инвентаризации компьютеров является тривиальным за счёт использования клиент-серверных программ с автоматическим сбором информации (GLPI+OCS Inventory, MS SCCM). Однако отсутствие клиентской части в случае печатающих устройств, приводит к тому, что учет усложняется, а, значит, уточнение количества и месторасположение оргтехники происходит не так уж легко и быстро. Для решения этой задачи, было решено автоматизировать процесс с помощью ПО.

Требования: программа должна осуществлять быстрый сбор данных, отображать инвентарный номер, название отдела, пароль, иметь дружелюбный интерфейс и возможность внесения каких-то заметок, а также экспорт в MS Excel и печать.

По ходу было протестировано несколько платных и бесплатных утилит (O&K Print Watch, SNMP Discovery, PrinterAdmin Print Job Manager, PrintMonitor Pro). Оказалось, что все они основываются на опросе печатающих устройств по SNMP-протоколу и целью их является контроль расходных материалов и мониторинг работы печатающей техники, поля для редактирования отсутствуют. В результате был выбран вариант с использованием продуктов MS Configuration Manager, MS SQL Server и ExtJs. В том числе и потому, что они уже установлены и активно используются в нашей компании.

Рассмотрим дополнительные шаги по настройке нескольких продуктов и написанию небольшого программного кода, которые дают нам удобство по автоматическому опросу сервера печати, удобному отображению полученной информации и её редактированию, отображению в браузере наглядного списка всех сетевых принтеров и их месторасположение, сортировки их по IP-адресу, названию, отделу, номеру кабинета, перехода на веб-интерфейс устройства, экспорта и вывода на печать.

 

Централизованное управление принтерами

Первым шагом нужно один из Windows-серверов сделать сервером печати [https://technet.microsoft.com/ru-ru/library/cc753109%28v=ws.10%29.aspx], что позволит системному администратору иметь централизованное управление принтерами за счёт установки их всех в одном месте и распространения драйверов на клиентские ПК с помощью групповых политик безопасности [https://technet.microsoft.com/ru-ru/library/cc754699%28v=ws.10%29.aspx, http://whisper.org.ua/it/760-razvertyivanie-printerov-v-ad-s-pomoshhyu-gruppovoy-politiki]. Для этого заходим в Server Manager (Управление сервером) → Roles (Роли) → справа жмём кнопку Add roles (Добавить роли) → активируем галочку Print and Document Services (Печать и обслуживание документов) → Next (Далее) → Next (Далее) → Finish (Готово).

Затем инсталлируем все сетевые принтеры на этот сервер. При этом рекомендуется для принтеров давать понятные имена, например, в виде <отдел>-<модель устройства>-<номер кабинета>, buh-canon4500-333.   

После выполнения этих операций, консоль PrintManagement (Управление принтерами) будет иметь список сетевых принтеров и их состояний, версию драйверов и количество документов в очереди печати (см. рис. 1). Но тут имеем одно неудобство – IP-адреса печатающих устройств сразу не видны, для их просмотра нужно заходить в Properties (Свойства) принтера и вкладку Ports (Порты), то есть выполнять дополнительных 2 действия. Ещё один минус – это отсутствие отображения MAC-адресов.

           

Рисунок 1. Список сетевых принтеров.

 

Настройка Configuration Manager

Устанавливаем клиентскую часть SCCM на сервер печати для его дальнейшего опроса. Затем в SCCM-сервере заходим в раздел Administration -> Overview -> Client Settings, вызываем Default Client Settings, находим пункт Hardware Inventory и жмём кнопку Set Classes. В появившемся окне активируем галочки Print Jobs, Printer Device (см. рис. 2), которые как раз и способствуют появлению новых таблиц в БД для хранения собираемой информации.

    

Рисунок 2. Активация таблиц

Отобразить полученную информацию не так уж и трудно. Первый вариант – не требует каких-либо дополнительных знаний - это встроенные в SCCM-сервер отчёты. Второй – немного сложнее – отображение списка с помощью сторонних средств разработки, для которого понадобятся хотя бы базовые знания языка программирования. В нашем случае подходит последний вариант, потому как имеются ещё редактируемые данные, такие как инвентарный номер, название отдела, номер кабинета, пароль принтеров, описание, а с отчётами таких операций проделать нельзя.

Действия по установке, настройке и связке используемых продуктов уже описывались, рассмотрим только дополнительные манипуляции.

 

Работа с базой данных SCCM

При первой же работе с базой данный выявляется большой недостаток – Microsoft не предоставляет какого-либо описания её объектов [http://liashov.com/?p=647], следовательно, здесь пригодятся интуиция, а также метод “научного тыка”, догадок и анализа.

После активации галочек в SCCM-сервере в БД появляются соответствующие таблицы: dbo.PRINT_JOB_DATA (содержит информацию относительно очереди печати), dbo.PRINTER_DEVICE_DATA (включает в себя данные о принтере).

Но при выводе состояния принтера, возникла путаница, потому как информация в некоторых полях записывается не в том виде, как хотелось бы, много полей имеют в названии слово “Status”. Например, в таблице dbo.PRINT_JOB_DATA в поле JobStatus00 значения “Ready” (Готов) или “Offline” (Оффлайн) отсутствуют, а вместо них “NULL” и “UNKNOWN”, также ещё встречается “Degraded”.

В таблице dbo. PRINTER_DEVICE_DATA поля PrinterState00 (является устаревшим), PrinterStatus00 содержат цифровое обозначение состояний очереди печати, например: Other (1), Unknown (2), Idle (3), Printing (4), Warming Up (5), Stopped printing (6), Offline (7). Более подходящим является поле Status00, содержащее в себе обозначения: "OK", "Error", "Degraded", "Unknown", "Pred Fail", "Starting", "Stopping", "Service" и другие. Полное описание и расшифровку значений всех полей можно увидеть на сайте Microsoft в разделе WMI-классов [https://msdn.microsoft.com/en-us/library/windows/desktop/aa394363%28v=vs.85%29.aspx]. На этой же странице есть примечание, что некоторые значения могут попросту не передаваться драйвером.

Пришлось сопоставлять содержимое “статусных” полей с реальными состояниями принтеров в консоли PrintManagement и выявить следующее соответствие: Error – Ошибка, Degraded – Оффлайн, Unknown – Готов. Среди большого перечня полей из таблицы dbo. PRINTER_DEVICE_DATA нам понадобятся следующие:

MachineID – порядковый номер компьютера;

PortName00 – IP-адрес печатающего устройства;

Name00 – имя печатающего устройства;

Status00 – состояние печатающего устройства.

ОС Windows Server 2008 (как и 2008R2) не поддерживает командлет Get-Printer, с помощью которого PowerShеll в Windows Server 2012 выводит список принтеров с состояниями Ready, Offline, Error. В моём случае SCCM-сервер и сервер печати как раз и развёрнуты на системе 2008 года.

И ещё один момент, SCCM не предоставляет данные в реальном времени, поэтому и не стоит придавать большое значение состояниям устройств. Вывод значений этого поля полезно, но лучше обращать на них внимание спустя некоторое время. Конечно, можно увеличить частоту опроса клиентов, но при этом и трафик сети увеличится.

Далее для редактируемых данных необходимо создать в какой-то таблице соответствующие поля: [Inv Nom] типа nvarchar(50), Department типа nvarchar(50), Password типа nvarchar(50), [Nom Kab] типа nvarchar(4), Description типа nvarchar(MAX). После этого переходим к этапу написания простейшего SQL-запроса на выборку, где MachineID = 16777769 соответствует серверу печати. 

SELECT DISTINCT MachineID, PortName00, Name00, Status00, [Nom Kab], [Inv Nom], Password, Department, Description

FROM dbo.PRINTER_DEVICE_DATA

WHERE MachineID = 16777769

При необходимости можно отобразить гораздо больше информации об устройстве, например, DriverName00 (версию драйвера), DefaultPriority00 (приоритет), Location00 (место расположения), InstallDate00 (дату установки), PrintProcessor00 (процессор), PrintJobDataType00 (формат передачи данных) и многое другое. Если подключить ещё таблицу dbo.PRINT_JOB_DATA, то в качестве полезной информации, особенно в случае сбоя, будет вывод данных полей Status00 (состояние очереди), Document00 (названия документа) и Owner00 (логин владельца).

 

Работа с PHP

Работа с веб-приложениями требует наличие настроенного веб-сервера c поддержкой PHP и СУБД - Apache+PHP+MySQL на ОС Linux или IIS+MS SQL Server на Windows. В нашей компании используется первый вариант, потому вопрос о выборе веб-сервера передо мной не стоял. 

Применение PHP нам нужно для осуществления связи между веб-таблицей и базой данных, потому как коннектор (Jason) в ExtJs не умеет соединяться с БД напрямую. Подробнее о настройке коннекторов можно прочитать в статье [].

Настало время добавить редактируемые поля в файлы (которые являются связывающим звеном между MS SQL Server и ExtJs) data.ph) и data_upd.php и применить перекодировку для корректного отображения русских символов в БД и таблице. Для поля Status00 создадим дополнительную проверку, чтобы сделать более наглядное отображение в таблице за счёт изменения цвета состояния принтера. Для примера в листинге выведу только несколько полей.

 Добавление полей в data.php.

while ($row = mssql_fetch_assoc($result)) {

          //применяем перекодировку

$row[Description] = iconv('CP1251','UTF8',$row[Description]);

         //устанавливаем статус и окрашиваем в красный цвет

        if(strcmp($row[Status00],"Error")==0) {

              $row[Status00]="Ошибка";

       $row[Status00]="".$row[Status00]."";}  

// устанавливаем статус и окрашиваем в жёлтый цвет

if(strcmp($row[Status00],"Degraded")==0){

              $row[Status00]="Оффлайн";

              $row[Status00]="".$row[Status00]."";}

// устанавливаем статус и окрашиваем в зелёный цвет

if(strcmp($row[Status00],"Unknown")==0){

              $row[Status00]="Готов";

              $row[Status00]="".$row[Status00]."";}  

$output[]=$row;}

 

 Добавление полей в data_upd.php.

//присвоение переменным новых значений

$Inv_Nom=$params['Inv Nom'];

$Description=iconv('UTF8','CP1251',$params['Description']);

//запись значений поля в БД

$sql="Update dbo.printer_device_data SET

[Inv Nom]='".$Inv_Nom."',

[Description]=N'".$Description."'

Where [Name00]='".$Name00."' ";

 

Работа с таблицей

Все подготовительные действия завершены, осталось собранную и обработанную информацию отобразить в удобном виде. Для этого будет задействована таблица Grid with Live Search Capability фрэймворка ExtJs, доработанная в статье []. Она уже позволяет выделять строку при наведении мыши, редактировать нужные поля по щелчку мыши, искать данные по любому совпадению символов и выделять их жёлтым цветом, экспортировать список в MS Excel, печатать всё содержимое таблицы, обновлять БД.  

В дополнение к имеющемуся функционалу таблицы сделаем содержимое поля PortName00 в виде ссылок. Это будет полезно для перехода из таблицы сразу на веб-интерфейс принтера для его конфигурирования или проверки настроек, минуя действия по копированию/вставке (или набора вручную) IP-адреса устройства в браузер. Для этого нужно в месте, где происходит создание колонки с IP-адресом (в файле Table.js), дописать функцию [http://erum.ru/53.htm], состоящую из 2х строк:

renderer: function(val)

  {     return ''+val+'';   }

где переменная val принимает значения поля PortName00 и нигде её заранее объявлять не нужно.

На этом основные действия завершены. При желании можно уделить немного времени дизайнерской части главной страницы (файл index.html): вставить соответствующие картинки (например,

  ), создать [http://cufon.shoqolate.com/generate/] и подключить нестандартный шрифт для заголовка с помощью преобразователя Cufon, сделать фон плавно перетекающим, задействовав CSS и продукты по работе с графикой. В результате получается небольшая программа с табличным и наглядным веб-отображением сетевых печатающих устройств (см. рис. 3), которую можно подключить к основной программе автоматической инвентаризации.

Рисунок 3. Таблица учёта сетевых принтеров.