Намиране на директен комуникационен канал към 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