사용 가능한 모든 네트워크 프린터를 열거하는 .NET 방법이 있습니까?

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

  •  06-07-2019
  •  | 
  •  

문제

.NET의 모든 가시적 네트워크 프린터를 열거하는 간단한 방법이 있습니까? 현재 사용자가 프린터를 선택할 수 있도록 PrintDialog를 보여줍니다. 그 문제는 로컬 프린터도 표시됩니다 (XPS 문서 작성자 등과 함께). 네트워크 프린터를 직접 열거 할 수 있다면 해당 프린터만으로 사용자 정의 대화 상자를 표시 할 수 있습니다.

감사!!

도움이 되었습니까?

해결책

이 코드를 찾았습니다 여기

 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 예측

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) 이와 관련하여 Scott Chamberlain은 ".NET에는이를 수행 할 수있는 것이 없다고 생각하지 않습니다. 기본 전화를해야합니다"라고 말했습니다. 가능한 .NET 리소스를 모두 시도한 후에는 그가 옳다고 생각합니다. 그래서 프린터 추가 대화 상자가 검색하는 방법을 조사하기 시작했습니다. Wireshark를 사용하여 프린터를 추가하여 로컬 네트워크의 모든 호스트에게 최소 2 가지 유형의 패키지를 보내는 것을 알았습니다. enter image description here첫 번째 SNMP 요청은 get-next 1.3.6.1.2.1.43이며, 이는 프린터 -IB입니다. 두 번째는 Get 1.3.6.1.4.1.2699.1. 추가 프린터가 프린터 이름을 취하는 곳이기 때문에 이것은 가장 흥미 롭습니다. 세 번째는 Get 1.3.6.1.2.1.1.1.0이며 SNMP MIB-2 시스템의 SYSDESCR입니다. 두 번째 SNMP 요청이 로컬 네트워크에서 대부분의 네트워크 프린터를 찾기에 충분하다고 생각 하므로이 코드를 수행했습니다. Windows Form Application에서 작동하며 SNMPSHARPNET에 따라 다릅니다.

편집 : 네트워크에서 활성 호스트를 검색하기 위해 ARP PING을 사용하고 있습니다. 예제 프로젝트 링크 : Listnetworks C# 프로젝트

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top