Печать путем выполнения процесса в службе Windows

У меня есть служба Windows, которой необходимо запустить процесс для отправки файла на принтер (я нашел это решение там https://stackoverflow.com/a/4875755/1228738). Я делаю это с помощью Process.Start (). Моя проблема в том, что ничего не происходит.

Служба фактически установлена ​​на моем компьютере разработчика (win7, x64). Я пробовал установить его как ЛОКАЛЬНАЯ СИСТЕМА, СЕТЕВОЙ СЕРВИС, ЛОКАЛЬНЫЙ СЕРВИС, каждый раз получая один и тот же результат.

Я пробовал запустить свой процесс таким способом:

Process p = new  Process();
p.StartInfo.FileName = "C:\\Program Files (x86)\\Foxit Software\\Foxit Reader\\Foxit Reader.exe";
p.StartInfo.Arguments = "-p myFile.pdf";
p.Start();

и

Process.Start("C:\\Program Files (x86)\\Foxit Software\\Foxit Reader\\Foxit Reader.exe", "-p myFile.pdf");

а также

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = "C:\\Program Files (x86)\\Foxit Software\\Foxit Reader\\Foxit Reader.exe";
startInfo.Arguments = "-p myFile.pdf";

Process.Start(startInfo);

Когда я выполняю тот же код в приложении winform, все работает нормально, файл отправляется на принтер. Но в Службе Windows ничего не происходит.

Я видел это сообщение https://stackoverflow.com/a/6271309/1228738, в котором объясняется, почему я не вижу UI, это нормально, у меня все равно нет UI. Но, как сказано в разделе комментариев, процесс без ввода данных пользователем должен быть в порядке. Процесс, который я запускаю, не требует участия пользователя.

Единственное, о чем я могу думать прямо сейчас, это то, что из-за изоляции сеанса (https://stackoverflow.com/a/5063750/1228738) сервис не может найти установленных принтеров ... Неужели в этом дело? Если да, есть предложения, как это обойти? А если нет, то что не так?

Спасибо!

ИЗМЕНИТЬ №1

Я попытался запустить службу с моей учетной записью, и она работает, поэтому я думаю, что мои опасения подтверждаются ... у пользователей LOCAL SYSTEM и NETWORK SERVICE не установлены принтеры.

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

ИЗМЕНИТЬ №2

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

Думаю, сейчас этот вопрос можно закрыть. Спасибо за вашу помощь.


person Fid    schedule 28.02.2012    source источник
comment
Это может быть связано с тем, что приложение пытается отобразить диалоговое окно печати, но сеанс не является интерактивным (проверьте журнал событий приложения), или это может быть, как вы предлагаете, из-за того, что у пользователя, от имени которого запущена служба, не настроены принтеры. Вы можете войти в систему как пользователь, от имени которого работает служба (если возможно), и настроить принтеры.   -  person Paul Ruane    schedule 29.02.2012
comment
Когда я делаю точно такой же код в приложении winform, файл отправляется на принтер без диалогового окна печати, поэтому я ожидал бы такого же поведения от службы. Я попробую что-то похожее на то, что вы предлагаете, и запущу службу с моей учетной записью, и посмотрю, работает ли она таким образом. Спасибо   -  person Fid    schedule 29.02.2012
comment
также, где находится myFile.pdf? Есть ли у службы доступ к этому пути?   -  person roymustang86    schedule 29.02.2012
comment
Да, я только что протестировал с разрешениями полного управления для сетевой службы учетной записи в папке, где находится файл, безуспешно. Спасибо за предложение.   -  person Fid    schedule 29.02.2012
comment
Нет. Это невозможно сделать с помощью службы Windows.   -  person Cody Gray    schedule 29.02.2012
comment
Мне не очень нравится этот ответ, но попробуйте это. Введенная вами информация StartInfo состоит только из имени файла и аргументов. Попробуйте указать имя пользователя и пароль, в котором вы хотите запустить приложение печати. ​​По умолчанию я не думаю, что это возможно в локальной системной учетной записи. Попробуйте свою локальную учетную запись администратора.   -  person Pulathisi Bandara    schedule 11.11.2015


Ответы (3)


У меня тоже была эта проблема, этот трюк решил ее

Перейдите к службам ---> Дважды щелкните нужную службу ---> перейдите на вкладку входа в систему

Укажите учетные данные для входа, с которых был установлен принтер.

Запустите службу, затем проверьте очередь принтера.

Причина: в учетной записи локальной системы эти принтеры не установлены!

См. Снимок экрана ниже. введите описание изображения здесь

person Edwin O.    schedule 14.12.2014

Посетите эту страницу MSDN: http://support.microsoft.com/kb/324565

Согласно этой странице, вы не можете печатать со страниц ASP.NET или служб Windows с помощью .NET.

person Icemanind    schedule 29.02.2012
comment
Спасибо за ссылку, но я не думаю, что она применима к моей ситуации. Я не использую классы печати .NET Framework для печати. Я просто запускаю .exe, который принимает аргумент, говорящий ему распечатать документ. - person Fid; 29.02.2012

Решение состоит в том, чтобы предоставить общий доступ к локальному принтеру и позвонить в Foxit с

-/t yourfile.pdf \\localhost\YourSharedPrinter

Таким образом, вашему сервису не нужны ни UserProfile, ни DefaultPrinter.

person Louis Haußknecht    schedule 20.06.2012