获取网络中可用的所有打印机 - 而不仅仅是本地打印机

时间:2013-06-06 11:55:34

标签: c# winforms printing wmi network-printers

我一直试图找到网络中的所有打印机。但是,我总是最终得到已经与我的计算机连接的打印机。当我尝试添加打印机时 控制面板\硬件和声音\设备和打印机,我可以在网络中找到更多的打印机。

请注意,我没有打印机服务器。所有打印机都是基于IP的。

我使用了以下代码:

WqlObjectQuery wQuery = new WqlObjectQuery("SELECT * FROM Win32_Printer Where " +
    "Local = FALSE");
ManagementObjectSearcher res = new ManagementObjectSearcher(wQuery);
if ((res.Get().Count > 0))
{
    foreach (ManagementObject printer in res.Get())
    {
        Console.WriteLine(printer["PortName"] + " : " + printer["DriverName"] +
            " : " + printer["Status"]);
    }
}
else { Console.WriteLine("No printers found"); }

在查询中,如果我将local设置为true,我会在计算机上安装打印机。

我也尝试过类似的问题,但仍然没有运气。

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:2)

据我所知,你正在寻找的是WMI的能力之外。

我知道您没有打印服务器,但如果所有打印机至少都连接到其他计算机,那么快速解决方法可能是使用PSExec在您的所有计算机上本地运行打印机查找脚本网络(或者可能是登录脚本)。您可以简单地让打印机查找脚本写入网络共享,然后在执行完成后查看信息。

否则我建议使用像ZenMap这样的网络映射工具或像Spiceworks(www.spiceworks.com)这样的网络监控工具来指纹设备。

答案 1 :(得分:2)

WMI无法枚举网络打印机,只能列出本地计算机中注册的共享打印机。要完成此任务,您可以使用WNetEnumResourceWNetOpenEnumWNetCloseEnum WinApi函数。前段时间我用.Net写了一个这样的例子 试试这篇文章Enumerating All Network resources using Delphi Prism,代码使用Oxygene语言,但可以轻松地翻译成C#。