Разрешить принтеру печатать из выбранного приложения может быть сложно. В Windows такого механизма нет, но вы можете обойти это как-нибудь. У меня есть грязная идея, вы можете подумать об этом больше, и, возможно, вы найдете что-то лучшее или менее сложное.
Вы можете управлять разрешениями на принтеры, включая локальные принтеры в Windows (начиная с Windows 2000).
I. Блокируйте разрешения на печать для гостя (или группы гостей или другого пользователя, который должен использовать вашу программу) - чтобы отключить обычную печать для этой учетной записи / группы.
- Перейти к Устройства в принтерах (в панели управления)
- Щелкните правой кнопкой мыши на принтере и выберите "Свойства принтера" (а не только "Свойства"!)
- Там должна быть вкладка Безопасность. Вы можете управлять разрешениями для учетных записей и групп.
- Настройте разрешения для своей учетной записи "Гость" (или группы "Гость", решать только вам).
II. Подготовьте систему и ваше приложение для печати от имени другого пользователя.
Добавьте дополнительную учетную запись Windows и дайте ей возможность распечатать. Возможно, вы захотите отключить для него обычный вход в систему (я думаю, что удаление этого пользователя из группы «Пользователи» не позволит этому пользователю появиться на экране входа в систему).
Поделитесь своим принтером (обычно, как для сети)
В вашем приложении - используйте функцию, соответствующую вашему языку программирования, которая выполняет команды командной строки. Для .NET это может быть System.Диагностика.Процесс.Start (строка Command), в Python os.system (cmd) и т.д.
net use \\localhost \printer_share_name /u:nonguestaccountname nonguestaccountpassowrd "
Это отобразит ваш принтер как другого пользователя (надеюсь - мгновенно), используя разрешение на печать с учетной записью nonguestaccountname
(печать будет выполнена как другой пользователь, которого мы создали ранее).
- Возможно, вам придется подождать, пока не будет выполнено сопоставление принтера, прежде чем пытаться печатать, обрабатывать ошибки и т.д.
- Управляйте печатью в приложении
Выполнение:
net use \\localhost \printer_share_name /delete
Это распечатает ваш принтер (надеюсь - мгновенно).
Все это должно занять меньше секунды - хотя в это время пользователь может печатать из любого приложения, в моей идее есть дыра, но обычные пользователи, вероятно, не поймут, что происходит, и этого должно быть достаточно, чтобы сэкономить бумагу / чернила / тонеры в компании или что-то :)
С сетевым принтером - это может быть ненадежно, медленно и может зависеть от качества / нагрузки сети LAN, но если вы сопоставляете локальный принтер как сетевой принтер - он должен работать очень быстро.
Как я писал ранее - это очень грязный метод, но я не нашел другого метода, кроме временного сопоставления принтеров, как другой пользователь. Это не на 100% надежно и безопасно, но для некоторых целей вы можете использовать его.
Все, что я написал выше, можно автоматизировать с помощью сценариев CMD или VBS в установщике вашего приложения.
ДРУГОЙ МЕТОД может выполнять принтер для совместного использования / отмены общего доступа, но в любом случае вам потребуется дополнительная учетная запись Windows.
Дополнительные советы:
Совместное использование принтера из командной строки
(замените en-US в пути к вашей локали, если вы не используете английские окна)
Редактировать:
Возможно, вам придется проверить это в Vista Basic и XP Home edition, они могут иметь упрощенный интерфейс управления разрешениями, а некоторые функции скрыты (я помню, что в некоторых упрощенных выпусках Windows нет вкладки "Безопасность" или чего-то в этом роде).