Delphi Win32 Service «Выбранный принтер недействителен» ошибка на 64-битном стандартном сервере 2008 - PullRequest
4 голосов
/ 06 января 2011

Я разработал простой win 32 сервис в delphi 7, который выполняет некоторые операции печати.Все отлично работает на наших компьютерах с XP, но не работает на целевом стандартном сервере Windows 2008 .Когда я добавляю блок try, кроме блока, к оператору печати, это приводит к ошибке «Выбран принтер недействителен» .

Когда я проверяю объект Printer на счетчик принтеров и запись событияиз всех принтеров, доступных в объекте принтера, в файл, он работает нормально.Только когда я пытаюсь выполнить печать (на любом локальном и сетевом принтере), она терпит неудачу.

Основываясь на большом количестве исследований, проведенных с помощью Google, я нашел довольно много предложений по использованию локального, сетевого или специального действия., LogonAsUser, ImpersonateUser, LoadUserProfile и т. Д., И т. Д., Но ничего не работает.Я также установил безопасность на установленных принтерах, чтобы они были доступны каждому.

Эта штука действительно сводит меня с ума.С благодарностью за любую помощь.

Спасибо

Ответы [ 3 ]

5 голосов
/ 06 января 2011

Вероятно, это связано с изоляцией сеанса 0, которая была представлена ​​в Vista.Службы всегда запускаются в сеансе 0, но в XP и более ранних версиях первый пользователь, который войдет в систему, также запускается в сеансе 0, что позволяет службам получать доступ к рабочему столу этого пользователя (что позволяет использовать «интерактивные» службы) и ресурсам (таким как общие ресурсы и принтеры),В Vista и более поздних версиях пользователи больше не работают в сеансе 0, поэтому у служб больше нет доступа к пользовательским ресурсам.Служба должна олицетворять учетную запись пользователя, к которой она хочет получить доступ.

3 голосов
/ 06 января 2011

Всегда трудно ответить на вопрос «это не работает».Но я могу предположить.Microsoft предупреждала о печати из службы в прошлом.Я думаю, что проблема заключается в том, что драйверы принтеров редко предназначены для работы в среде обслуживания, которую предоставляет Windows 2008.Службы работают в изолированном сеансе, они больше не могут взаимодействовать с рабочим столом.Драйверы принтеров, как правило, слишком болтливы и делают что-то вроде подсказки пользователю о наличии замятия бумаги.Или что пришло время покупать новый одобренный заводом картридж с тонером.Это плохо работает в сеансе 0, никто не может слышать это крик.Совершенно недиагностируемо, вы просто не можете сказать, почему служба закрылась.

Может быть, они прибили это в 2008 году и полностью заблокировали.Не знаю, вы найдете людей, которые знают это на serverfault.com

0 голосов
/ 14 марта 2013

Я получаю такую ​​же ошибку, большая работа в Google сделана и пришла http://www.codenewsfast.com/cnf/article//permalink.art-ng1612q9464

Похоже, что принтерный модуль delphi 2007: Printer.pas не предназначен для Vista и выше. Ссылочная запись дает возможность изменить источник Printer.pas. На Vista это решило мою проблему.

...