Журнал Системный Администратор, Октябрь 2003

Журнал Системный Администратор

Октябрь 2003

Цена: $4.5 US

  Подписаться

Зарегистриванные пользователи, пожалуйста следуйте этой ссылке

Версия для печати Вернуться к оглавлению

Управление сетевыми принтерами домена

Иван Коробко

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

Предлагается решение, созданное на основе ASP, особенностью которого является динамичность. Выбор ASP обусловлен его возможностью работать с OLE-объектами и требованием динамичности.

Для воплощения данного решения была использована библиотека интерфейса службы активного каталога (Active Directory Service Interface – ADSI), которая позволяет управлять пространством имен Microsoft Windows 2000.

ADSI выпущен в 1997 году корпорацией Microsoft. ADSI поддерживает пространства имен LDAP, WinNT, IIS, NDS. В работе используются пространства имен LDAP и WinNT. Пространство имен LDAP используется для чтения текущего домена, соответственно списка опубликованных в них принтеров и поля AD. Протокол WinNT используется для работы управления принтерами и очередями печати.

Файловая структура проекта

Инструмент представляет сайт, точкой входа в который является страница на языке HTML. Сайт создан на основе окон (Frameset): файл default.htm делит окно браузера на два столбца. Текст файла default.htm (HTML):

<HTML>

<HEAD>

<!-- Левый столбец составляет 30% от ширины всего окна. Левое окно имеет идентификатор "main", второе "var".  -->

<TITLE>Список доступных сетевых принтеров </TITLE>

<META HTTP-EQUIV ="Content-Type" CONTENT="text/html; CHARSET=windows-1251">

</HEAD>

<FRAMESET cols="30%,*" FRAMEBORDER="5" BORDER="yes" FRAMESPACING="5" >

<FRMAE SRC="printer_adsi.asp?radGrp=1&Search_Text=" NAME="main" SCROLLING="yes" МАRGINHEIGHT=1 >

<FRAME SRC ="about:blank" NAME="var">

</FRAMESET >

</HTML>

Остальные страницы взаимосвязаны друг с другом и являются рекурсивными. Обе страницы написаны на ASP. Для создания обеих страниц был выбран VBScript. VBScript выбран потому, что является языком, поставляемым с Microsoft Windows; обладает необходимыми возможностями для реализации данного проекта, имеет простой синтаксис.

Каждый из ASP-файлов состоит из трех частей, которые взаимосвязаны друг с другом: WinNT, LDAP, HTML.

LDAP

В разделе LDAP рассмотрены следующие вопросы: определение доступного домена; построение запроса SQL; поиск опубликованных принтеров в AD; чтение полей принтеров.

Определение имени текущего домена

Название текущего домена определяется с помощью функции GetObject. Используя функцию GetObject, можго прочитать корень пространства имен, т.е. текущий домен.

Пример определения текущего домена (VBScript):

SET  rootDSE_ = GetObject("LDAP://RootDSE")

domain_ = "LDAP://" + rootDSE_.Get("defaultNamingContext")

Переменная domain_ имеет вид «dc=microsoft,dc=com», если домен «microsoft.com».

Имя текущего домена, полученного с помощью протокола WinNT, нельзя использовать, поскольку с помощью протокола WinNT, можно получить только сокращенное имя домена (в данном случае «Microsoft»). При указании сокращенного имени в строке с SQL-запросом произойдет ошибка. В сообщении, которое выведет браузер, будет указано, что путь к базе ошибочен, и базу невозможно открыть.

Построение запроса SQL

Запрос SQL используется для осуществления процедуры поиска объектов при заданном типе объекта.

В общем случае запрос SQL выглядит следующим образом:

SELECT поле_1, поле_2, …, поле_n FROM "LDAP://dc=домен_1,dc=домен_2…,domen_n" WHERE objectClass='тип_объекта'

В поле SELECT указываются поля, по которым идет выборка. Поля перечисляются через запятую, «пробелы» после запятой обязательны. Полный список полей объектов AD можно получить с помощью утилиты ADSI Edit, которая размещается в дистрибутиве Microsoft Windows 2000 в директории /Support/Tools.

В поле FROM указывается путь к объекту. В данном случае известен только домен. Пробелы в данном поле недопустимы.

В поле WHERE указывается тип объекта, к которому адресован запрос. Данное поле является фильтром. Протокол LDAP имеет несколько типов объектов, которые в запросе SQL определяются переменной objectClass: PrintQueue – массив принтеров, опубликованных в AD; Group – группы, созданные в AD; User – пользователи, созданные в AD; Computer – массив компьютеров, зарегистрированных в AD. Пример использования запроса SQL см. в разделе «Поиск опубликованных принтеров в AD».

«Поиск опубликованных принтеров в AD»

