Как получить System.Printing.PrintServer.GetPrintQueues для возврата списка очередей печати с удаленного сервера? - PullRequest
1 голос
/ 26 октября 2010

Проблема

Я пытаюсь получить список очередей печати, доступных на удаленном сервере .

В конечном итоге это нужно будет выполнить из ASP.NET, но сейчас я бы согласился на работу консольного приложения.

Когда я создаю экземпляркласс System.Printing.PrintServer , использующий путь к удаленному серверу. Я могу получить основную информацию о сервере печати.Но когда я вызываю метод GetPrintQueues, я получаю только те очереди, которые определены в локальном окне .Неважно, что я использую для удаленного устройства.

Код

Imports System.Printing

Module Module1
  Sub Main()
    ListPrintQueues("\\local")
    ListPrintQueues("\\remote")
    ListPrintQueues("\\other")
  End Sub

  Sub ListPrintQueues(ByVal server As String)

    Dim ps As New PrintServer(server)
    Console.WriteLine("Printer Server=" & ps.Name)

    Dim flags() As EnumeratedPrintQueueTypes = {EnumeratedPrintQueueTypes.Connections, EnumeratedPrintQueueTypes.Local}

    Dim queues As PrintQueueCollection = ps.GetPrintQueues(flags)

    For Each pq As PrintQueue In queues
      Console.WriteLine(pq.FullName)
    Next

    Console.WriteLine()
  End Sub
End Module

Пример:

Предполагается следующая конфигурация

  • \\ local( Локальный компьютер с 3 определенными очередями печати, 1 является удаленным подключением )
    • LPrinter1
    • LPrinter2
    • \\ remote \ RPrinter1
  • \\ remote ( Удаленный компьютер с 2 определенными очередями печати )
    • RPrinter1
    • RPrinter2
  • \\ прочее ( Какой-то другой компьютер с определенной 1 очередью печати )
    • OPrinter

Результаты:

Print Server=\\local  
\\local\LPrinter1  
\\local\LPrinter2  
\\remote\RPrinter1  

Print Server=\\remote  
\\remote\RPrinter1  

Print Server=\\other
\\remote\RPrinter1  

Мне кажется, что внутри метода GetPrintQueues () что-то происходит, что приводит к сбросу сервера печати в локальный ящик, поскольку не имеет значения, какое имя сервера печати, еслиэто действующий компьютер в сети.

Ответы [ 2 ]

1 голос
/ 28 октября 2010

Обнаружил ответ ... даже если это не то, что я хотел.

Если я изменю флаги перечисления на локальные и подключусь к серверу, на котором я вошел в систему в прошлом, я получу правильные принтеры. Но если я не вошел в систему, я получаю список удаленных очередей печати с моего аппарата.

Когда я пытаюсь выполнить аналогичные действия с помощью WMI, на удаленном сервере, к которому я подключился, появляются ошибки «Отказано в доступе». Я предполагаю, что System.Printing перехватывает исключение, а затем по умолчанию на локальный сервер печати. ​​

измененный код

Imports System.Printing

Module Module1
  Sub Main()
    ListPrintQueues("\\local")
    ListPrintQueues("\\remote")
    ListPrintQueues("\\other")
  End Sub

  Sub ListPrintQueues(ByVal server As String)

    Dim ps As New PrintServer(server)
    Console.WriteLine("Printer Server=" & ps.Name)

    Dim flags() As EnumeratedPrintQueueTypes = {EnumeratedPrintQueueTypes.Local}

    Dim queues As PrintQueueCollection = ps.GetPrintQueues(flags)

    For Each pq As PrintQueue In queues
      Console.WriteLine(pq.FullName)
    Next

    Console.WriteLine()
  End Sub
End Module
0 голосов
/ 09 июня 2016
Private Sub btnreanudar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnreanudar.Click
    Dim SERVIDOR As New System.Printing.PrintServer() 'SUPERIOR DEL SISTEMA DE IMPRESION (EL ORDENADOR)
    Dim IMPRESORAS As PrintQueueCollection = SERVIDOR.GetPrintQueues() 'IMPRESORAS DISPONIBLES
    For Each IMPRESORA As PrintQueue In IMPRESORAS 'RECORRE TODAS LAS IMPRESORAS
        Try
            If IMPRESORA.NumberOfJobs > 0 Then 'SI LA IMPRESORA TIENE ALGUNA IMPRESION EN MARCHA......
                IMPRESORA.Refresh()
                Dim IMPRESIONES As PrintJobInfoCollection = IMPRESORA.GetPrintJobInfoCollection() 'CREA UNA COLECCION DE IMPRESIONES EN MARCHA
                For Each IMPRESION In IMPRESIONES ' POR CADA IMPRESION......
                    If IMPRESION.JobIdentifier = joblist.CurrentRow.Cells("JobId").Value Then
                        IMPRESION.Resume()
                        Exit Sub
                    End If
                Next
            End If
        Catch ex As Exception
        End Try
    Next
End Sub
...