Рассмотрим один из способов учёта 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. В том числе и потому, что они уже установлены и активно используются в нашей компании. Опираясь на опыт из статьи [], рассмотрим, какие дополнительные шаги требуется ещё пройти для достижения нужного результата.

 

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

Первым шагом нужно один из 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 (логин владельца).

 

Продолжение следует...