Для поиска объектов в AD с помощью протокола LDAP используется ADODB-соединение. После создания соединения формируется SQL-запрос и осуществляется поиск в соответствии с запросом. Результатом поиска является массив, который содержит значения полей, указаных в параметре SELECT SQL-запроса. Затем происходит вывод данных на экран. В приведенном примере осуществляется поиск всех опубликованных принтеров в текущем домене и вывод на экран названия принтера и его сетевого имени (VBScript):

Set objConnection = CreateObject("ADODB.Connection")

Set objCommand = CreateObject("ADODB.Command")

objConnection.CommandTimeout = 120

objConnection.Provider = "ADsDSOObject"

objConnection.Open "Active Directory Provider"

Set objCommand.ActiveConnection = objConnection

objCommand.CommandText = "SELECT printername, printsharename FROM '"&domain_&"'  WHERE objectClass='printQueue'"

objCommand.properties("Timeout")=30

objCommand.properties("Cache Results")=false

Set st = objCommand.Execute

st.Movefirst

On Error Resume Next

Do Until st.EOF

    printer_name=St.Fields("PrinterName").Value

 

shares_enum=""

    shares=St.Fields("printsharename").Value

    for each share in shares

    shares_enum=shares_enum+share

    next

Response.write printer_name & shares_enum & chr(13)

  st.MoveNext

Loop

В Active Directory объектом класса printQueue является принтер. Данный объект имеет свойства, значение которых может быть двух типов: строкой и массивом. В приведенном примере значение, содержащее название принтера, является строкой, содержащее сетевые имена принтеров, является массивом.

Ниже приведена таблица, с названиями часто используемых полей, соответствующий им тип данных, описание полей и общий формат данных, находящихся в этих полях:

Поле

Описание

Тип

Пример

CanonicalName

Классический путь к принтеру, как в проводнике AD

Array

Domain.ru/Department/PrinterName

cn

Значение cn для принетра

String

Server-PrinterName

Description

Описание принтера

Array

Принтер формата __ находится

в __ отделе

DistinguishedName

Путь к принтеру в формате протокола LDAP

String

CN=PrinterName, OU= Department, DC=Domain, DC=ru

driverName

Название драйвера, установленного на принтере

String

HP 1200 Printer Driver PCL

driverVersion

Версия драйвера

String

4

Location

Физическое место размещения принтера

String

2 эт., 10 комн.

Name

Название принтера  (название, которо видит пользователь)

String

Server - PrinterName

PortName

Название порта принтера

Array

IP_xxx.xxx.xxx.xxx

PrintColor

Описание цветности принтера

String

True/False

PrinterName

То же, что и Name

String

PrinterName

PrintLanguage

Языки, поддерживаемые принтером

Array

PostScript, TrueType

PrintMaxResolutionSupported

Максимальное разрешение, выдаваемое принтером в dpi

String

1200

PrintMediaReady

Форматы лотков, которыми снабжен принтер

Array

A3, A4

PrintMemory

Количество памяти, встроенной в принтер (в байтах)

String

9082

PrintPagesPerMinute

Скорость печати в минуту

String

12

PrintShareName

Имя принтера для подключения

Array

Printer

ServerName

Полное имя сервера,

к которому подключен принтер

String

Server.Domain.Ru

ShortServerName

Краткое имя cервера

String

Server

uNCName

Путь в формате UNC

String

\\Server.Domain.ru\PrinterName

url

URL-путь к принтеру

Array

http:\\Server.Domain.ru\PrinterName

WhenCreated

Дата публикации принтера

в AD

String

Дата включает в себя время, число, месяц и год

WhenChanged

Дата последних изменений

в принтере в AD

String

WinNT

С помощью протокола WinNT осуществляется подключение к локальному принтеру; чтение настроек и параметров принтера; управление принтером; чтение и управление очередью печати принтера.

Подключение к локальному принтеру

Для подключения к принтеру в текущем домене необходимо знать два параметра – название компьютера, к которому подключен принтер, и название принтера. Поскольку принтеры сетевые, то имя компьютера, к которому подключены принтеры, является именем сервера печати (Print Server). Именем принтера является его сетевое имя (Share Name). Оба эти параметра определяются с помощью протокола LDAP. Синтаксис строки подключения в общем виде выглядит следующим образом:

Set pq = GetObject("WinNT://" & server_name & "/" & shares_enum)

где serve_name – имя сервера печати, а shares_enum – сетевое имя принтера.

Для получения доступа ко всем доступным принтерам и их очередям печати протокол WinNT совместно используется с протоколом LDAP (VBScript):

Set st=objconnection.execute("SELECT shortservername, printsharename, FROM '" & Domain_ & " '  WHERE objectClass='printQueue'" )

 

Do Until st.EOF

 

           shares_enum=""

           shares=St.Fields("printsharename").Value

                 for each share in shares

                 shares_enum=shares_enum & share

                 next

