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 или аналогичных решений
в) забить и не париться, всё равно после второй перезагрузки компа изменения применятся

В добавок также можно добавить в скрипт проверку факта применённости настроек и их применения лишь в случае, если они отсутствуют, но мне пока лень.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting
Page generated Jul. 21st, 2025 09:06 pm
Powered by Dreamwidth Studios