Поиск прямого канала связи с IP-принтером

У меня есть приложение, которое позволяет пользователю выбирать принтер перед печатью. Мне нужно иметь возможность, используя информацию, возвращенную из диалогового окна выбора принтера .Net, найти способ связи по SNMP напрямую с принтером. Одним из требований к моему приложению является то, что оно не отправляет на принтер никаких заданий на печать, когда принтер находится в режиме паузы, застрял, находится в автономном режиме или закончилась бумага и т. д. Я могу получить эту информацию только через SNMP для того типа принтера, который у меня есть.

Я использовал запрос WMI для получения информации о принтере, а затем получил канал связи с этим принтером, используя значения ShareName и ServerName в этом запросе WMI. Это работает уже больше года.

Недавно сетевая группа переместила мое приложение с сервера Windows 2003 на сервер Windows 2008 R2. Когда приложение находится в своем новом доме 2008 года, значения для ServerName и ShareName в запросе WMI всегда возвращаются пустыми, что делает невозможным прямой обмен данными с принтером с использованием моего существующего кода.

Есть ли у кого-нибудь другой способ прямого взаимодействия с принтерами, основанный только на том, что пользователь выбирает принтер в диалоговом окне выбора принтера .Net? Для целей этого приложения мы можем с уверенностью ожидать, что принтер всегда будет одного типа и всегда будет подключен к сети.

Вот запрос WMI, который я использовал:

"SELECT * from Win32_Printer WHERE Name LIKE '%MyPrinter'"

Ценить это.


person omatase    schedule 27.06.2011    source источник
comment
Вы не можете использовать WMI для прямого получения PrinterState или PrinterStatus?   -  person Jack B Nimble    schedule 01.07.2011
comment
Сама Windows не сообщает мне достоверно, доступен ли принтер, я нашел WMI-запрос, который мог бы это сделать, но он часто сообщает мне, что принтер недоступен, когда он включен и готов к работе.   -  person omatase    schedule 01.07.2011


Ответы (1)


Это тот же ответ, который я дал c#: Как контролировать задание печати с помощью winspool_drv

Вот пример использования Win32_Printer.

PrintDialog pd = new PrintDialog();
pd.ShowDialog();
PrintDoc.PrinterSettings = pd.PrinterSettings;
PrintDoc.PrintPage += new PrintPageEventHandler(PrintDoc_PrintPage);
PrintDoc.Print();

object status = Convert.ToUInt32(9999);
while ((uint)status != 0) // 0 being idle
{
    ManagementObjectSearcher mos = new ManagementObjectSearcher("select * from Win32_Printer where Name='" + pd.PrinterSettings.PrinterName + "'");
    foreach (ManagementObject service in mos.Get())
    {
    status = service.Properties["PrinterState"].Value;
    Thread.Sleep(50);
    }
}

В документации сказано, что PrinterState устарел, и вам следует использовать PrinterStatus, что не очень хорошо, учитывая, что PrinterState дает вам все статусы, которые вы ищете. .

При этом как PrinterState, так и PrinterStatus должны возвращать > 0, если принтер недоступен.

person Jack B Nimble    schedule 01.07.2011