![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
В 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 или аналогичных решений
в) забить и не париться, всё равно после второй перезагрузки компа изменения применятся
В добавок также можно добавить в скрипт проверку факта применённости настроек и их применения лишь в случае, если они отсутствуют, но мне пока лень.
Сегодня уткнулся в проблему задеплоить сетевой принтер в домене 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 или аналогичных решений
в) забить и не париться, всё равно после второй перезагрузки компа изменения применятся
В добавок также можно добавить в скрипт проверку факта применённости настроек и их применения лишь в случае, если они отсутствуют, но мне пока лень.
no subject
Date: 2011-11-11 08:54 am (UTC)no subject
Date: 2011-11-22 08:54 am (UTC)http://brj.pp.ru/wiki/hardware/printers-kb
no subject
Date: 2014-01-06 04:00 pm (UTC)