server_name=St.Fields("ShortServerNAme").Value

Set pq = GetObject("WinNT://" & server_name & "/" & shares_enum)

    st.MoveNext

Loop

Чтение настроек и параметров принтера

Чтение настроек с помощью протокола WinNT осуществляется с помощью элементов массива объекта, вызванного с помощью функции GetObject :

Set pq = GetObject("WinNT://" & server_name & "/" & shares_enum)

pq.name

 

Элемент

Тип данных

Описание элемента

DataType

String

Тип данных, поддерживаемый принтером

Default Priority

String

Приоритет по умолчанию

Description

String

Описание принтера

Location

String

Расположение принтера

Model

String

Модель принтера

Name

String

Название принтера

PrintDevices

String

Название устройства печати

PrinterPath

String

Путь к принтеру

PrintJobs

Array

Очередь печати (см. раздел «Чтение и управление очередью печати принтера»)

Status

String

Состояние принтера. Обозначается числом:

0 – Ready, 1 – Pause, 18 – Error.

UntilTime

String

Оставшееся время печати

В приведенном примере name является членом массива pq. По типу данных членом массива могут быть строки и массивы. Выше приведены часто используемые элементы массива, соответствующие элементам типы данных и описания элементов:

Управление принтером

Управление принтером также осуществляется с помощью элементов массива объекта, вызванного с помощью функции GetObject. Элементы массива содержат не только строки и массивы, но и команды:

Элемент

Тип данных

Описание элемента

Pause

Команда

Приостановить работу принтера

Purge

Команда

Удалить все задания из очереди печати

и переинициализировать принтер

Resume

Команда

Восстановить работу принтера

Приведем пример использования одной из команд (VBScript):

Set pq = GetObject("WinNT://" & server_name & "/" & shares_enum)

pq.purge

Чтение и управление очередью печати принтера

Очередь печати представляет собой массив, содержащий в себе задания, которые находятся в очереди печати на момент извлечения из нее данных с помощью протокола WinNT. Массив очереди печати является элементом массива, получаемого с помощью функции GetObject. Он содержит элементы, список которых приведен в таблице. Все элементы представляют собой строки:

Элемент массива

Описание элемента

Description

Описание задания

Priority

Приоритет задания

Size

Размер задания в байтах

StartTime

Время начала печати

Status

Статус задания. Выражается числом

TimeSubmited

Время, оставшееся до окончания печати

TotalPages

Общее количество страниц в задании

UntilTime

Время окончания печати

User

Пользователь, пославший документ на печать

Пример, в котором читаются поля и выводятся на экран (ASP):

Set pq = GetObject("WinNT://" & server_name & "/" & shares_enum)

For Each printJob In pq.PrintJobs

status_pre=printJob.status

 

select case status_pre

case "0" status_="Нормально"

case "1" status_="Пауза"

case "18" status_="Ошибка"

end select

 

number_docum=number_docum

summary = summary & "Номер докумета: " & number_docum & chr(13) & chr(13) & "Статус: " & status_pre & chr(13) & "Приоритет: " & printJob.Description & chr(13) & "Пользователь: " & printJob.User & chr(13) & "Всего стр. " & printJob.TotalPages & chr(13) & "Размер, (Mb) " & round(printJob.Size/1000000,2) & chr(13) & "Статус: " & status_pre & chr(13) & chr(13)

 

Next

Wscript.Echo summary

Управление очередью осуществляется тем же способом, что и управление принтером. Существует три команды, которые могут быть использованы для управления документом, находящимся в очереди печати:

Элемент

Тип данных

Описание элемента

Pause

Команда

Приостановить печать задания

Remove

Команда

Удалить задание из очереди печати

Resume

Команда

Восстановить печать задания

Пример, в котором удаляется второе задание из очереди печати. Если такого нет, то ошибка обрабатывается с помощью выражения «On Error Resume Next» (VBScript):

On Error Resume Next

Set pq = GetObject("WinNT://" & server_name & "/" & shares_enum)

For Each printJob In pq.PrintJobs

If (number_docum=2) then

printJob.remove

end if

number_docum=number_docum

Next

HTML

Раздел HTML обеспечивает применение таблицы стилей и установку необходимой таблицы кодировки шрифта для графического оформления проекта, автоматическое обновление страниц; взаимодействие страниц, основанное на передаче форм с помощью метода POST; поиск по заданным критериям.

Таблица стилей и выбор кодировки страницы

Обе ASP-страницы используют таблицу стилей и работают в кодировке WIN-1251. Стили описываются в подключаемом файле style.css:

H4 {font-size:11; font-family:Arial;}

H5 {font-size:10; font-family:Arial;}

H6 {font-size:9; font-family:Arial;}

Файл стилей указывается в разделе LINK, необходимая кодировка – в разделе META (HTML):

