【问题标题】:How does a local printer driver find a network printer?本地打印机驱动程序如何找到网络打印机?
【发布时间】:2014-10-29 19:18:24
【问题描述】:

(我已经在 Google 上搜索了几天。运气不好。商业机密?)

我有一台自行安装打印机的笔记本电脑(佳能 MF4500w 系列)。膝上型电脑通过空气与打印机通信。打印机本身直接连接到路由器,打印机没有使用静态 IP 地址。路由器将ip地址分配给打印机。

在我的笔记本电脑中,它们不是打印机的注册表项

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports

但是,Canon MFNP Port 有一个端口入口:

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 函数(最好在 C# 中)可以执行相同的功能并返回此注册表项中给定的打印机的当前 IP 地址?

非常感谢任何帮助。谢谢。

【问题讨论】:

  • 我认为不太可能有一个通用的解决方案;没有明显的理由为什么 Windows 会关心打印机的 IP 地址是什么,即使假设它有一个。您需要分别处理每种类型的打印监视器。在这种情况下,您已经获得了 MAC,那么也许有办法对其进行反向查找?
  • @HarryJohnston 如果我进入 Windows 打印机 --> 端口 --> 配置端口。 Windows 确实报告了 10.0.11.57 的 IP 地址。这可以在代码中复制吗?
  • 认为正在由第三方打印监视器显示。但我可能错了,希望专家能在这里提供帮助。
  • @HarryJohnston 我能想到的最好办法是使用 LocalPrintServer() 来获取队列驱动程序名称。然后手动创建一个 xml 文件以将打印机的可能 MAC 与驱动程序相匹配。然后 arp -a 可以将 MAC 与 IP 地址匹配。有人有更好的主意吗?

标签: c# windows sockets printing


【解决方案1】:

作为一个新手,我想发布我的发现,希望比我了解更多的人可以改进这个答案。 (我希望这是本着 SO 的精神)。

这个问题的简短回答是:只有打印机驱动程序知道如何到达其目标设备。

长答案:

  1. 打印必须是 Windows 操作系统中最薄弱且最不标准化的部分之一。
  2. win32_ 管理系统基于 Windows 注册表中标准化条目的假设,而第三方打印机应用程序根本不会出现这种情况。因此,win32_管理系统只有在已经知道第三方打印机自己安装的情况下才能使用。
  3. 一旦知道第三方打印机是如何自行安装的,就可以轻松地让注册表的特定阅读器查找第三方打印机使用的信息。但即使有了这些信息,它也可能是一个盲目的兔子洞,因为最终是打印机驱动程序知道如何处理这些信息。
  4. 据我所知,除了打印机命令语言(通常称为 PCL)之外,打印机驱动程序之间没有标准化。
  5. 我确信 Windows 将 PCL 嵌入其 API 的某处,但它似乎并不容易通过 .NET 系统获得。它还需要知道命令所需的特定语法,这也是我(目前)还不知道的信息。我对此的简要调查还表明,它需要知道打印机的 IP 地址,这是另一个兔子洞。
  6. 也许除了打印机的 MAC 地址之外,系统中显然没有常量: 6.1。 “IP 地址”窗口显示只是实际 IP 地址的别名。我怀疑这里的原因是打印机可以在路由器打开时动态地重新分配 IP 地址。因此,软件可以“跟踪”新的 IP 地址并将该 IPAddress 分配给别名 Ip Address,该别名在端口描述中保持不变。 6.2 打印机队列(Windows 打印机和设备中显示的队列)可由用户任意重命名。它不是一个常数。 6.3 “端口名称”可由用户任意重命名。 6.4 给定的打印机驱动程序可以多次用于不同的设备。这里有一对多的关系。显然,设备驱动程序必须了解安装设备时建立的注册表位置和条目。 (再次,第三方信息。) 6.5 甚至设备的 MAC 也可以在路由器级别进行欺骗 - 所以这也不是一个常数。
  7. 由于归根结底,一切都可以任意设置,只有第三方打印机驱动程序知道在哪里以及如何使用注册表信息,所以我能想到的最简单的解决方案是: 7.1 用目标设备的 MAC 标记打印机队列(windows 打印机和设备中的那个)。 7.2 不要更改目标设备的 MAC。 7.3 使用 arp -a(或它的一些变体)在运行时获取设备的实际 IP 地址。这将提供 IP 地址到设备的实际映射。

我希望专家能纠正这个答案!谢谢。

【讨论】:

  • re 5.:PCL 是与打印机对话的事实上的标准,但不是唯一的;仍然有使用 Postscript 的打印机,而在几年前,还有很多其他的替代品。许多打印机没有使用任何标准,每个品牌甚至每个型号都有独特的语言。结果是 Windows API 在设计上不使用 PCL 或任何其他特定的打印机语言。
猜你喜欢
  • 2017-04-21
  • 1970-01-01
  • 1970-01-01
  • 2014-05-30
  • 2012-05-28
  • 2011-04-13
  • 2017-12-16
  • 1970-01-01
  • 2011-04-12
相关资源
最近更新 更多