leo_sosnine: (Default)
[personal profile] leo_sosnine
В Windows Server 2003 R2 и выше это, в общем-то, не проблема. А вот ниже... либо продукты третьих фирм, либо ходить и на каждую машину ставить руками. Но если машинок сто? Гм...

Сегодня уткнулся в проблему задеплоить сетевой принтер в домене Windows Server 2003, все рабстанции ХР. Решил таг:

1. В сетевой шаре выкладываем дровишки. Тут хорошо владельцам нормальных принтеров, драйверы которых могут быть установлены через inf файл. Владельцы говнопринтеров от HP, самсунга и т.п. для SOHO тут могут и обломиться. Но с нормальными принтерами хотя бы тысяч за 7 рублей и выше всё норм, нормальные драйверы обычно есть.

2. Доступ к сетевой шаре даём "Компьютерам домена" на чтение. По-умолчанию безопасность даёт чтение пользователям домена и полные права администраторам, а компьютеры домена бесправны. :(

3. На сетевой шаре выкладываем reg-файл такого характера:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\IP_192.168.0.76]
"Protocol"=dword:00000001
"Version"=dword:00000001
"HostName"=""
"IPAddress"="192.168.0.76"
"HWAddress"=""
"PortNumber"=dword:0000238c
"SNMP Community"="public"
"SNMP Enabled"=dword:00000001
"SNMP Index"=dword:00000001

этот рег-файл создаёт ТЦП/ИП порт для подключения к принтеру по адресу 192,168,0,76:9100, сюда надо подставить адрес:порт своего принтера.

4. Создаём стартап скрипт в ГПО в древе "Компутер" (не путать с логон скриптами!) такого характера:

regedit /S \\servergw\distr\prn-deploy\port.reg
net stop spooler
net start spooler
rundll32 printui.dll,PrintUIEntry /if /b "Canon iR2018 UFRII LT" /f "\\servergw\distr\driver\CNLB0R.inf" /r "IP_192.168.0.76" /m "Canon iR2018 UFRII LT" /z /u /q

В первой строке путь до рег-файла меняем на свой. В четвёртой строке название принтера ставим своё (это то название, которое написано в окошке выбора драйвера принтера при обычной установке через "добавить принтер"), потом идёт путь до инф-файла в драйвере принтера, потом идёт название созданного по образцу в п.3 ТЦП/ИП порта, потом опять название принтера. Принтер, прошу обратить внимание, не ставится как принтер по-умолчанию. Чтобы ставился надо добавить /y

Ну а дальше все после ребута получат принтер, сколько бы их не было в этом ОУ/домене.

Скрипт нетрудно будет доработать, если в домене смешанная среда х86-32 и АМД64, для этого надо будет добавить условные переходы по признаку битности операционки и соответственно скармливания им различных драйверов. Но у меня такой задачи не стояло. :)

Также можно скрипт дополнить обратной связью по факту успешного выполнения рундлл32 складывать в к-л сетевую шару отчёт. Также небесполезно по неудачному завершению попытаться выполнить рундлл32 ещё раз, т.к. попалась одна машина, которая по неизвестной причине в первый раз завершала рундлл32 с ошибкой, а во второй раз, тут же запущенная рундлл32 завершалась успешно. Но, поскольку такая машинка была одна, то скрипт я дорабатывать не стал.

Внятных инструкций как деплоить сетевой принтер я не нашёл в сети, даже англоязычной, потому и пишу. Будем впереди плонеты всея. Задеплоить принтер коннекшн к SMB-расшаренному принтеру вообще никаких проблем, инструкций в сети масса. А вот сетевых -- не было.

Кстати, вполне вероятно, что всё это будет прекрасно работать и в 2008/Vista/7 среде.

См. также: http://packratstudios.com/index.php/2008/04/10/cmd-line-local-and-mapped-printers-to-your-will-all-over-your-network/

update

Доработал до проверки "А не стоит ли он уже" и различение платформ (кроме экзотика типа альфы или иа64):

rundll32 printui.dll,PrintUIEntry /Xg /n"Canon iR2018 UFRII dLT" /q /f"%temp%\results.txt"

reg export "HKLM\SYSTEM\CurrentControlSet\Control\Print\Printers\Canon iR2018 UFRII LT" %temp%\canon.reg /y
if %errorlevel% == 0 goto end

if %processor_architecture% == AMD64 goto amd-64

regedit /S \\servergw\distr\prn-deploy\port.reg
net stop spooler
net start spooler
rundll32 printui.dll,PrintUIEntry /if /b "Canon iR2018 UFRII LT" /f "\\servergw\distr\driver\CNLB0R.inf" /r "IP_192.168.0.76" /m "Canon iR2018 UFRII LT" /z /u /q

goto end

:amd-64

regedit /S \\servergw\distr\prn-deploy\vista-7.reg
net stop spooler
net start spooler
rundll32 printui.dll,PrintUIEntry /if /b "Canon iR2018 UFRII LT" /f "\\servergw\distr\x64\driver\CNLB0RA64.inf" /r "192.168.0.76" /m "Canon iR2018 UFRII LT" /z /u /q

:end

Update 2:

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

rundll32 printui.dll,PrintUIEntry /Sr /n"Canon iR2018 UFRII LT" /a\\servergw\distr\prn-deploy\settings.dat

Файл settings.dat делается на одной типовой машине путём ручной настройки всех параметров принтера и выполнения команды:

rundll32 printui.dll,PrintUIEntry /Ss /n"Canon iR2018 UFRII LT" /a\\servergw\distr\prn-deploy\settings.dat

Однако, на 64-битных системах команда ресторации не работает, вопреки документации Майкрософт. Да, это буг. Лечится он патчем в соответствии со статьёй:

http://support.microsoft.com/kb/2443101

Однако, на форуме Петри некоторые юзеры рапортуют, что патч на самом деле этой проблемы не решает:

http://www.petri.co.il/forums/showthread.php?p=249902

Поэтому если в сети есть машины с архитектурой АМД64, то я рекомендую применять настройки принтера путём импорта патча реестра по этому пути:

[HKEY_CURRENT_USER\Printers\DevModePerUser]

Предварительно на типовой машине настраиваем принтер, сохраняем этот ключ в рег-файл и применяем его на все остальные машины на этапе загрузки юзера, т.е. ставим в логон скрипт кмд файл типа:

regedit /S \\server\share\a4-64.reg
net stop spooler
net start spooler

Для 64-битных машин патчик отдельный от 32-битных, по версиям винды вроде бы разницы нет, но если что -- беваре, возможно придётся делать отдельные для ХР и для Висты/7 в довесок к различению архитектур.

Прав на управление службами у юзера нет, поэтому нужно (одно из):

а) их предварительно выдать групповыми политиками на управление службой spooler (Print Spooler)
б) использовать в логон скрипте метод повышения привилегий с сохранением админского пароля при помощи runasspc или аналогичных решений
в) забить и не париться, всё равно после второй перезагрузки компа изменения применятся

В добавок также можно добавить в скрипт проверку факта применённости настроек и их применения лишь в случае, если они отсутствуют, но мне пока лень.

Date: 2011-11-22 08:54 am (UTC)
From: [identity profile] brj.livejournal.com
Спасибо, забрал себе копию :-)

http://brj.pp.ru/wiki/hardware/printers-kb
Page generated Jun. 27th, 2025 06:18 pm
Powered by Dreamwidth Studios