<HEAD>

<LINK HREF="style.css" TYPE=text/css REL=stylesheet>

<META HTTP-EQUIV ="Content-Type" CONTENT="text/html; CHARSET=windows-1251">

</HEAD>

Параметр CHARSET отвечает за выбор кодировки, в которой будет отображаться документ.

Автоматическое обновление страниц

Особенностью проекта является его динамичность, которая достигается автоматическим обновлением страниц через определенный промежуток времени. Обновление обеих страниц происходит с частотой, которая указывается пользователем. Определение времени автоматического обновления является эвристической операцией. Рекомендуется использовать время автоматического обновления от 5 до 10 секунд. Время обновления указывается в разделе META (HTML):

</HEAD>

< META HTTP-EQUIV ="refresh" CONTENT=10 >

</HEAD>

Параметр CONTENT отвечает за временной интервал обновления страниц. Время указывается в секундах.

Взаимодействие страниц

Взаимодействие страниц основано на передаче форм, содержащих данные, методом GET.

Передача данных осуществляется с помощью двух методов: прямого и косвенного.

Прямой метод:

В исходной странице создается форма, которая содержит поля для ввода информации и кнопку для отправки информации и загрузки страницы, принимающей данные (HTML):

<FORM ACTION="printer_adsi.asp" TARGET="main" METHOD="get">

     <INPUT TYPE="submit" VALUE="Поиск"></INPUT>

     <INPUT  NAME="Search_Text"></INPUT>

</FORM>

В разделе FORM присутствуют следующие параметры: ACTION, TARGET, METHOD. В параметре ACTION указывается файл, в который будут передаваться данные после нажатия на кнопку.

Подразделом, который обязательно присутствует в разделе FORM, является INPUT. INPUT имеет следующие параметры: TYPE, NAME, VALUE. Параметр TYPE определяет вид приемника информации: кнопка (TYPE=«submit» или «reset»); окно для ввода текста (TYPE=«text»), значение по умолчанию; кнопка выбора одного параметра из группы (TYPE=«radio»). VALUE – название поля, отображаемое в объекте. NAME – имя, которое участвует в формировании запроса.

Запрос, который формируется с помощью метода GET, в общем виде выглядит следующим образом:

http://имя_страница.asp(htm)?П1=З1&П2=З2&...Пn=Зn

В приведенной строке присутствуют следующие обозначения: П – параметр, З – значение.

В используемом примере данная стока будет выглядеть следующим образом:

http://printer_adsi.asp?Search_Text=HP

если в стоке было введено «HP».

Рассмотрим «страницу-приемник»: для получения переданных принимающей странице данных необходимо прочитать запрос и присвоить переданные значения переменным. Данная операция, опираясь на приведенный пример, осуществляется следующим образом:

set s_p_r= Request.QueryString("Search_Text")

Таким образом, параметр s_p_r=«HP».

Прямой метод используется для осуществления поиска.

Косвенный метод:

Косвенный метод используется для передачи данных из одной ASP-страницы в другую. Он основан на том, что при нажатии пользователем на картинку или текст, являющийся ссылкой, сразу формируется запрос, который передает данные.

Поскольку очередью принтера невозможно управлять, если принтер рассматривать как сетевое устройство, то использование протокола LDAP становится невозможным.

Для доступа к очереди принтера, как ранее отмечалось, используется протокол WinNT. Для использования протокола необходимо передавать 2 параметра: сетевое имя принтера (Share Name) и название окна (Frame), в котором необходимо вывести данную страницу. Опираясь на приведенные ранее примеры, данные будут передаваться на страницу View_Printer.asp, запрос будет иметь следующий вид (ASP):

<% <A HREF=" & chr(34) & "View_Printer.asp?Printer_to=" & printer_name & chr(34) & " target=" & chr(34) &"var"& chr(34) & " > <IMG SRC =images\pr1.jpg BORDER=0> </A> %>

Из-за особенностей ASP необходимо прибегать к обозначению кавычек функцией chr(34).

Подробнее о передаче данных будет рассказано в разделе, посвященном WinNT.

Поиск по заданным критериям

Поиск базируется на использовании фильтра. Перед осуществлением поиска пользователь выбирает критерий поиска, словосочетание для поиска и нажимает кнопку «Поиск», которая формирует запрос и загружает страницу. В качестве критерия может быть выбран один из параметров: «Название», «Описание», «Размещение». По умолчанию принято значение «Название». Выбор значения по умолчанию осуществляется меткой CHECKED в соответствующем разделе INPUT. Форма на странице-отправителе выглядит следующим образом (HTML):

<FORM ACTION="printer_adsi.asp" TARGET="main" METHOD="get">

     <INPUT TYPE="submit" VALUE="Поиск"></INPUT>

     <INPUT  NAME="Search_Text"></INPUT>

<BR>