هل هناك طريقة .NET لتعداد كافة طابعات الشبكة المتوفرة؟

StackOverflow https://stackoverflow.com/questions/1018001

  •  06-07-2019
  •  | 
  •  

سؤال

هل هناك طريقة مباشرة لتعداد كافة طابعات الشبكة المرئية في .NET؟أقوم حاليًا بعرض PrintDialog للسماح للمستخدم بتحديد الطابعة.المشكلة في ذلك هي أنه يتم عرض الطابعات المحلية أيضًا (جنبًا إلى جنب مع XPS Document Writer وما شابه).إذا كان بإمكاني تعداد طابعات الشبكة بنفسي، فيمكنني عرض مربع حوار مخصص مع تلك الطابعات فقط.

شكرًا!!

هل كانت مفيدة؟

المحلول

وجدت هذا الرمز هنا

 private void btnGetPrinters_Click(object sender, EventArgs e)
        {
// Use the ObjectQuery to get the list of configured printers
            System.Management.ObjectQuery oquery =
                new System.Management.ObjectQuery("SELECT * FROM Win32_Printer");

            System.Management.ManagementObjectSearcher mosearcher =
                new System.Management.ManagementObjectSearcher(oquery);

            System.Management.ManagementObjectCollection moc = mosearcher.Get();

            foreach (ManagementObject mo in moc)
            {
                System.Management.PropertyDataCollection pdc = mo.Properties;
                foreach (System.Management.PropertyData pd in pdc)
                {
                    if ((bool)mo["Network"])
                    {
                        cmbPrinters.Items.Add(mo[pd.Name]);
                    }
                }
            }

        }

تحديث:

و"هذه وظيفة API يمكن تعداد كافة موارد الشبكة، بما في ذلك الخوادم ومحطات العمل والطابعات والأسهم والدلائل عن بعد الخ."

HTTP: //www.planet- source-code.com/vb/scripts/ShowCode.asp؟txtCodeId=741&lngWId=10

نصائح أخرى

  • احصل على الطابعة الافتراضية من LocalPrintServer.DefaultPrintQueue
  • احصل على الطابعات المثبتة (من وجهة نظر المستخدم) من PrinterSettings.InstalledPrinters
  • التعداد من خلال القائمة:
  • أي طابعة تبدأ بـ \\ هي طابعة شبكة - لذا احصل على قائمة الانتظار new PrintServer("\\UNCPATH").GetPrintQueue("QueueName")
  • أي طابعة لا تبدأ بـ \\ هي طابعة محلية لذا احصل عليها LocalPrintServer.GetQueue("Name")
  • يمكنك معرفة ما هو الافتراضي من خلال المقارنة FullName ملكية.

ملحوظة:يمكن أن تكون طابعة الشبكة هي الطابعة الافتراضية منها LocalPrintServer.DefaultPrintQueue, ، ولكن لا تظهر في LocalPrintServer.GetPrintQueues()

    // get available printers
    LocalPrintServer printServer = new LocalPrintServer();
    PrintQueue defaultPrintQueue = printServer.DefaultPrintQueue;

    // get all printers installed (from the users perspective)he t
    var printerNames = PrinterSettings.InstalledPrinters;
    var availablePrinters = printerNames.Cast<string>().Select(printerName => 
    {
        var match = Regex.Match(printerName, @"(?<machine>\\\\.*?)\\(?<queue>.*)");
        PrintQueue queue;
        if (match.Success)
        {
            queue = new PrintServer(match.Groups["machine"].Value).GetPrintQueue(match.Groups["queue"].Value);
        }
        else
        {
            queue = printServer.GetPrintQueue(printerName);
        }

        var capabilities = queue.GetPrintCapabilities();
        return new AvailablePrinterInfo()
        {
            Name = printerName,
            Default = queue.FullName == defaultPrintQueue.FullName,
            Duplex = capabilities.DuplexingCapability.Contains(Duplexing.TwoSidedLongEdge),
            Color = capabilities.OutputColorCapability.Contains(OutputColor.Color)
        };
    }).ToArray();

    DefaultPrinter = AvailablePrinters.SingleOrDefault(x => x.Default);

وباستخدام API System.Printing جديد

using (var printServer = new PrintServer(string.Format(@"\\{0}", PrinterServerName)))
{
    foreach (var queue in printServer.GetPrintQueues())
    {
        if (!queue.IsShared)
        {
            continue;
        }
        Debug.WriteLine(queue.Name);
     }
 }

وPrinterSettiings.InstalledPrinters يجب أن يوفر لك مجموعة تريد

في وظيفة أخرى ( https://stackoverflow.com/a/30758129/6513653 ) relationed لهذا واحد، وقال سكوت تشامبرلين "لا أعتقد أن هناك أي شيء في. NET التي يمكن أن تفعل ذلك، سوف تحتاج إلى إجراء مكالمة الأم". بعد محاولة كل الموارد. NET ممكن، وأعتقد أنه هو الصحيح. لذلك، بدأت في التحقيق في كيفية الحوار أضف PRINTER لا بحثها. باستخدام إيثار ريال، وجدت أن إضافة طابعة الإرسال لا يقل عن نوعين من حزم لكافة المضيفين في الشبكة المحلية: طلب اثنين من النص المتشعب / XML ل3911 الميناء وثلاثة طلبات SNMP. طلب SNMP الأول على بعد الحصول المقبل 1.3.6.1.2.1.43، وهي طابعة-MIB. والثاني، هو الحصول على 1.3.6.1.4.1.2699.1.2.1.2.1.1.3 وهو pmPrinterIEEE1284DeviceId من PRINTER-PORT-MONITOR-MIB. هذا هو الأكثر إثارة للاهتمام لأنه هو المكان الذي يأخذ أضف PRINTER اسم الطابعة. والثالث هو الحصول على 1.3.6.1.2.1.1.1.0، وهو sysDescr من SNMP نظام MIB-2. أعتقد أن طلب SNMP الثاني هو ما يكفي للعثور على معظم الطابعات الشبكة في الشبكة المحلية، لذلك فعلت هذا الرمز. كان يعمل لتطبيق Windows نموذج وذلك يعتمد على SnmpSharpNet.

وتحرير: أنا باستخدام ARP بينغ بينغ بدلا العادي للبحث تستضيف نشاطا في الشبكة. رابط لمشروع سبيل المثال: ListNetworks C # مشروع

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top