Класс установки устройств принтер
Классы настройки устройств являются еще одним типом идентификаторов, использующихся для установки устройств. Производитель устройства указывает его класс в пакете драйверов. Классы настройки устройств определяют группы устройств, установка которых производится одинаково. Например, все приводы компакт-дисков принадлежат классу CDROM, и для их установки используется один и тот же совместный установщик. Каждый класс устройств определяется числом, называющимся глобальным уникальным кодом (GUID). При запуске ОС Windows в оперативной памяти создается древовидная структура, содержащая коды GUID всех обнаруженных в системе устройств. Помимо кода GUID класса устройства при необходимости Windows может добавить в эту структуру код GUID шины, к которой подключено данное устройство.
Когда Вы используете классы настройки для того, чтобы разрешить или запретить пользователям установку драйверов устройств, Вы должны указать коды GUID для всех классов устанавливаемых устройств. В противном случае Вы можете не получить желаемых результатов – установка может завершиться неудачно, в то время, когда предполагалось обратное, и наоборот.
Например, многофункциональное устройство, совмещающее в себе функции сканера, факса и принтера, может иметь основной код GUID, код GUID функции принтера, код GUID функции сканера и так далее. Коды GUID отдельных функциональных компонентов являются "дочерними элементами" кода GUID многофункционального устройства. Для установки дочерних элементов ОС Windows должна иметь возможность установить родительский элемент. Поэтому для разрешения установки любого класса устройств с дочерним кодом GUID (функции принтера и сканера) Вы должны разрешить установку класса многофункционального устройства, который имеет родительский код GUID.
Для получения дополнительной информации обратитесь к разделу Классы настройки устройств Device Setup Classes (EN) на веб-узле MSDN.
В данном руководстве не рассматриваются сценарии с использованием классов настройки устройств. Тем не менее, рассматриваемые здесь основные принципы работы с идентификаторами оборудования также применимы и к классам настройки устройств. После того, как Вы определите класс устройства, Вы можете использовать его при работе с групповыми политиками, запрещая или разрешая установку драйверов устройств, принадлежащих этому классу.
    Все современные компьютерные устройства имеют уникальные аппаратные идентификаторы ( PnP ID или просто ID ), в которых указываются производитель ( Vendor ID) , тип и класс устройства (Device ID). Идентификатор устройства может быть считан программно и является исходной информацией для привязки соответствующего драйвера к данному устройству. Идентификатор устройства можно посмотреть в диспетчере устройств, выбрав ”Свойства” - ”Сведения” - ”ИД оборудования”. Например, для стандартного контроллера AHCI :
