Как заблокировать доступ к принтеру на время заказанного пакета заданий на печать - PullRequest
1 голос
/ 22 декабря 2010

Существует ли способ программной блокировки устройства сетевой печати перед печатью большой партии документов и последующего ее выпуска?Мы преимущественно используем C #, VS2010, .NET 4.0 Framework.

В нашей компании существует множество устоявшихся процессов, которые требуют большого количества печати.Многие из них предусматривают программную печать определенного небольшого документа многократно с разными параметрами каждый раз.В результате получается большая партия из нескольких сотен страниц, которые должны быть в порядке.

К сожалению, поскольку партия отправляется на принтер в виде серии небольших работ, а не одной большой работы, если другой пользовательв то же время, печать на том же принтере, их работа в конечном итоге может оказаться между страницами большой партии, что испортит порядок большой партии, вызвав поиск иголки в стоге сена, и разочаровав пользователя.кто напечатал большую партию.

Очевидно, это породило культуру в нашей компании, в которой каждый раз, когда пользователь собирается печатать, они рассылают массовое электронное письмо всей компании, говоря: «Я печатаюк тому-то и такому принтеру, я буду использовать его около часа, пожалуйста, не печатайте на нем, я снова напишу по электронной почте, когда закончу. "

Я бы хотел иметь возможностьчтобы программно заблокировать принтер, отправьте пакет заказанных заданий на печать, а затем отпустите принтер.В идеале, задания все еще могут быть отправлены на принтер, но им придется ждать в очереди, пока большая партия не завершит работу и принтер не будет выпущен.К сожалению, у нас не было большого успеха в достижении этой цели в прошлом.Кто-нибудь еще решал подобную ситуацию, используя .NET?

Ответы [ 3 ]

1 голос
/ 28 февраля 2014

Решение 1. Если вы пишете или имеете доступ к коду, отправляющему задания Это эффективно создаст 1 большую работу и сохранит их вместе, даже если задания отправляются с других рабочих станций и серверов.

В этом случае вы можете отправить несколько заданий и вызвать функцию SetJob со структурой JOB_INFO_3 в Spooler API, чтобы связать одно задание с другим.

Все задания должны быть связаны до того, как их буферизация завершена вызовом EndJob.

Это более подробно описано в разделе «Примечания» для SetJob .

Решение 2: Изменить приоритет Это сохранит все задания вместе при условии, что этот сервер \ рабочая станция является единственным источником, отправляющим на принтер.

Предполагая, что вы отправляете задания по порядку, вы можете установить Приоритет с помощью функции SetJob со структурой JOB_INFO_1 и повысить приоритет. Сначала необходимо вызвать GetJob , чтобы заполнить структуру JOB_INFO_1, изменить приоритет и затем вызвать SetJob.

1 голос
/ 24 января 2011

Идея FrustratedWithFormsDesigner об установке драйвера печати Windows может работать, если все клиенты принтера являются компьютерами Windows. Если у вас также есть Mac, Linux-блоки или другие устройства, подключенные к принтеру, вам потребуется реализовать аналогичную оболочку для каждой из этих систем.

Похоже, вам нужно приложение, которое может объединить каждое из этих заданий в одно задание на печать.

Несколько компаний выпускают бесплатный драйвер для печати PDF. Я использовал Bullzip PDF драйвер и раньше с хорошим успехом.

Затем вы можете использовать библиотеку C #, например iTextSharp , чтобы объединить полученные PDF-файлы в один большой документ, который будет напечатан как одно задание.

0 голосов
/ 24 января 2011

Принтеры, а точнее очереди принтеров, имеют списки ACL в Windows.Изменение списка управления доступом таким образом, чтобы только у одного пользователя было разрешение на печать, должно быть возможным.

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

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

Для этого потребуется P / Invoke.

  1. Вызов GetPrinter с уровнем 3 и экземпляром PRINTER_INFO_2 предоставит вам текущий дескриптор безопасности.
  2. Обновите SECURITY_DESCRIPTOR ссылается на PRINTER_INFO_2.pSecurityDescriptor с заменой ACL (и сохранить оригинал).
  3. Вызов SetPrinter с обновленным PRINTER_INFO_2.

Повторите процесс, используя восстановленный ACL.Я предполагаю, что это нужно будет выполнить на сервере, на котором размещена очередь.

(Использование какого-либо метода для отправки всего в виде одного документа может быть проще, и во избежание того, чтобы каждый мог изменить разрешения очереди.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...