Управление принтерами в Active Directory с помощью скриптов для разных версий ОС

Введение



image

В данном топике я подробно расскажу о том, на какие грабли можно наткнуться при автоматической установке, удалении принтеров средствами Active Directory.


Подготовка AD к установке принтеров


Предполагается, что Active Directory настроена и функционирует. В ней созданы организационные единицы, заведены пользователи и добавлены компьютеры, у пользователей отсутствуют права администратора.
Для начала необходимо сделать 3 вещи:
  1. Разделить компьютеры по версии и архитектуре ОС.
  2. Выделить сетевую папку для хранения драйверов принтеров.
  3. Скачать и распаковать драйвера принтеров в сетевую папку для всех архитектур, созданную в пункте 2.

Разделяем компьютеры по арxитектуре и версии ОС

Я опишу случай, когда целевые компьютеры находятся в различных организационных единицах, при этом имеют разную архитектуру.
  1. Создаем группы безопасности соответствующие каждой архитектуре и версии ОС, пример: win_x64, win_x32. (Я использовал только 2 группы, так как в моем парке компьютеров существуют либо Windows XP x32, либо Windows 7 x64.).
  2. Создаем политики с понятными названиями и ограничиваем доступ к этим политикам только для групп безопасности из предыдущего пункта. Пример: «Политика принтеров x32», доступ только для членов группы win_x32.
  3. Применяем созданные политики ко всем организационным единицам. Самый лучший способ это сделать, по моему мнению — это поместить все OU внутри одной и к ней применить новые политики.
  4. Делаем компьютеры с архитектурой ОС x32 членами группы win_x32, для других архитектур и версий соответственно.

Таким образом, у нас появилась возможность применить определенную политику к компьютерам из разных OU (организационных единиц), что весьма удобно. Просто и надежно.
Разделение можно организовать и другими способами, но в данном посте я эти варианты рассматривать не буду.

Сетевая папка

Создается сетевая папка доступная всем пользователям и компьютерам домена. Думаю, этот этап подробно расписывать нет необходимости. Права на папку — только чтение.

Драйвера

  1. Скачиваем драйвера для всех версий и архитектур.
  2. Распаковываем их до состояния INF файлов. Грабля №1. Если с этим возникают проблемы, то чаще всего драйвера можно найти в скрытой шаре PRINT$ на машине где установлен принтер. Их можно взять оттуда.
  3. Копируем эти файлы у нашу сетевую папку. Для удобства разделяем по подпапкам.

Теперь можно переходить к развертыванию.

Развертывание


Развертывание будет делаться в 2 этапа:
  1. Создание скрипта установки драйвера.
  2. Создание скрипта подключения пользователя к принтеру.

Внимание! Грабля №2 Пункт 1 актуален только для Windows Vista и новее, так как драйвер на Windows XP ставится с правами обычного пользователя и не требует админских прав. Как ни странно.

Скрипт установки драйвера

Этот скрипт помещается в разделе «Конфигурация компьютера» — «Политики» — «Конфигурация Windows» — «Сценарии (запуск/завершение)» — «Автозагрузка»
Создаем файл .BAT такого содержания:
rundll32 printui.dll,PrintUIEntry /ia /m "<Имя принтера 1>" /h "x64" /v "Type 3 - User Mode" /f "<путь к INF файлу драйвера в сетевой папке/x64/>"
rundll32 printui.dll,PrintUIEntry /ia /m "<Имя принтера 2>" /h "x64" /v "Type 3 - User Mode" /f "<путь к INF файлу драйвера в сетевой папке/x64/>"

Грабля №3 Имя принтера можно и нужно узнать в свойствах сервера печати Windows на машине, где драйвер уже установлен. Наверняка есть и в inf файле.

Теперь драйвер принтера будет устанавливаться при загрузке системы автоматически. Если применить его ко всем компьютерам с Windows Vista и новее, то при срабатывании скрипта подключения принтера не выскочит ошибка о недостаточности прав.

Скрипт подключение принтеров

Этот скрипт помещается в разделе «Конфигурация пользователя» — «Политики» — «Конфигурация Windows» — «Сценарии (вход/выход из системы)» — «Вход в систему»
Для обеих архитектур скрипт одинаков.
rem Подключаем сетевой принтер "officeprint" на сервере server
rundll32 printui.dll,PrintUIEntry /in /n \\server\officeprint /q
rem Подключаем сетевой принтер "print" на сервере server1
rundll32 printui.dll,PrintUIEntry /in /n \\server1\print /q
rem Ставим его по умолчанию
rundll32 printui.dll,PrintUIEntry /in /n \\server1\print /y /q

Теперь при входе в систему пользователю автоматически подключатся принтеры и по умолчанию выберется принтер «print» на server1.

Автоматическое удаление принтеров