Этот идентификатор относится к устройству на шине PCI , производства Intel (VEN_8086), которое относится к контроллерам жестких дисков (DEV_8C02). Остальные данные идентификатора (SUBSYS_78211462…) могут описывать некоторые особенности устройства, которые могут учитываться при его оптимальном использовании (например, версия прошивки). При установке драйвера устройства используется специальные INF-файлы, в которых содержится информация об идентификаторе, файлах драйвера и классе устройства.
; Copyright (c) Microsoft Corporation. All rights reserved.
[Version]
Signature="$WINDOWS NT$"
Class=hdc
ClassGuid =
Provider=%MS%
DriverVer=06/21/2006, 6.1.7601.17514
[SourceDisksNames]
3426=windows cd
Символ точки с запятой ( ; ), в inf-файлах используется в качестве признака начала поля комментария. Строка символов, заключенная в квадратные скобки указывает на секцию inf-файла, которая может содержать один или несколько параметров. Как минимум, в inf-файлах присутствуют параметры, определяющие операционную систему, для установки в которую предназначен драйвер, класс устройств, который должен обслуживать данный драйвер, имена файлов драйвера и аппаратные идентификаторы устройств (ИД оборудования), которые обслуживаются данным драйвером.
В представленном выше примере, приведены фрагменты inf-файла для стандартного дискового SATA контроллера, который может обслуживать несколько десятков устройств разных производителей, объединенных в класс контроллеров жестких дисков ( Class=hdc ) с глобальным уникальным идентификатором ClassGuid= .
Каждое устройство в среде операционных систем семейства Windows принадлежит к какому-либо классу – контроллеров жестких дисков, видеоадаптеров, сетевых карт и т.п. Каждому классу соответствует глобальный уникальный идентификатор - Globally Unique Identifier (GUID) . Обозначается GUID в виде наборов шестнадцатеричных цифр, разделяемых дефисами для удобства записи, и заключенными в фигурные скобки.
Перечень GUID классов стандартных устройств Windows
Class | ClassGUID | Описание устройства |
---|---|---|
CDROM | 4D36E965 - E325 - 11CE - BFC1 -08002BE10318 | CD/DVD/Blu-ray drives |
DiskDrive | 4D36E967 - E325 - 11CE - BFC1 - 08002BE10318 | Hard drives |
Display | 4D36E968 - E325 - 11CE - BFC1 - 08002BE10318 | Video adapters |
FDC | 4D36E969 - E325 - 11CE - BFC1 - 08002BE10318 | Floppy controllers |
FloppyDisk | 4D36E980 - E325 - 11CE - BFC1 - 08002BE10318 | Floppy drives |
HDC | 4D36E96A - E325 - 11CE - BFC1 - 08002BE10318 | Hard drive controllers |
HIDClass | 745A17A0 - 74D3 - 11D0 - B6FE - 00A0C90F57DA | Some USB devices |
1394 | 6BDD1FC1 - 810F - 11D0 - BEC7 - 08002BE2092F | IEEE 1394 host controller |
Image | 6BDD1FC6 - 810F - 11D0 - BEC7 - 08002BE2092F | Cameras and scanners |
Keyboard | 4D36E96B - E325 - 11CE - BFC1 - 08002BE10318 | Keyboards |
Modem | 4D36E96D - E325 - 11CE - BFC1 - 08002BE10318 | Modems |
Mouse | 4D36E96F - E325 - 11CE - BFC1 - 08002BE10318 | Mice and pointing devices |
Media | 4D36E96C - E325 - 11CE - BFC1 - 08002BE10318 | Audio and video devices |
Net | 4D36E972 - E325 - 11CE - BFC1 - 08002BE10318 | Network adapters |
Ports | 4D36E978 - E325 - 11CE - BFC1 - 08002BE10318 | Serial and parallel ports |
SCSIAdapter | 4D36E97B - E325 - 11CE - BFC1 - 08002BE10318 | SCSI and RAID controllers |
System | 4D36E97D - E325 - 11CE - BFC1 - 08002BE10318 | System buses, bridges, etc. |
USB | 36FC9E60 - C465 - 11CF - 8056 - 444553540000 | USB host controllers and hubs |
Существующий в конкретной операционной системе, набор драйверов, определяется содержимым каталога C:\Windows\ System32\ DriverStore\ FileRepository\ . Так, например, файлы необходимые для установки стандартного дискового контроллера Microsoft, хранятся в папке, имя которой начинается с mshdc.inf_ . Примерный список файлов для Windows 7:
aliide.sys
amdide.sys
atapi.sys
ataport.sys
cmdide.sys
intelide.sys
msahci.sys
mshdc.inf
mshdc.PNF
pciide.sys
pciidex.sys
viaide.sys
atapi.sys
ataport.sys
intelide.sys
mshdc.inf
pciide.sys
pciidex.sys
storahci.sys
Полный набор INF-файлов, существующих в операционной системе Windows, хранится в каталоге C:\Windows\inf\ .
Здравствуй, уважаемый %habrauser%. Около 3 лет назад я написал статью о том Как я создал систему установки принтеров на работе. Не могу не согласится с комментариями и отзывами от прошлой статьи, гласящие о том, что для установки принтеров можно воспользоваться групповыми политиками, но в мире в enterprise, больших или малых, возможны и другие случаи разного характера когда не смотря на наличие домена и групповых политик не представляется удобным\возможным разворачивать принтеры через GPO-шки. Учитывая собранный опыт и отзывы пришло время показать о моей новой переписанной системе с гораздо большим и удобным функционалом с сохранением минимализма, и я надеюсь, что кому-то она пригодится. В статье я также расскажу о том, с какими трудностями я столкнулся при создании этой системы. Кому стало интересно добро пожаловать под кат. Осторожно! Будет много картинок!
Почему надо менять то, что и так работает
Идея о том, что систему надо переписать пришла когда в очередной раз я получил жалобу от HelpDesk о том, что система не очень удобная и много возни с добавлением нового принтера. Каждый раз после установки принтера на сервер, необходимо было создавать два файла, где первый файл это VBS скрипт установки с записанным в него адресом нового принтера (Например: \\server01\printer1) и BAT файл который запускает этот VBS скрипт. Этот самый BAT файл загружался в систему установки принтеров, откуда пользователи находили нужный принтер и скачивали его. Для пользователей все просто: скачал -> запустил -> принтер поставился. Но настройка для технического отдела была нудной и долгой и эту проблему необходимо было решить.
Постановка требований
Ниже приведен список требований, которые были выполнены по мере разработки:
- В первую очередь должна открываться Home страница с выбором филиала
- Должна быть возможность поиска филиала по имени на Home странице
- После выбора филиала должна открываться страница со списком принтеров соответствующего филиала
- На странице выбора принтеров соответствующего филиала должна быть возможность поиска принтера по имени
- На странице выбранного принтера должна показываться следующая информация
Выбор движка
Конечно есть большое количество возможных вариантов того, на чем можно было бы написать приложение, но я выбрал Java Server Faces Framework (JSF) так, как хотелось немного пощупать то, что это такое, да и возможность упаковать приложение в готовый WAR файл и деплоить его на Tomcat как и на Linux, так и на Windows подкупила меня.
Разработка
Введение
До того момента, я ни разу не писал на Java веб приложения, поэтому все начиналось с трудом. Имел опыт с PHP и то только умел кодить на своем велосипеде самописном движке коричневого качества, да и сейчас вряд ли, наверное, цветовой окрас качества новой системы отличается. Хотелось бы узнать мнение опытных разработчиков по этому поводу. Ссылка на гитхаб будет в конце статьи.
Разработку я начал вести сперва в NetBeans, но спустя некоторе время перешел на Eclipse потому, что Eclipse показался мне гораздо более удобным и понятным.
Проект был создан по MVC паттерну, где: JSP — это сами страницы с HTML и JSTL разметкой (views); Servlet — контроллер, который обрабатывет POST или GET запросы этой страницы; DAO класс страницы — тянет или сохраняет нужную информацию в БД. Если обобщить, то все страницы в системе состоят из JSP и своего Servlet-а, но могут не иметь своего DAO класса, если они статичны, а функции для API состоят только из Servlet-а и DAO класса. В качестве стилистики дизайна я использовал Bootstrap 4.
Структура БД
Структура БД достаточно проста и приведена ниже на картинке:
Имеются 5 таблиц для хранения информации:
- branches — предназначен для хранения филиалов
- printers — здесь хранятся принтеры
- printerstype — типы принтеров
- users — администраторы
- systemsettings — настройки системы, где столбец «parameter» имя настройки и «value» его значение
Трудности
Первая
Вторая
Вторая трудность заключалась в том, как реализовать генерирование файла скрипта установки принтера на лету и чтобы для каждого принтера оно было индивидуальным, и чтобы его можно было редактировать. Решение данной проблемы пришло спустя некоторое время и оказалось следующим. Очевидно, что текст самого скрипта необходимо хранить в БД. Для этих целей создал таблицу systemsettings, добавил туда строку, где в столбец «parameter» вписал «installscript», а в «value» сам VBS скрипт из прошлой статьи. А что если у нас завтра будет не VBS, а PowerShell скрипт или любой другой? Поэтому в таблицу systemsettings добавил еще одну строку, где в столбец «parameter» вписал «installscriptextension», а в «value» значение «vbs». Далее создал Servlet download, который принимает GET значение переменной целочисленного типа printerid и выглядит следущим образом:
Хотелось бы отметить про PRINTER_CUSTOM_FIELD1. Поле создано для случаев, если кому-то будет необходимо хранить какое-то свое значение для скриптовых целей, поэтому оно нигде в системе не отображается. Его можно задать при создании принтера или менять через админку.
Третья
И наконец пробема которую все не удавалось решить — это возможность установки БД при первоначальной настройке прямо с браузера с последующим сохранением данных подключения для работы системы в конфигурационный файл. Сперва я написал огромное полотно Java кода с SQL запросами, которое нормально не работало, но затем обнаружил гораздо более удобный вариант. Есть библиотека с классом ScriptRunner, которая позволяет читать и выполнять SQL файл. С помощью неё создание бд с нужными таблицами умещаются всего лишь в пару строк. Пример указан ниже:
После импорта БД, в конфигурационный файл расположенный в WEB-INF\classes\config.properties записываются данные подключения БД. Каждый раз при обращении к БД система читает этот файл. Конечно чтобы ограничить вход на ссылку /install после установки всем, в config.properties записывается значение «db.configured=yes». Если значение yes, то открыть ссылку /install невозможно.
Отображение знака «online» если принтер в сети
Функцию отображения принтера онлайн я пытался сделать с помощью JavaScript WebSocket, но это у меня не получилось. Поэтому решение было другим. После загурзки страницы посылается AJAX запрос на API PrintDesk CheckPrinterIsOnline и возвращается результат. На основе результата отображается или не отображается знак «Онлайн». Ниже представлен код Java, который это делает:
Недостаток этого метода в том, что пингует принтер не сам пользователь, а сервер и может быть сеть устроена так, что доступа с сервера на принтер может и не быть (или вообще отключен ICMP), хотя принтер в онлайне в этот момент. Конечно хотелось бы мне устранить этот недостаток и вообще иметь возможность как-то даже получать информацию о том, что происходит во время запроса в принтере, но пока не знаю как это реализовать.
Заключение
В заключение могу сказать, что во время разработки я многому научился и надеюсь, что мои труды кому-то окажутся полезными. На долгосрочную перспективу планирую расширять и улучшать функционал с сохранением удобства и НЕ перегруженности системы. Спасибо за внимание!
Чтобы проверить порты, перейдите в меню Пуск > Параметры > Устройства, Принтеру и сканеры > Свойства сервера печати и переключитесь на вкладку «Порты».
Посмотрите USB-порты в списке. Если ваше устройство затронула данная проблема, то вы не найдете USB-порт и подключенный к нему принтер в списке.
Microsoft признала данную проблему:
Проблема наблюдается при использовании USB-принтера в системах Windows 10 версии 1903 и новее. Когда вы отключили принтер или завершили работу системы, то при повторном запуске Windows, USB-порт становится недоступен в списке портов.
Принтер не получится использовать для заданий печати и других заданий из-за отсутствующего USB-порта.
Microsoft обозначила следующую причину проблемы:
Если драйвер для USB-принтера содержит языковой монитор, функция обратного вызова OpenPortEx языкового монитора не будет вызываться. В результате пользователь не cможет выполнять операции, зависящие от работы языкового монитора.
На панели управления «Устройства и принтеры» при выборе Свойства сервера печати> вкладка Порт порт USB-принтера (например, «USB001») не будет отображаться в списке доступных портов. В результате пользователь не может выполнять операции, зависящие от порта.
Существует простое обходное решение проблемы. Нужно лишь подключить USB-принтер к компьютеру и включить его до запуска Windows. В этом случае Windows сможет корректно распознать принтер, и вам будут доступны функции печати и дополнительные функции принтера.
Microsoft работает над исправлением данной проблемы и планирует выпустить его в будущих обновлениях Windows 10.
Новейшее обновление функций Windows 10 May 2020 Update (версия 2004), выпущенное Microsoft в конце мая, также содержит большое количество известных проблем и ошибок.
Читайте также: