Как локальный драйвер принтера находит сетевой принтер?

1

(Я искал Google в течение нескольких дней на этом. Не повезло. Торговый секрет?)

У меня есть ноутбук с самонастраивающимся принтером (серия Canon MF4500w). Ноутбук обменивается данными с принтером. Сам принтер подключается непосредственно к маршрутизатору, и для принтера не используется статический IP-адрес. Маршрутизатор назначает IP-адрес принтеру.

В моем ноутбуке у них нет записи реестра для принтера в

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Стандартный порт TCP/IP\Ports

Однако есть порт для порта Canon MFNP:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Canon MFNP Port\Ports

of CNMFNP_001E8FB0726C

Эта запись в реестре показывает:

IPFixed        REG_DWORD    0x000000000 (0)
PrinterPort    REG-DWORD    0x0000238c (9100)
Protocol       REG_DWORD    0x00000001 (1)
TargetAddress  REG_DWORD    0x390b000a (957022218)
TargetMAC      REG_SZ       00-1E-8F-B0-72-6C
TargetPort     REG_DWORD    0x0000021a2 (8610)

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

Есть ли функция windows (идеально в С#), которая может выполнять эту же функцию и возвращать текущий IP-адрес принтера, заданного в этой записи реестра?

Любая помощь очень ценится. Благодарю.

  • 0
    Я думаю, что вряд ли найдется универсальное решение; Нет очевидной причины, по которой Windows будет интересовать IP-адрес принтера, даже если он есть. Вы должны будете иметь дело с каждым типом монитора печати отдельно. В этом случае у вас есть MAC, так что, возможно, есть способ сделать обратный поиск по этому вопросу?
  • 0
    @HarryJohnston Если я зайду в Windows Принтеры -> Порты -> Настроить порт. Windows действительно сообщает IP-адрес 10.0.11.57. Можно ли это повторить в коде?
Показать ещё 2 комментария
Теги:
printing
sockets

1 ответ

0
Лучший ответ

Как новичок, я хотел бы опубликовать свои выводы в надежде, что кто-то, кто знает больше меня, может улучшить этот ответ. (Я надеюсь, что это в духе SO).

Короткий ответ на вопрос: только драйвер принтера знает, как добраться до целевого устройства.

Длинный ответ:

  1. Печать должна быть одной из самых слабых в большинстве нестандартизированных частей операционной системы Windows.
  2. Система управления win32_ основана на предположении о стандартизированных записях в реестре Windows, что просто не возникает для приложений сторонних принтеров. Таким образом, система управления win32_ может использоваться только тогда, когда уже известно, как установлен сторонний принтер.
  3. Как только известно, как установлен сторонний принтер, тогда конкретный читатель для реестра может быть легко сделан, чтобы найти информацию, используемую сторонним принтером. Но даже с этой информацией это может быть слепое отверстие кролика, поскольку в конечном итоге именно драйвер принтера имеет конкретные знания о том, что делать с этой информацией.
  4. Насколько я могу судить, стандартизация среди драйверов принтера отсутствует, возможно, единственное исключение из командного языка принтера, обычно называемое PCL.
  5. Я уверен, что Windows имеет PCL, встроенный где-то в один из его API, но он не кажется легко доступным через систему.NET. Это также потребует знания специфического синтаксиса, необходимого для команд, снова информации, которую я еще не знаю (пока). Мой краткий обзор этого также показывает, что для этого потребуется знать IP-адрес принтера, который является еще одним отверстием для кроликов.
  6. Возможно, за исключением MAC-адреса принтера, в системе, по-видимому, нет констант: 6.1. Окна "Ip Addresses" - это только псевдонимы для фактического IP-адреса. Я подозреваю, что причина заключается в том, что принтер может динамически переназначать IP-адрес при включении маршрутизатором. Таким образом, программное обеспечение может "следить" за новым IP-адресом и назначать этот IP-адрес в адрес псевдонима Ip, который остается постоянным для описаний портов. 6.2 Очередь принтера (тот, который отображается в принтерах и устройствах Windows) может быть произвольно переименован пользователем. Это не константа. 6.3 "Имя порта" может быть произвольно переименовано пользователем. 6.4 Данный драйвер принтера может использоваться несколько раз для разных устройств. Здесь есть отношения "один ко многим". Очевидно, что драйвер устройства должен понимать местоположения и записи реестра, установленные при установке устройства. (Опять же, информация сторонних производителей.) 6.5 Даже MAC для устройства может быть подделан на уровне маршрутизатора - так что даже это не константа.
  7. Поскольку, в конечном счете, все может быть произвольно задано, и только драйвер сторонних принтеров понимает, где и как использовать данные реестра, самым простым решением, о котором я могу думать, является следующее: 7.1. Пометьте очередь принтера (тот, что в принтерах и устройствах Windows), с MAC целевого устройства. 7.2 Не меняйте MAC-адрес целевого устройства. 7.3 Используйте arp -a (или какой-либо его вариант) для получения фактических IP-адресов устройств во время выполнения. Это обеспечило бы фактическое отображение IP-адреса на устройство.

Надеюсь, эксперт исправит этот ответ! Благодарю.

  • 0
    о 5 .: PCL является стандартом де-факто для общения с принтером, но не единственным; все еще существуют принтеры, которые используют Postscript, и не так много лет назад было много других альтернатив. Многие принтеры не использовали какой-либо стандарт, у каждой марки или даже у каждой модели был свой язык. В результате Windows API по своей природе не использует PCL или какой-либо другой конкретный язык принтера.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню