1

Мое приложение запустилось как служба Windows, которая не видит принтер, установленный на моем ПК.
Но если это приложение запускается как обычное приложение Windows, оно может видеть этот принтер.
Как я могу установить этот принтер, который должен быть доступен из службы Windows?

Мне нужно отправить PDF-файлы на этот принтер из службы Windows. Но служба windows не видит мой принтер.
Служба Windows использует функцию Win API EnumPrinters для получения списка принтеров.
Кроме того, функция Win API GetDefaultPrinter не возвращает принтер по умолчанию, если эта функция вызывается из службы Windows.

ОС - Windows 7.
Принтер - HP LaserJet P2055.
Он устанавливается как сетевой принтер на удаленном компьютере.
Я устанавливаю его на свой компьютер, используя следующие шаги:
1. Откройте Устройство и принтеры.
2. Добавьте принтер.
3. Добавьте сетевой принтер.
4. Найти принтер в каталоге, в зависимости от местоположения или функции.

1 ответ1

0

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

Служба Windows, предназначенная для печати, может использовать API-интерфейсы Win32 GDI для печати документов на принтере. Однако при печати из служб Windows есть некоторые соображения. Если все задания на печать можно отправить с учетными данными одного пользователя, служба может быть запущена под учетной записью этого пользователя и будет иметь доступ к принтерам, которые известны этому пользователю на этом компьютере. Если служба должна печатать с использованием учетных данных одного или нескольких пользователей, определенных во время выполнения, перед печатью служба должна вызвать LogonUser(), LoadUserProfile() и ImpersonateLoggedOnUser().

(цитируется по адресу : http://blogs.msdn.com/b/dsui_team/archive/2013/06/24/printing-from-a-windows-service.aspx)

Вы также можете установить свой принтер на весь компьютер (для всех пользователей), используя printui.dll, например:
Add per machine printer connection: rundll32 printui.dll PrintUIEntry /ga /n\\client2\printer2

(запустить rundll32 printui.dll,PrintUIEntry /? чтобы увидеть все варианты)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .