У меня есть приложение службы Windows, которое время от времени должно распечатывать некоторые документы. Насколько мне известно, для печати этих документов моя служба должна запускаться с учетной записью пользователя, отличной от локальной службы или сетевой службы. Итак, я создал учетную запись пользователя, добавил ее в группу администраторов и запустил с ней службу.
С локально установленными принтерами у меня нет никаких проблем, потому что эти принтеры автоматически устанавливаются для всех учетных записей. Чтобы иметь возможность печатать с помощью сетевых принтеров, я создал другое приложение, которое синхронизирует установленные принтеры текущего пользователя, вошедшего в систему, с учетной записью пользователя, которую моя служба использует с командой rundll32.exe printui.dll, PrintUIEntry.
В Vista и Windows7 у меня нет проблем с синхронизацией принтеров, потому что каждый раз, когда принтер должен быть установлен, открывается окно аутентификации, и оно запрашивает соответствующую учетную запись пользователя для установки этого принтера (учетная запись пользователя службы не создается на компьютерах с сетевыми принтерами), но в XP появляется диалоговое окно поиска с надписью «Connecting to {printername}» и перестает отвечать, или иногда он устанавливает принтер, но каждый раз, когда служба пытается распечатать, возникает исключение Win32Exception с «вызовом StartDocPrinter не было выдано »появится сообщение, и в учетной записи пользователя, которая запускает приложение синхронизации, будет показан дублирующийся принтер, и я не смог бы удалить эти принтеры, если только не принудительно (с использованием реестра).
Правильно ли я вообще распечатываю документы с помощью служб Windows? Если да, то как я могу решить вышеупомянутую проблему? А если нет, что, черт возьми, мне делать?
Спасибо.
Почему бы не установить для всех принтеров локальную очередь, чтобы они всегда были локальными принтерами, и у вас нет проблемы?
Вы можете направить локальную очередь на сетевой принтер, создав локальный порт с соответствующим IP-адресом принтера. (Пройдите через мастер добавления принтера, добавьте локальный принтер (не позволяйте ему искать в режиме Plug and Play), создать новый порт, использовать стандартный порт TCP / IP.
Вы можете войти в систему как учетные записи пользователей службы и вручную добавить / настроить / протестировать сетевые принтеры.
Я решил проблему, сначала запросив сетевую аутентификацию на сервере, а затем установив принтер.
Спасибо, ребята, за вашу помощь.
Я думаю, вы можете делать здесь ненужную работу. Если вы устанавливаете принтеры с так называемым «подключением к каждой машине», то принтер будет доступен для всех пользователей и служб на этой машине. Я знаю, что таким образом мы печатаем из Tomcat, работающего как служба. Предостережение: я не уверен на 100%, что это работает для учетной записи Local Service.
Похоже, вы уже знаете о PrintUI.dll Руководство и справочник пользователя PrintUI.DLL
Основные части:
rundll32 printui.dll PrintUIEntry / in / n \ machine \ printer
-или-
rundll32 printui.dll PrintUIEntry / if / f% windir% \ inf \ ntprint.inf / r "lpt1:" / m "HP PSC 500"
Поступая так, как вы описываете, вы можете излишне ослабить вашу безопасность. Службы должны работать с минимальными разрешениями, необходимыми для выполнения их работы. Когда вы запускаете их в учетной записи пользователя, вы можете легко непреднамеренно предоставить свои служебные привилегии, которых у нее не должно быть.