如何使用Win32 API通过端口名获取网络打印机的IP地址?

6

如何使用win32 API通过端口名称获取网络打印机的IP地址?

我尝试查看PRINTER_INFO_*结构体,但似乎没有包含该信息。


这可能吗?你怎么只用端口号就能得到它呢? - Shoban
1
好问题 - 或许你可以更明确地表达一下你所说的端口名称是什么? - Elemental
2
@Shoban:不是端口号,而是端口名称。 @Elemental:在“打印机和传真机”中配置打印机端口时,需要提供端口名称。您可以使用::EnumPrinter win32 API获取所有打印机的端口名称。 - sourabh jaiswal
5个回答

4

您可以通过PRINTER_INFO_2获取端口名称,然后从注册表中获取IP地址,路径为: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports IP地址存储在“HostName”中。


2
像任何其他IP网络设备一样,打印机将具有一个IP地址(表示它的以太网卡),并且将在某个端口上运行服务(标识响应打印机消息的程序)。这只是网络相关的内容,还没有涉及到打印机特定的内容。
因此,仅凭其端口,无法找到其IP地址。可能所有其他打印机上的服务都监听相同的端口。
假设您指的是打印机的名称,则需要查询域名服务。该服务将网络地址映射到“符号”名称。
使用winsock2 api,我认为您需要 gethostbyname。这将通过名称检索打印机的主机信息。

1
在这个问题的背景下,“端口(port)”一词有多重含义。我认为发帖者并未指的是打印机服务所侦听的端口。Windows通过名称和端口(例如,端口可能是“LPT1:”)来跟踪打印机。在较新版本的API中,很少需要使用端口名称。 - Adrian McCarthy

2

我认为没有标准的方法来获取IP地址。可能有不同且不兼容的网络端口监视器实现。对于我的网络打印机来说,IP地址是端口名称的一部分(例如,IP_192_168.1.104)。如果符合这种形式,则可能可以解析出IP地址,但我不认为这是通用的。

使用EnumPorts函数可以确定是否为网络打印机,但我仍然看不到获取IP地址的方法。


端口名可以在创建后进行编辑,不能保证“IP_192_168_1_104”实际上是192.168.1.104。您可以通过WMI和WQL查询语句“Select Name, HostAddress from Win32_TCPIPPrinterPort”获取端口名对应的IP地址。 - Chris Miller
1
正如Adrian所说,没有通过API获取此信息的方法。唯一的方式是通过读取打印服务器上注册表中的键:HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Print\Monitors\Standard TCP/IP Port\Ports。 - Matt__C

1

我来寻找答案,但并没有真正接受没有办法的事实,并发现实际上有解决方案。这个答案在Delphi中,但很简单:

function PortIPAddress(Port: string): string;
var
  buf:          PWideChar;
  pd:           PRINTER_DEFAULTS;
  c,
  d,
  bs,
  hXcv:         cardinal;
begin
  Result := 'unknown';

  ZeroMemory(@pd, SizeOf(PRINTER_DEFAULTS));
  pd.DesiredAccess := SERVER_ACCESS_ADMINISTER;

  if OpenPrinter(PAnsiChar(Format(',XcvPort %s', [Port])), hXcv, @pd) then
  begin
    XcvData(hXcv, 'IPAddress', nil, 0, nil, 0, @bs, @c);

    GetMem(buf, bs);
    try
      if XcvData(hXcv, 'IPAddress', nil, 0, buf, bs, @d, @c) then
        Result := buf;
    finally
      FreeMem(buf, bs);
    end;
  end;

  ClosePrinter(hXcv);
end;

0

只需使用高级打印机API,动态调用即可


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接