FindNextPrinterChangeNotification против win32_printjob JobId

Я пытаюсь получить сведения о заданиях на печать, сгенерированные сервером печати Windows (на основе AD), который обслуживает более 100 клиентских машин.

Поскольку мне нужно сохранить некоторые другие данные вместе с деталями задания, я использовал FindNextPrinterChangeNotification, чтобы получить jobId на клиенте (ах) и передал его в WMI на сервере, чтобы получить больше сведений о задании.

См. оба http://www.codeproject.com/Articles/51085/Monitor-jobs-in-a-printer-queue-NET и https://blogs.msdn.microsoft.com/ocleon/2008/03/26/get-print-jobs-using-wmi-and-managmentobjects/

Но дело в том, что я получаю разные идентификаторы для одной и той же работы как на сервере, так и на клиенте (например: 29956 и 29).

Может ли кто-нибудь объяснить, как обращаться с jobid между этими двумя API и найти решение этой проблемы.

Редактировать 1: С клиентских компьютеров домена, подключив сервер печати (\ipaddress) и выполнив метод FindNextPrinterChangeNotification, вы получили сведения о задании (jobid 29956). Но на сервере, выполнив запрос выбора к классу wmi win32-printjob, я вообще не дал никаких результатов, и то, что я получил ранее, было локальным идентификатором печати клиентов (29).

Может ли кто-нибудь пролить свет на то, как получить сведения о задании на сервере печати, выполняя запросы wmi локально.


person Murugan Durai    schedule 13.07.2016    source источник
comment
например: 29956 & 29 -- Являются ли эти числа реальными примерами? Если да, то это как-то подозрительно. Всегда ли первые две цифры одинаковы?   -  person Carey Gregory    schedule 17.07.2016
comment
да. Это реальные цифры. Первые две цифры 29XXX всегда одинаковы, а небольшие числа сильно различаются. Сегодня этот маленький уже достиг 7x. В настоящее время я использую прослушиватель событий WMI на клиентских машинах, теперь я могу получить все данные о задании на печать, кроме количества страниц.   -  person Murugan Durai    schedule 19.07.2016
comment
Я бы очень тщательно проверил свой собственный код на наличие ошибок. Этот шаблон подозрительно выглядит как число, которое каким-то образом повреждено.   -  person Carey Gregory    schedule 19.07.2016
comment
Привет @CareyGregory, спасибо за вашу помощь. Я дважды проверил свой код. Когда он работает на клиентской машине домена, 2 идентификатора задания создаются только для локальной машины (29XXX), и тот же код, работающий на сервере печати, получает только один идентификатор задания (75). Также у вас есть какие-либо идеи о функции GetJob win32, в настоящее время я использую ее для подсчета страниц, но не смог получить никакого результата. Мой поток кода: OpenPrinter --> GetJob --> ClosePrinter.   -  person Murugan Durai    schedule 20.07.2016
comment
Я не знаю никакого способа получить точное количество страниц из любого места, кроме файла спула. Это было проблемой GetJob уже немыслимое количество лет. Microsoft явно не хочет исправлять это.   -  person Carey Gregory    schedule 20.07.2016
comment
Еще раз спасибо за разъяснение о GetJob. Не могли бы вы сообщить мне, как получить количество страниц из файла спула. Я уже приостановил и возобновил задание печати с помощью WMI (чтобы получить количество страниц через GetJob).   -  person Murugan Durai    schedule 20.07.2016
comment
Могу ли я использовать ReadPrinter для подсчета страниц? stackoverflow.com/questions/12866711/   -  person Murugan Durai    schedule 20.07.2016
comment
Да, ты можешь. Вам нужно будет проанализировать файл самостоятельно, и для этого вам нужно знать формат. undocprint.org/formats/winspool/spl   -  person Carey Gregory    schedule 20.07.2016
comment
Огромное спасибо @CareyGregory. Я проверю функцию ReadPrint и сообщу вам о результатах. Кроме того, рекомендуется использовать разницу общего количества отпечатков SNMP, зафиксированную между (WMI) приостановленным и возобновленным заданием печати, например papercut.com/kb/Main/HowDoesHardwareCheckingAffectPrintingSpeed   -  person Murugan Durai    schedule 20.07.2016
comment
Привет @CareyGregory. Сама функция ReadPrinter не дает данных, действительно ли мне нужно выполнять синтаксический анализ? Вы знаете, как анализировать файл .spl с помощью C#?   -  person Murugan Durai    schedule 20.07.2016
comment
Вы должны быть в состоянии сделать это на C#, C или C++, поскольку все они могут вызывать API-интерфейсы Win32. Как разобрать файл спула — это отдельный проект. Он очень похож на файл EMF, если вы с ним знакомы. В любом случае, это не тот вопрос, на который кто-то может ответить здесь. Ответом будут сотни строк кода.   -  person Carey Gregory    schedule 20.07.2016
comment
Привет @CareyGregory, я попытался прочитать файл с помощью www.codeproject.com/Articles/10586/EMF-Printer-Spool-File-Viewer. Но я не мог поймать файл, когда он был создан, потому что задание на печать уже было приостановлено и возобновлено через WMI win32_PRINTJOB _InstanceDeletionEvent. Всегда получаю исключение типа «Не удалось найти файл« C: \ Windows \ System32 \ spool \ PRINTERS \ 00085.SPL ». Есть ли у вас какие-либо идеи, например, когда мы можем сделать паузу, чтобы прочитать файл очереди? Пожалуйста, предложите.   -  person Murugan Durai    schedule 22.07.2016