Раньше мне иногда приходилось сталкиваться с трудноустранимыми неполадками принтеров. Задача осложнялась невозможностью восстановить предыдущие настройки принтеров, поэтому было решено вести журнал всех очередей печати. Журнал особенно полезен, если несколько сотрудников компании имеют право обслуживать и вести диагностику принтеров. Это старшие техники службы поддержки и старшие техники по настольным компьютерам, специалисты первого и второго уровня, которые первыми приступают к устранению неполадок принтеров. Однако если им не удается решить проблему, заниматься ею в конечном итоге приходится мне. Поэтому я подготовил простой сценарий для сбора данных об очереди печати; затем можно сравнить данные о текущем и прошлом состоянии, обнаружить любые изменения и в результате быстрее устранить неполадку.
Общая картина
Помимо 11 серверов печати и множества принтеров, в моей среде имеется чрезвычайно много очередей (более 1000), так как для многих принтеров организовано несколько очередей, некоторые из них с драйверами PostScript, часть с драйверами Printer CL (PCL), а другие — с драйверами, которые могут показаться некорректными, поскольку не соответствуют типу или модели принтера.
Наличие нескольких техников с разным уровнем квалификации приносит компании ряд преимуществ. Но у такой ситуации есть и недостатки. Случалось, что, пытаясь найти неполадку, кто-то изменял настройки очереди печати, а затем не восстанавливал исходные параметры после того, как выяснялось, что изменение не устраняло проблемы. Я также часто обнаруживал, что кто-то изменил драйвер с PostScript на PCL, чтобы распечатать документ пользователя. В случае успешной печати техник предполагал, что все в порядке, но в действительности он создавал новую проблему для пользователей, нуждавшихся в первоначальном драйвере.
Мне встречались принтеры, которые удавалось настроить на выполнение определенных функций только при использовании драйвера от конкурента; драйвер изготовителя оказывался непригодным. Неудивительно, что кому-то это могло показаться ошибкой. Техник заменял драйвер рекомендованным для данного принтера; в результате не могли печатать документы пользователи, нуждающиеся в специализированном драйвере, а техник, к несчастью, не помнил, каким был удаленный драйвер и не мог восстановить его.
Другая проблема, с которой приходится иногда сталкиваться, — переименование очереди печати; обычно это происходит при перемещении принтера. В крупной компании очень трудно координировать перемещения или установку новых принтеров со всеми заинтересованными лицами, поэтому время от времени случаются недоразумения. Еще одна потенциальная проблема: нередко требуется информация о принтере, который вводится в эксплуатацию после длительного периода бездействия.
Как видно, журнал очереди печати в моей компании может быть критически важным ресурсом. При таком количестве принтеров и очередей и возможных изменениях, вносимых в произвольные моменты времени, полезно ежедневно собирать информацию о принтерах. Сотрудникам компаний меньшего размера, вероятно, достаточно собирать данные лишь один раз в неделю или несколько раз в месяц.
План решения
Сначала я подготовил решение для сбора данных об очередях печати с использованием простого сценария VBScript для Windows Management Instrumentation (WMI), который получал сведения от всех серверов печати и записывал их в электронную таблицу Microsoft Excel. Решение довольно успешно применялось для отслеживания изменений; различия можно заметить, просто сравнивая электронные таблицы с различными датами. Но выяснилось, что просмотр многочисленных электронных таблиц в поисках изменений или запись макрокоманд для сравнения — слишком утомительный и неэффективный метод.
В конечном итоге я слегка изменил сценарий, чтобы в дополнение к записи данных в Excel записывать и сохранять данные принтера в базе данных ADO в виде XML-файла. Сохранив информацию в базе данных, легко подготовить сценарий и гораздо быстрее, чем вручную, сравнить данные, собранные в разные дни.
Первый из моих сценариев, запускаемый ежедневно, называется PrinterInfo.vbs; исходный текст приведен в листинге. При выполнении сценария отображается электронная таблица с рабочим листом для каждого сервера печати, рабочего листа ошибок (Error) и итогового листа (Summary). На рабочем листе Summary показаны имена всех серверов печати и общее число очередей печати на каждом из них. Кроме того, на листе указывается количество ошибок, обнаруженных на всех серверах вместе, а также любые различия, отмеченные в ходе предшествующего и текущего запуска сценария, в частности новые и удаленные принтеры, изменения драйверов, изменение местоположения или комментариев и изменения в любых других значимых полях. Каждый рабочий лист принтера содержит сведения об очереди печати для конкретного сервера печати, а на рабочем листе Errors представлены ошибки принтеров, обнаруженные для всех серверов печати. Конечно, при первом запуске сценария сравнительная информация в электронной таблице отсутствует.
Принцип действия PrinterInfo.vbs
Как уже отмечалось, сценарий PrinterInfo использует WMI для сбора информации о принтерах и сохраняет эти данные в базе данных на основе XML с использованием ADO. Ниже приводится список полей сбора данных:
-
PrintShare (объединение PrinterServer и Printer ShareName);
-
PortName;
-
DriverName;
-
PrinterName;
-
Location (как указано в поле Location свойств принтера);
-
DetectedErrorState (возможные ошибки см. в массиве DetErr во фрагменте B листинга);
-
Status (ошибка или OK);
-
Comment (как указано в поле Comment свойств принтера);
-
PrintProcessor;
-
PrinterStatus (список состояний см. в массиве PrtStatus во фрагменте B);
-
BiDirectionalEnabled (истинно или ложно);
-
PrinterState (например, Paper Jam (замята бумага), Out of Paper (нет бумаги); полный список см. в Function PrnState в листинге).
После записи всех текущих данных в электронную таблицу и в базу данных сценарий открывает базу данных, созданную при предыдущем запуске сценария (если она существует) и выполняет поэлементное сравнение, записывая любые различия в электронную таблицу. Сначала сценарий сравнивает самую новую базу данных с предшествующей, чтобы найти новые элементы, затем сравнивает предшествующую с новейшей в поисках элементов, которые можно удалить. Наконец, сравниваются принтеры, существующие в обеих базах данных, чтобы обнаружить различия в важных полях; любые различия между полями рассматриваются как измененные элементы. На экране 1 показан образец листа Summary.
Как PrinterInfo.vbs выполняет свою задачу
Располагая информацией от PrinterInfo.vbs, можно быстро получить точное представление о произошедших изменениях: журнал всех принтеров компании за определенный день и список ошибок позволят обнаружить принтеры, требующие внимания. Процесс, реализованный сценарием, сравнительно прост:
-
Установка переменной DBPath на существующую папку, в которой будут размещены базы данных, как показано в исходном коде фрагмента A листинга. Обратите внимание, что путь в сценарии нужно изменить в соответствии с особенностями конкретной среды.
-
Подготовка массива, состоящего из имен серверов печати, как показано во фрагменте B. Не забудьте изменить сценарий в соответствии с конкретной средой; просто введите все серверы печати в строку массива. Также обратите внимание, что непосредственно под массивом серверов печати организованы массивы для свойств принтеров PrinterStatus и DetectedErrorState, которые возвращают только числа; эти числа преобразуются в связанные текстовые значения через вызовы функций, использующих эти массивы перед записью данных в Excel и базу данных.
-
Задание переменных имен файлов базы данных, как показано во фрагменте C.
-
Создание отключенного набора записей ADO с относящимися к принтеру полями, как показано в исходном тексте фрагмента C.
-
Обход серверов печати и использование WMI для сбора данных и записи информации в Excel и базу данных, как показано во фрагменте E.
-
Подготовка рабочего листа Summary с итоговыми показателями очереди печати и ошибок, как показано во фрагменте F.
-
Переименование PreviousPrnList.xml в ArcPrnListmm-dd-yyyy hhmm-ss и переименование NewestPrnList.xml в PreviousPrnList.xml, как показано во фрагменте G.
-
Сравнение баз данных и запись любых различий в рабочий лист Summary, как показано во фрагменте H.
-
Сохранение текущего отключенного набора записей ADO как NewestPrnList.xml (фрагмент I).
Можно заметить, что во фрагменте C при подготовке к именованию архивного файла базы данных выполняются манипуляции со свойством DateLastModified файла PreviousPrnList с использованием функций ZeroData и MilitaryTime. Этот шаг необходим, чтобы подготовиться ко второму сценарию, который выполняет выборочное сравнение баз данных. Длина имен архивных файлов не должна превышать 31 символ (ограничение, накладываемое на имена рабочих листов в Excel). Второй сценарий, HTML-приложение (HTA) с именем PrinterInfoCompare.hta, назначает рабочим листам имена файлов базы данных XML (без расширения имени файла), что упрощает поиск определенных рабочих листов. Имена архивных файлов имеют формат ArcPrnListmm-dd-yyyy hhmm-ss.xml в соответствии с ограничением длины имени рабочего листа.
Фрагмент hhmm-ss — формат времени Military, в котором используется меньше символов, но с заменой двоеточия на дефис, поскольку в имени файла нельзя использовать двоеточие. Фрагмент mm-dd-yyyy имени файла также изменяется. Эта дата (как и время) получается из метки времени DateLastModified первоначального файла базы данных принтера и обычно не содержит начальных нулей. Чтобы верно рассортировать файлы для сценария HTA, необходимо добавить нули в начале; например, 7/7/2008 превратится в 07/07/2008. Две функции, ZeroDate и MilitaryTime, находятся в конце первого сценария.
Листинги данных и сравнение в PrinterInfoCompare.hta
С течением времени накапливается много архивных файлов, и наступает момент, когда необходимо определить, какие изменения произошли между определенными датами. Благодаря базам данных истории эксплуатации принтера можно увидеть изменения, произошедшие между различными точками во времени. Для этого пригодится PrinterInfoCompare.hta: приложение обеспечивает простой и удобный графический интерфейс для выполнения таких сравнений. Сценарий можно загрузить, нажав кнопку Download the Code Here вверху этой страницы. Как показано на экране 2, в интерфейсе можно:
-
ввести путь или переместиться к папке, в которой находятся базы данных;
-
выбрать базу данных, из которой извлекается листинг данных принтера;
-
выбрать одну или несколько баз данных для сравнения с определенной базой данных.
Обратите внимание на строку заголовка в окне приложения на экране 2: можно получить подсказку, нажав клавишу F1. У каждого из входных элементов на экране интерфейса есть собственный контекстный файл справки, встроенный в приложение. Достаточно поместить курсор в область на экране и нажать клавишу F1, чтобы получить информацию об этой области. На экране 3 показано, как выглядит всплывающая справка; это же всплывающее окно видят пользователи при первом запуске приложения. С помощью флажка Add Sheets в интерфейсе можно подготовить несколько листингов в одной рабочей книге Excel; если флажок снят, выдается информация об отдельных принтерах и сравнительные листинги в отдельных рабочих книгах Excel.
Выберите элемент в верхнем списке и щелкните кнопку ProcessSelected, чтобы получить электронную таблицу со всей информацией о принтерах из выбранной базы данных. Результат будет такой же, как при запуске ежедневного сценария PrinterInfo.vbs. Один из таких отчетов можно подготовить для какого угодно числа элементов в верхнем списке. Если выбран ранее обработанный элемент, сценарий не создает рабочий лист, а открывает рабочую книгу для конкретного рабочего листа.
Чтобы сравнить две базы данных, необходимо сначала установить флажок Compare, чтобы активизировать нижний список. Выберите один элемент из верхнего списка, который будет источником для сравнения, и одну или несколько баз данных из нижнего списка для сопоставления с источником. Щелкните кнопку ProcessSelected для запуска сравнения. После завершения процесса все обнаруженные различия будут представлены в рабочем листе Excel. Если базы данных одинаковы, на рабочем листе появится запись Databases Match. Кроме того, каждая из выбранных баз данных располагает собственным заполненным рабочим листом, который можно открыть и просмотреть информацию о принтерах в конкретной базе данных.
Результаты сравнения представлены в рабочем листе Compare. Сведения о базе данных, выбранной в верхнем списке, отображаются в левом столбце рабочего листа, а информация о сопоставляемой базе данных представлена в среднем столбце; последний столбец содержит сведения о драйвере. При сравнении исходной базы данных с несколькими базами данных необходимо прокрутить рабочий лист Compare вниз, так как сопоставления выполняются последовательно. Как показано на экране 4, имена файлов исходной и сопоставляемой баз данных указаны над каждым листингом сравнения.
На тестах данного приложения HTA выяснилось, что в одной рабочей книге можно подготовить листинги и выполнить сопоставления различных типов, но делать этого не следует из-за сложности восприятия больших объемов данных. Рекомендуется сосредоточиться лишь на нескольких сопоставлениях в рабочих книгах. Не составляет труда подготовить несколько отдельных рабочих книг в приложении. Простое снятие флажка Add Sheets приводит к созданию новой рабочей книги для следующего листинга или сопоставления. Если к новой рабочей книге нужно добавить несколько листингов, достаточно вновь установить флажок Add Sheets перед обработкой дополнительных элементов.
Надеюсь, описанные два сценария будут полезны. Они должны немного облегчить диагностику неполадок принтеров, а также помочь отслеживать изменения и вести информационный журнал.
Джим Тернер (jturnervbs@gmail.com) – системный администратор и разработчик приложений в компании Computer Sciences Corporation
Результаты сравнения нескольких баз данных в PrinterInfoCompare.hta