3

我想搜索网络中有多少台打印机可用。我已经检查了已安装的打印机属性,它给了我那些安装在我的系统上的打印机列表。

我的网络中有两台以上的打印机,其中只有一台显示在列表中,因为它安装在我的系统上。

如何从网络中获取未安装在我的系统上或未连接到我的系统的驱动程序的所有打印机列表。

4

2 回答 2

5

我知道这篇文章已经很老了,但我一直在与同样的问题作斗争。

我最终设法解决了它,我希望下面的代码可以帮助某人:

        using(var ds = new DirectorySearcher())
        {
            ds.SearchRoot = new DirectoryEntry("");
            ds.Filter = "(|(&(objectCategory=printQueue)(name=*)))";

            ds.PropertiesToLoad.Add("printername");
            ds.PropertiesToLoad.Add("portname");
            ds.PropertiesToLoad.Add("servername");
            ds.PropertiesToLoad.Add("cn");
            ds.PropertiesToLoad.Add("name");
            ds.PropertiesToLoad.Add("printsharename");
            ds.ReferralChasing = ReferralChasingOption.None;
            ds.Sort = new SortOption("name", SortDirection.Descending);

            using(var src = ds.FindAll())
            {
                foreach(SearchResult sr in src)
                {
                    Console.WriteLine("------------------------------------");
                    Console.WriteLine(sr.GetDirectoryEntry().Name);
                    foreach (DictionaryEntry p in sr.Properties)
                    {
                        var propName = p.Key;
                        var propCollection = (ResultPropertyValueCollection)p.Value;
                        var propValue = propCollection.Count > 0 ? propCollection[0] : "";
                        Console.WriteLine(propName);
                        Console.WriteLine(propValue);
                    }
                    Console.WriteLine("------------------------------------");                        

                }

            }

        }

如果您想返回所有属性以查看可用的属性,那么只需注释掉 ds.PropertiesToLoad 行,这将为您提供完整列表。

于 2015-06-05T16:17:42.837 回答
0

尝试这个。

 System.Management.ManagementScope objMS = 
        new System.Management.ManagementScope(ManagementPath.DefaultPath);
    objMS.Connect();

    SelectQuery objQuery = new SelectQuery("SELECT * FROM Win32_Printer");
    ManagementObjectSearcher objMOS = new ManagementObjectSearcher(objMS, objQuery);
    System.Management.ManagementObjectCollection objMOC = objMOS.Get();
    foreach (ManagementObject Printers in objMOC)
    {
        if (Convert.ToBoolean(Printers["Local"]))       // LOCAL PRINTERS.
        {
            cmbLocalPrinters.Items.Add(Printers["Name"]);
        }
        if (Convert.ToBoolean(Printers["Network"]))     // ALL NETWORK PRINTERS.
        {
            cmbNetworkPrinters.Items.Add(Printers["Name"]);
        }
    }
}
于 2013-11-11T09:05:29.553 回答