我正在设置一个 icinga 服务器,用于通过 SNMP 监控打印机状态(碳粉量、错误等)。所有打印机都可以通过共享的 Windows 打印服务器访问(打印机通过 \SERVER\Printer_Share 添加到客户端计算机)。虽然我能够通过 SNMP 直接通过 IP 查询打印机,但它并没有告诉我它们的名称。是否可以从 Linux 查询 Windows 打印服务器以产生类似于以下内容的输出:
Shared Printer 1 -> IP_1
Shared Printer 2 -> IP_2
Shared Printer 3 -> IP_3
Shared Printer 4 -> IP_4
有了这些信息,我就可以编写一个脚本来创建 icinga 配置文件。有数百台打印机,所以我不会手动执行此操作。我不是要求任何人为我编写脚本,而是为我指明正确的方向。
答案1
您的选择:
1. 评估注册数据
- 查询的子键以
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Printers
获取打印机列表 - 匹配
port
值HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports
- 评估匹配键中的 HostName 和 IPAddress 值
2. 使用 Powershell
- 与 1. 类似,但使用
Get-Printer
和Get-PrinterPort
cmdlet 通过明确定义的接口检索相应的数据(您需要使用 Windows 8.1 或 Server 2012 主机来运行 CMDlet,但运行它们的打印服务器可能是旧版本)
3. 使用 WMI
- 与 1. 和 2. 类似,但使用 WMI
Win32_Printer
类来检索打印机列表和Win32_TCPIPPrinterPort
类以HostAddress
您选择的支持 WMI 查询的语言检索值(例如VB脚本)
请注意,如果您的打印机使用的是供应商特定的而不是,则没有统一的方法来执行此操作。Standard TCP/IP Port
您需要去弄清楚这一切,尽管这些信息很可能隐藏在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\<yourporttype>
注册表子项中的某个地方。
请注意,虽然理论上你可以使用 RPC 从 Linux 站点远程访问内容,但使用 NRPE 传输数据可能是一个更好的主意(请查看NSClient++ 使用外部脚本)