Все достаточно просто.
Создаем .BAT файл вот с таким содержанием.
REG DELETE "HKEY_CURRENT_USER\Printers\Connections" /f
Затем делаем его скриптом на выход пользователя из системы.
Когда пользователь в следующий раз зайдет в сеть, у него будут только те принтеры, которые установятся политикой.
Полезно при переезде принтера с одного принт-сервера на другой.
Грабля №4 Удаление ветки реестра лучше производить при выходе пользователя из системы, а не при входе перед подключением принтеров.
Для этого требуется перезагрузка службы печати, которая может перезагружаться достаточно долго. Это черевато ситуацией, когда служба еще не запустилась, а скрипт подключения уже сработал и вызвал ошибку.

Автоматическое удаление драйверов принтеров


Данная операция может потребоваться при обновлении драйвера.

Желательно удалять вручную, но если принтеров очень много, то делается это вот такой командой:
rundll32 printui.dll,PrintUIEntry /dd /m "<Имя принтера>"
Грабля №5 При повторном срабатывании скрипт с такой командой выдаст ошибку, которая может поставить пользователей в тупик.
Поделиться публикацией
Ой, у вас баннер убежал!

Ну. И что?
Реклама
Комментарии 16
  • НЛО прилетело и опубликовало эту надпись здесь
      0
      Например тем, что на Vista и 7ке без прав админа скрипт подключения заругается на отсутствие таковых.
      А если на все машины еще до логина пользователя установить драйвер (или вшить в дистрибутив), то такой ситуации не возникает.
        0
        В ГП можно определить права на установку драйверов устройств. Таким образом принт-сервер + соответствующий доступ значительно облегчают жизнь ;)
          0
          После многочисленных экспериментов с политикой, остановился на таком варианте. На семерках даже с включенной политикой скрипт не мог поставить автоматом драйвера. Причина — отсутствие прав. В общем надоело воевать, решил проблему радикальным методом.
            0
            В малых сетях с 7-ой нуна либо WPA понижать, либо на PowerShell переходить ;)

            А вообще статья позитивная. Взял некоторые моменты себе на заметку :)
              0
              Можно по-умолчанию устанавливать заслуживающие доверие драйвера. Надо через политику эту проверку отключить, вроде тут политики\административные шаблоны\система\установка драйвера\цифровая подпись драйверов устройств. Может еще это technet.microsoft.com/ru-ru/library/cc753269%28WS.10%29.aspx поможет.
                0
                Спасибо, возьму на заметку :)
        0
        Попробуйте вместо ручного определения x86 — x64 воспользоваться WMI filtering в групповых политиках. Вот пример
          +1
          WMI фильтр — это, конечно, замечательно, но ручное распределение дает несколько приятных преимуществ. Например, возможность переустановить софт только на одном конкретном компьютере, не затрагивая других. Ну или поставить софт, который необходим на этом компьютере и на компьютеры из других OU простым добавлением в группу.
            0
            Никто ведь не запрещает совместить эти варианты: используйте одну группу безопасности для всех необходимых компьютеров, а какая архитектура, или еще какие-то критерии (объем оперативы, объем свободного места на диске) — будут определяться через WMI.
              0
              Согласен. Совмещение — рулит :)
          0
          У меня АД на 2008 R2, у людей тачки в перемешку ХР и Win 7.
          В ГП простенький скрипт стоит на группе:

          var WshNetwork, objArgs, strErrMsg, strPrinterPath;
          WshShell = WScript.CreateObject(«WScript.Shell»);
          objArgs=WScript.Arguments.Unnamed;
          strPrinterPath=objArgs.Item(0);
          WshNetwork=WScript.CreateObject(«Wscript.Network»);
          try
          {
          WshNetwork.AddWindowsPrinterConnection(strPrinterPath);
          WScript.Sleep(5000);
          WshNetwork.SetDefaultPrinter(strPrinterPath);
          }
          catch (objError){}

          А в свойствах ГП для каждой группы я указываю какой принтер должен подцепляться.
          Получается в настройках группы стоит выполнение этого скрипта (путь к нему) и принтер который добавлен на принт-сервер (вида \\IP-сервера\Имя принтера).

          Скрипт висит на логоне и как только пользователь заходит на тачку или сервер или еще куда, с ним вместе подтягивается принтер.
            +1
            а GPP не рассматриваете?
              0
              Верно :) Пока не рассматриваю. В дальнейшем — возможно.
              0
              А вот так можно добавлять сетевые принтеры удалённо при помощи WINRS/либо через стартап скрипты

              PUSHD «C:\Windows\System32\Printing_Admin_Scripts\en-US>»

              Cscript prnport.vbs -a -r IP_192.*.*.* -h 192.*.*.* -o raw -n 9100
              Cscript prnmngr.vbs -a -p «HP LaserJet 3390 / 3392 PCL5» -m «HP LaserJet 3390 / 3392 PCL5» -r «IP_192.*.*.*»
                +1
                А не проще управлять принтерами через Print Management?

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                Самое читаемое