Печать через веб-браузер из службы, работающей в Windows 2012

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

Это отлично работает на Server 2003, 2008r2 и т. Д., Но не работает на Server 2012, ТОЛЬКО ЕСЛИ он работал как служба. работает как консольное приложение.

Проблема:

Он будет нормально загружать веб-страницы и вызовет Print (), Print () вернется, но на принтере по умолчанию ничего не будет напечатано: задание на печать вообще отсутствует.

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

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

Похоже, что-то фундаментальное изменилось для процесса обслуживания в server 2012.

Обновление 1. Это может быть связано с Как распечатать HTML-документ из веб-службы?

Однако он отлично работает для меня до сервера 2012 года.

Обновление 2. Это не работает, даже если вся печать выполняется в отдельном процессе, т.е. моя служба запускает процесс для печати, это тоже не работает. Все работает нормально, если я запускаю тот же код в консольном режиме. Это определенно не проблема потоковой передачи, а что-то глубокое в сервере 2012.

Теперь вопросы:

Что изменилось? Почему перестало работать?


person Yuan    schedule 05.12.2013    source источник
comment
В отличие от сайтов форумов, мы не используем «Благодарности», «Любая благодарная помощь» или подписи на Stack Overflow. См. Если «Привет», «спасибо» слоганы и приветствия убирать из сообщений?.   -  person John Saunders    schedule 05.12.2013
comment
@JohnSaunders Спасибо, что сообщили мне в следующий раз, когда я смогу сэкономить на вводе 6 символов и вашем времени на его редактирование. Ой, подождите, это "Спасибо" поверх комментария.   -  person Yuan    schedule 05.12.2013
comment
Это дубликат stackoverflow.com/questions/15834064/   -  person NineBerry    schedule 04.02.2014


Ответы (1)


На странице http://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/fdcfa0fa-50aa-4a61-be79-5b4c8f65fbf7/ мы видим, что об этом было сообщено в Microsoft и подтверждено как ошибка в Windows 8 и Windows Server 2012.

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

По заявлению Microsoft, эта ошибка была устранена в Windows 8.1 и Windows Server 2012 R2. Однако мы все еще могли воспроизвести его в Windows 8.1.

На том же сайте Microsoft предлагает обходной путь. Этот обходной путь решил проблему для нас в Windows 8.1. Вероятно, он также работает в Windows 8 и Windows Server 2012.

Обходной путь выглядит следующим образом:

  1. Откройте Regedit и перейдите в HKEY_CLASSES_ROOT \ CLSID {BA7C0D29-81CA-4901-B450-634E20BB8C34}

  2. Проверьте значение записи реестра «AppID». В нашем случае это был {AA0B85DA-FDDF-4272-8D1D-FF9B966D75B0}

  3. Теперь перейдите в HKEY_CLASSES_ROOT \ AppID {AA0B85DA-FDDF-4272-8D1D-FF9B966D75B0} (или соответствующее значение, которое вы нашли в своей системе)
  4. В этом разделе реестра удалите записи с именем «AccessPermission», «LaunchPermission» и «RunAs».

Поскольку это ошибка Windows, вы не можете исправить ее в своем коде. Обходной путь может иметь побочные эффекты, но пока мы их не видели в нашем сценарии.

person NineBerry    schedule 04.02.2014