5

Я пытаюсь написать неинтерактивный процесс, который печатает PDF-файлы, и мне нужен совет по его созданию на Windows Server 2008 (и Vista/7).Печать PDF-файлов в WinServer 2008 из неинтерактивного процесса (служба Windows, запланированная задача и т. Д.)

Раньше у нас была запланированная задача (настроенная на запуск учетной записи пользователя или нет), которая будет печатать все PDF-файлы внутри каталога. (Отдельный процесс переместил бы PDF-файлы в каталог.) Во время выполнения это запустило бы другой процесс (либо Adobe Reader, либо Foxit Reader) для печати PDF. Как Adobe Reader, так и Foxit Reader работают в режиме бесшумной печати, поэтому все будет отправлено на принтер по умолчанию для пользователя, который выполнял запланированную задачу. Никакой пользовательский интерфейс никогда не создавался, и все файлы печатались без заминок. Это работало на Server 2003.

Процесс больше не работает на Server 2008. Я не совсем уверен, но я считаю, что это имеет отношение к Session 0 Isolation. Я не могу это доказать. Тем не менее, я могу сказать, что процесс работает как запланированная задача, когда он задан как «Запускать только при входе пользователя». Теперь, когда это работает, он заставляет пользователя войти в систему и, таким образом, не соответствует моим требованиям. (Моя первая подсказка была в this previous question.)

Я не могу определить, как я могу двигаться вперед по этому вопросу. Есть ли способ выполнить мои требования?

Несколько замечаний:

Каждое решение, которое я видел, кажется, использует учетные данные вошедшего в систему пользователя. См. Вопрос, который я связал выше - перечисленное решение, похоже, захватывает токен зарегистрированного пользователя и использует его для запуска программы. (Посмотрите на процедуру GetCurrentUserToken() - возвращаемое значение позже будет использоваться в вызове API CreateProcessAsUser().)

Мой текущий процесс генерирует, насколько я могу судить, интерфейс. Я проверил с помощью ProcMon, что процесс чтения (Adobe или Foxit), кажется, печатает правильно, и сам драйвер печати имеет проблемы. Это подкрепляется попыткой использовать драйвер печати в файл - драйвер печати в файл работает с тремя видимыми шагами и четко заканчивает первый для всех файлов без запуска второй. Итак, как изоляция сеанса 0 влияет на драйвер принтера? Это мне непонятно. (The best documentation I can find on the subject только упоминает, что драйверы принтеров могут быть затронуты, даже если диспетчер очереди печати работает в сеансе 0.)

Печать в качестве службы Windows никогда не работает, даже если этот процесс разрешен «Разрешить взаимодействие с рабочим столом».

Полужирный текст добавлен для противодействия эффекту стены в текстовом режиме.

+0

В Win2k8 GDI + отключен для служб Windows. Я бы предположил, что любой Windows-читатель PDF будет использовать GDI + в какой-то момент, поэтому я не думаю, что это можно реализовать в win2k8. Интересно, решите ли вы когда-нибудь это. – yms

ответ

0

Попробуйте использовать Foxit Reader вместо Acrobat-Reader. Foxit Reader поддерживает правильное выполнение GUI-less/командной строки, также в Windows 2008 и выше!

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

Если вам нужна дополнительная помощь, просто спросите еще раз. Я уже создал скрипт powershell, который запускается в планировщике задач для печати pdf-файлов с помощью Foxit Reader.