image

Здравствуй, уважаемый %user%. Сегодня я расскажу о том, как я написал пользовательскую систему для обеспечения возможности пользователям самим устанавливать требуемые для них принтеры. Немного расскажу о месте где я работаю, чтобы было понятно зачем я это сделал. Заранее скажу, что о существовании компонента роли в Windows Server 2012 R2, которая даёт возможность установить принтер с браузера я знал. Но мне хотелось изобрести свой велосипед, да и ограничения здесь будут наверное в фантазии. Кому стало интересно добро пожаловать под кат. Для не терпеливых сразу скажу, что скриншоты в конце статьи.

Немного о работе


Работаю я в хелпдеске в некой большой организации, которая имеет много филиалов. Имеется более тысячи сотрудников работающие перед компьютерами. Можно догадаться, что есть большой зоопарк сетевых принтеров, есть отдельные работники отвечающие за работоспособность принтеров. Установку принтеров компьютерам осуществляем мы – хелпдеск. Очень часто сотрудники разных отделов переходят из одного рабочего места в другое, приходят или увольняются, или вообще меняют должность и профессию и так далее. Куча всего интересного. Соответственно из-за этого очень часто поступают звонки к нам в хелпдеск о просьбе установить им принтер. Понимаете, попросить пользователя, сказать IP адрес принтера, это все равно что попросить обезьяну сварить суп. Приведу пример диалога (реальный случай):

U – user, Я - я
U- Здравствуйте, это хелпдеск туда я попал?
Я- Да. Правильно. Вы туда попали
U- Помогите мне пожалуйста установить принтер на мой компьютер
Я-Хорошо, скажите мне пожалуйста имя вашего компьютера.
U-Имя моего компьютера comp-01 (имя вымышленное)
Я-Какой принтер вам поставить? (Подключаясь к компьютеру)
U- HP LaserJet 600, он находится в %place%
Я – расположение принтера мне ничего не дает (и правда поменяют его другим принтером так как первый испортился, или поменяют его место). Хорошо, можете ли вы мне сказать ip адрес этого принтера?
U- ….
Пауза на конце трубки. Я аж услышал, как зашевелился у пользователя мозг, пошла кровь из ушей и наконец он спросил
U- Простите что? Айми? Что вам сказать? Айми адрес?
Я – Айпи, айпи адрес.
U- Айпи? А что это такое? Как можно на него посмотреть?
Я –Ладно скажите кроме вас кто-то еще этим принтером пользуется?
U-Ну им пользуется %another_user%
Я-Пожалуйста попросите у него имя компьютера и получите разрешение чтобы я на секундочку к нему подключился
U- Ок, сейчас (и слышу приглушенный голос того как он спрашивает у %another_user% имя компьютера и разрешение на подключение)
Я-…..(думая про себя: айми айми айми, елки палки какую рифму на айми можно придумать)
U-Алё
Я- Да, я вас слушаю
U- Имя компьютера comp-02, можете подключаться
Я- Попросите %another_user% показать мне принтер, которым он постоянно пользуется (подключаюсь к компьютеру)
U- Ок, сейчас (опять приглушенный голос)…… — Вот этот
Я- Ок, хорошо, я понял всё не буду вас задерживать на линии сейчас сам всё поставлю и настрою
U- Хорошо, спасибо. Однако вы мне не сказали, что такое айми.
Я- Наверное, вы имели в виду айпи. Ну сложно будет объяснить сейчас, так как звонков многовато, но в общем это адрес устройства в сети.
Вы слышали когда-нибудь как ломается мозг у гуманитария? Я услышал этот звук, знаете такой глухой звук с брызгами большого количество информации с содержанием одной лишь только «воды».
U – ....(долгая пауза)… Ясно. Я отойду по делам а вы поставьте принтер
Я- Да, хорошо, до свидания

А теперь представьте, что каждый третий звонящий в хелпдеск, с просьбой установить принтер в таком же состоянии. Как быть? Данного рода диалоги очень сильно утомляют, да и объяснить юзверю как напечатать конфигурацию устройства, чтобы посмотреть на IP принтера, это что-то сверхтяжелое. Значит нужна какая-то автоматизация. А что если собрать централизованно все принтеры на один отдельный принтер сервер, написать некий простой веб-сайт с дружелюбным интерфейсом. Пару кликов и принтер установился. Вызов принят.

Все не так и сложно как кажется


Попросил системных администраторов выделить отдельный сервер на Windows Server 2012 R2.

На принтер сервере

  • Установил роль Printer Sever
  • Создал папку scripts$, чтобы хранить скрипты установки принтеров
  • Установил XAMPP
  • Добавил apache и mysql как службу в автозагрузку, чтобы в случае перезагрузки сервера, веб-сайт не грохнулся

С принтерами:

  • Наклеил на все принтеры до которых руки доходят наклейки с их номерами и установил их на принтер сервер. Порядковый номер — это некий идентификатор для принтера. Где бы он не находился юзверь всегда сможет найти его по порядковому номеру. К примеру: «HP LaserJet 600 Printer #id %filial%», где %filial% — имя филиала, #id уникальный порядковый номер принтера. Распечатывается бумажка с порядковым номером и клеится на принтер. Знать пользователю даже имя принтера не обязательно. Совпал номер с тем что на сайте – значит он и есть.
  • Договорился с менеджерами филиалов, попросил выделить кого-то знающего в филиале чтобы собрали и отправили мне имена, ip адреса принтеров и наклеили их номера порядковые. Добавил все принтеры по одному на принтер сервер.

Начинаем программировать


Веб-сайт построен на PHP написанием самописного MVC движка, с помощью использования только редактора Notepad++, Google и браузера (да – только по хардкору). Знаниями по какому-то фреймворку не обладаю, изучать лень, использовать javascript фреймворки в 2к17?, да и не слишком ли много для принтеров?

Поставим цель, что нам нужно от этой системы:

  • Максимально простая и наглядная для пользователя
  • Возможность создания учетных записей администраторов
  • Возможность добавлять\удалять принтеры администраторам
  • Возможность добавлять\удалять филиалы администраторам
  • Наличие какой-либо справочной информации для пользователя
  • Смена языка
  • Возможность устанавливать принтеры не одним, а несколькими методами (скриптами)

Определим структуру проекта:

  • App
    1. Configs
    2. Controllers
    3. Locale
    4. Views

  • Uploads

В корневой папке создадим файл index.php добавим код:

<?php
		//стартуем сессию
	session_start();

	//загружаем все классы
	spl_autoload_register(function ($class){
		include './app/controllers/' . $class . '.php';
	});
	
	//инициализируем главный контроллер. Именно через него будут поступать все запросы
	$controller = new Controller($_GET, $_POST);
?>

В папке configs создадим файл database.php:

<?php
	define("HOST", "localhost");
	define("USER", "root");
	define("PASSWORD", "OUR_PASSWORD");
	define("DATABASE", "printer");
?>

Зайдем в браузере в phpmyadmin, создадим базу данных printer с использованием кодировки utf8_general_ci. Создадим 3 таблицы с именами branches, printers, users.

Структура branches:
Имя Тип Дополнительно
Id int(6) AUTO_INCREMENT, PRIMARY, UNIQUE
branch_name varchar(255)
image varchar(255)

Структура printers:
Имя Тип Дополнительно
Id int(6) AUTO_INCREMENT, PRIMARY, UNIQUE
Name varchar(255)
branchid int(6) По умолчанию значение: 1
description text
ipaddress varchar(255)
image varchar(255)
File1 varchar(255)
File2 varchar(255)
File3 varchar(255)

Структура users:
Имя Тип Дополнительно
Id int(6) AUTO_INCREMENT, PRIMARY, UNIQUE
Login varchar(128)
Token varchar(128)
password varchar(128)
lang varchar(10)
logindate varchar(255)

Как видно из таблиц branchid определяет к какому филиалу относится принтер (получив значение его id).

Создадим запись с id равной 1, именем филиала «none» и image значением «none». Эта запись нужна для того чтобы задавать принтеру не установленный филиал. Первая запись захардкожена и не отображается в списках филиалов, как и для юзверей так и в админке. Её удалить нельзя.

Класс Database я нашел в просторах интернета. В нем имеется функция для подключения к нашей базе данных, с использования значений для подключения от файла database.php находящийся в папке configs и функция для осуществления запросов к БД.

Класс Info используется для получения, изменения, удаления данных из БД. Именно с использованием этого класса осуществляются все операции в системе.

Одним из важных классов является класс Controller.php. Как видно из названия этот класс является контроллером, который принимает GET и POST запросы в __construct($get, $post) из index.php. Получив определенный запрос он собирает куски страницы во едино соответственно требуемому запросу и выполняет требуемые функции из Info.php.

Класс Views является классом, который загружает куски страницы. Каждая страница имеет свое название соответствующее php файлу в папке Views. Так к примеру, чтобы отобразить главную страницу, следует написать:

$views = new Views;
$views->addView('header', 'header.php');
$views->addView('menu', 'menu.php');
$views->addView('dashboard', 'dashboard.php');
$views->addView('footer', 'footer.php');

В этом же классе определяется текущий язык пользователя, загружается локализация из ini файла и создается переменная $lang, которая уже используется в самом куске страницы. Пример кода главной страницы (dashboard.php):

<div class="dashboard">
	<div class="container">
		<h1><?php echo $lang['DASHBOARD_HEADER']; ?></h1>
		<p><?php echo $lang['DASHBOARD_TEXT']; ?></p>
		<br>
		<br>
		<p><a class="btn btn-primary btn-lg" href="index.php?branches" role="button"><?php echo $lang['DASHBOARD_INSTALL']; ?> »</a></p>
		<img class="dashboard-img" src="app/views/img/printer_icon.png">
	</div>
</div>

В папке views так же есть файлы css, javascript. За основу CSS стилей я использовал Bootstrap.

Класс Lang определяет текущий язык пользователя. Сперва он пытается получить куки «cookie_lang». Если не обнаруживает его, то ставит по умолчанию русский язык. Функция getLangArray() загружает нужный ini файл и возвращает массив вида «ключ» — > «значение». Именно эта функция используется в классе views.

Что мы получили


Пользователь заходит на главную страницу. Там описание того куда он попал и кнопка, которая открывает список всех филиалов. После того как пользователь выберет филиал, откроется список принтеров. Принтеры отображаются в виде сетки, где их фотографии и их названия. Пользователь выбирает принтер, открывается страница с выбранным принтером, где есть большая кнопка «Установить» (также там информация о принтере, его IP адрес). При нажатии на эту кнопку скачивается bat файл, который в свою очередь открывает vbs скрипт, расшаренный в папке scripts$ на принтер сервере. Проблема в том что если закачивать файл vbs, то вместо того чтобы скачать его, браузер открывает этот файл у себя в новой вкладке. Поэтому пришлось так извращаться. Vbs файлы на шаре папке тоже рассортированы вместе со своим bat файлом по папкам. К примеру, ниже приведена структура папки:

Printer#id
  • Printer#id.bat
  • Printer#id.vbs

Где #id порядковый номер принтера.

При добавлении нового принтера через админку, заполняются требуемые поля и выбирается нужный bat файл из шары. Файл установки, фотография принтера загружается в папку uploads. В админке сделано так, что мы можем закачать до трех разных файлов установки. Сколько файлов закачано столько и кнопок «Установить». В данном случае обошлось без альтернативных методов установки принтеров. VBS скрипта оказалось достаточно.

VBS script


Vbs скрипт устанавливающий принтер выглядел таким образом:

printerName = "\\prnserver01\HP LaserJet 600 printer1 branch1"
Set WshNetwork = CreateObject("WScript.Network")
WshNetwork.AddWindowsPrinterConnection printerName
WSHNetwork.SetDefaultPrinter printerName

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

'Задаем путь принтера
printerName = "\\prnserver01\HP LaserJet 600 printer1"

'Создаем окно Internet Explorer
Set objExplorer = CreateObject("InternetExplorer.Application")

'Задаем настройки окна - длину, ширину, позицию на экране
objExplorer.Navigate "about:blank"  
objExplorer.ToolBar = 0
objExplorer.StatusBar = 0
objExplorer.Left = 500
objExplorer.Top = 250
objExplorer.Width = 550
objExplorer.Height = 170 
objExplorer.Visible = 1

'Задаем заголовок
objExplorer.Document.Title = "Ustanovka printera"

'Задаем html код страницы, со своим крутым дизайном
objExplorer.Document.Body.InnerHTML = "<table style=""width:100%""><tr><td id=""progress"" style=""font-family:Segoe UI;text-align: center;font-size:48px;border-bottom:1px solid black;""> Ustanovka printera: 0%</td></tr><tr><td style=""font-family:Segoe UI;text-align: center;font-size:22px;"">" & printerName & "</td></tr></table>"

'Ждем 500 миллисекунд, находим на странице объект с id progress и меняем его значение. Психологический фактор для юзверя, толку от этого 0
Wscript.Sleep 500
objExplorer.document.getElementById("progress").innerText = " Ustanovka printera: 10%"

'Создаем объект для установки принтера, устанавливаем принтер и ставим его по умолчанию. Скрипт не продолжит выполнятся пока принтер не установится или выйдет ошибка
Set WshNetwork = CreateObject("WScript.Network")
WshNetwork.AddWindowsPrinterConnection printerName
WSHNetwork.SetDefaultPrinter printerName

'Психологический фактор на 200 миллисекунд, хотя принтер уже установился или вышла ошибка
Wscript.Sleep 200
objExplorer.document.getElementById("progress").innerText = " Ustanovka printera: 20%"

'Ещё один психологический фактор на 200 миллисекунд
Wscript.Sleep 200
objExplorer.document.getElementById("progress").innerText = " Ustanovka printera: 40%"

'Ещё один, это же такой кайф когда проценты быстро идут
Wscript.Sleep 200
objExplorer.document.getElementById("progress").innerText = " Ustanovka printera: 60%"

'В этом моменте можно уже откинуться
Wscript.Sleep 200
objExplorer.document.getElementById("progress").innerText = " Ustanovka printera: 80%"

'О свершилось чудо, наконец!
Wscript.Sleep 100
objExplorer.document.getElementById("progress").innerText = " Printer ustanovlen!"

'Получим на 3 секунды еще кайфа от того, что установили принтер и прощаемся
Wscript.Sleep 3000
objExplorer.Quit 

Скриншоты


Скриншоты
image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

Исходный код всего этого выложил на github

Теперь звонков по поводу установки принтеров стало намного меньше.
Спасибо за внимание!
Поделиться с друзьями
-->

Комментарии (84)


  1. Amareis
    14.07.2017 13:01
    +4

    Вот это настоящая автоматизация, даже читать приятно. Увидел проблему, решил проблему, сэкономил кучу времени, да ещё и плюсиков на хабре отхватил :)


    1. AkshinM
      14.07.2017 13:06

      Спасибо большое)


    1. iig
      14.07.2017 13:48
      +9

      Увидел шуруп, взял микроскоп, забил шуруп. Проблема решена.
      Active Directory? GPO? Зачем, если есть vbs.


      1. hippoage
        15.07.2017 12:43

        Наверняка просто доменов нет из-за домашних версий Windows.


        1. iig
          16.07.2017 11:43

          Тогда грусть-печаль… Работу, которую может выполнить администратор в пару щелчков мыши, должен делать инженер тех поддержки.


  1. Stalkeros
    14.07.2017 13:07
    -1

    Все круто, но если таких звонков много, то напрашивается вопрос, почему инженер тех. поддержки, который наверняка «сажает» нового пользователя, сразу заодно и не устанавливает нужные принтеры?
    И, кстати, очень удобно название компьютера по имени\фамилии (вариации) сотрудника, тогда не надо никому передавать трубку, а достаточно спросить «как зовут человека с нужным принтером».
    А IP у пользователя вообще мне кажется нет никакого принтера спрашивать, смысл его грузить такими сложностями, на которые он точно не даст ответа, ну либо клеить наклейку на каждый принтер с именем, IP и назначать статику.


    1. dmitry_dvm
      14.07.2017 16:31
      +1

      Имя компа по фамилии очень плохая идея. Компы переходят из рук в руки, а переименование требует ребута. Скрещивание железа и человека это сродни хардкоду.
      Вообще из AD можно получить имя компа, на котором залогинен юзер.

      Вопрос к автору.
      1. А где-то хранятся соответствия уникальных (заводских) id принтеров и номеров на бумажках? Что будет если бумажку оторвут, а номер никто не помнит?
      2. Я правильно понял, что для каждого принтера хранится свой файл? Надо избавляться от дублирования, наверняка пхп на лету может генерировать файлы (не знаю).


      1. Sergey-S-Kovalev
        15.07.2017 11:20
        +1

        Вообще из AD можно получить имя компа, на котором залогинен юзер.
        Утверждение не соответствующее действительности.


    1. Fox_exe
      15.07.2017 09:16

      Не лучшее решение, т.к. сотрудник может уволится/перейти в другой отдел.
      Я сделал так: Имена компов в виде «объект-кабинет-номер». И небольшая программка, которая по имени находит в логах AD с какого компа этот юзер залогинен и запускает VNC с нужными параметрами.
      А так как используется IP телефония, можно шагнуть чуть дальше — При звонке сразу пинговать юзера и критические объекты сети рядом с ним. Ну и выдавать всю инфу по юзеру, его прошлым обращениям и ссылку VNC для подключения к его компу.


      1. KorDen32
        16.07.2017 03:14
        +1

        Имена компов в виде «объект-кабинет-номер»

        Все красиво до тех пор, пока не начинается переезд из кабинета в кабинет — отдел расширяется, небольшой ремонт и т.п.


        Тогда начинаешь всему железу давать относительно рандомные имена, а уже у себя хранить базу соответствий. Можно еще по FDB-таблице свичей смотреть, порты/розетки более постоянная вещь в плане местоположения. И уже можно сказать после переездов, какой принтер стоит в кабинете, где сейчас юзер, или в соседнем


  1. SyrexS
    14.07.2017 13:27

    В качестве улучшения можно привязать принтеры к помещениям.
    При регистрации в AD указывать комнату и автоматом привязывать принтер.


  1. AkshinM
    14.07.2017 13:28

    Спасибо за комментарий. Постараюсь ответить на ваши вопросы:

    Все круто, но если таких звонков много, то напрашивается вопрос, почему инженер тех. поддержки, который наверняка «сажает» нового пользователя, сразу заодно и не устанавливает нужные принтеры?

    Подготовку рабочего место делают сами юзеры, а уже настройку ОС, ПО и т.д — мы

    И, кстати, очень удобно название компьютера по имени\фамилии (вариации) сотрудника, тогда не надо никому передавать трубку, а достаточно спросить «как зовут человека с нужным принтером».

    А что если сотрудник поменяет компьютер или уволится? Имя компьютера то остается. Даже если не обращать на это внимание, то все равно политика организации запрещает давать компьютерам имена пользователей

    А IP у пользователя вообще мне кажется нет никакого принтера спрашивать, смысл его грузить такими сложностями, на которые он точно не даст ответа, ну либо клеить наклейку на каждый принтер с именем, IP и назначать статику.

    Именно поэтому на все принтеры наклеили их порядковые номера


    1. Stalkeros
      14.07.2017 19:33

      Если работник уволился и на его место пришел новый — переименование компа под фамилию нового и перезагрузка, делов на минуту. Не так часто уходят люди, да и это можно по удаленке сделать.
      Честно говоря, работал и в организациях где были имена компов Х000 и первая_буква_имени.фамилия. Бывали случаи и когда пользователь в упор не находил на рабочем столе bginfo с именем компа, но зато всегда все помнят как их зовут :). Наклеечки на корпус не рассматриваю, т.к. они часто отклеиваются\сдираются.
      Порядковый номер для принтера кстати, хорошая идея.


      1. VolCh
        17.07.2017 09:13

        Как минимум, есть компы, которые шарятся между пользователями в целях экономии оборудования, «канцтоваров» и площадей офисов.


  1. ildarz
    14.07.2017 13:38

    А чем вам не угодила штатная функция регистрации принтера в AD и установка из стандартного интерфейса винды?


    1. AkshinM
      14.07.2017 13:45
      -1

      это ещё надо юзерам некомпетентным объяснить) представляете деденьку лет 45, которому это все объясняют, который еле и то на пуск нажимает?


      1. ildarz
        14.07.2017 15:22

        Представляю. Честно говоря, не вижу разницы в сложности между Пуск — Устройства и принтеры — Установить принтер и заходом на некий сайт, логином, и т.п. Впрочем, хозяин — барин.


        1. AkshinM
          14.07.2017 15:25

          Честно говоря, не вижу разницы в сложности между Пуск — Устройства и принтеры — Установить принтер

          это для нас все легко, а для них…

          заходом на некий сайт, логином, и т.п.

          никаких логинов и паролей. зашел — нашел принтер по филиалу — поставил


      1. cjbars
        14.07.2017 21:13

        Я дяденька лет 40, и у меня есть бабушка овер 60 и нормально линукс на домашних компах работает, и все мы понимаем, так что не надо так… по возрасту ;-)


    1. VolCh
      17.07.2017 09:16

      Установка принтера из стандартного интерфейса винды — задача не пользователя компьютера, а его администратора.


      1. ildarz
        17.07.2017 12:42

        Это абсолютно штатная пользовательская функция, которая в случае подключения принтера из AD не требует ни повышенных прав, ни специальных знаний. В некой конкретной организации может существовать регламент, делающий это "задачей администратора", но в общем случае администратор тут совершенно не нужен — максимум сотрудник техподдержки, консультирующий пользователя.


  1. dm007
    14.07.2017 13:40
    +1

    Если есть AD, то можно сделать через GPO, просто добавляя пользователя в группу, которая сопоставлена с принтером.


    1. AkshinM
      14.07.2017 13:42
      -1

      админам лень создавать GPO — шки))


      1. andyrootman
        14.07.2017 15:19
        +2

        Таких админов нужно увольнять не задумываясь


        1. AkshinM
          14.07.2017 15:22
          +2

          ну зачем сразу увольнять то) сперва побить, потом уволнять)

          P.S; да простят меня админы


    1. zigrus
      14.07.2017 14:16

      а можно по подробней про AD и GPO для принтеров?


      1. LoadRunner
        14.07.2017 14:30

        Можно и подробнее.


      1. dm007
        14.07.2017 14:37
        -1

        Если коротко то:
        1.Создаешь в AD группы пользователей и соотносишь их с принтерами (например группа_принтера_бухгалтерия
        2.GPO User Configuration-control panel settings-Printers
        там создаешь все принтеры организации, на вкладке принтера Common выбираешь item-level targeting-New Item-Security Group и выбираешь из AD группу соответствующую этому принтеру
        эту политику применяешь на всех печатающих пользователей и в зависимости от item-level targeting им будет прилетать нужный принтер. Соответственно, что бы пользователю дать принтер, достаточно добавить его в группу этого принтера.
        Есть нюанс, для установки нового драйвера принтера нужны админские права, это то же как-то обходится через GPO, мне не нужно было так как разворачивал на терминалах.
        Мог что-то упустить, давно это было.


        1. zigrus
          14.07.2017 15:07

          а можно как то автоматически добавлять принтер в домен?
          воткнул принтер в комп, поставились дрова и он уже доступен для печати по сети всем из OU


          1. dm007
            14.07.2017 15:24

            Обычно, в домене все принтеры (сетевые) настроены через сервер печати а потом через схему с GPO выше устанавливаются пользователям, можно подключить и локальный принтер к компу, зашарить его, и так же через GPO по схеме отдать пользователям.


          1. LoadRunner
            14.07.2017 16:13

            Лучше один раз заморочиться и настроить свой сервер печати, с блэкджеком драйверами и принтерами.


            1. zigrus
              14.07.2017 17:01

              в каждом офисе по одному принтеру подключенному к одному из компов
              бывает что принтер втыкают с другой комп или подключают другой принтер
              из за этого все остальные не могут печатать


        1. LoadRunner
          14.07.2017 16:12

          Есть нюанс, для установки нового драйвера принтера нужны админские права
          Конфигурация компьютера\Политики\Конфигурация Windows\Параметры безопасности\Локальные политики\Параметры безопасности — Устройства: Запретить пользователям установку драйверов принтера


        1. TimsTims
          14.07.2017 16:51

          А если бухгалтеров много, и сидят они на разных этажах/помещениях, им нужны разные принтеры? И помимо бухгалтеров в крупной фирме есть можество других ситуаций, когда нужен принтер? Или вот заказал отдел маркетинга себе принтер — чтобы его подключить теперь надо редактировать группу AD, и скрипты GPO? А если не всем из отдела маркетинга нужен доступ к этому принтеру (печатающий например крупные макеты), а только нескольким избранным? Это же повеситься можно :)!


          1. ildarz
            14.07.2017 17:00
            +1

            А если бухгалтеров много, и сидят они на разных этажах/помещениях, им нужны разные принтеры?

            Группа привязывается к принтеру (или пулу принтеров). Кому надо туда печатать — того и включаем. Кому не надо — не включаем. Заодно не будет проблемы, с которой автор, вероятно, пока не сталкивался — когда некто случайно подключает себе принтер из другой локации, и документы улетают не пойми куда.


            чтобы его подключить теперь надо редактировать группу AD

            Включить пользователей в группу — это разве проблема?


            и скрипты GPO

            Хорошо продуманный скрипт редактировать не нужно.


  1. dm007
    14.07.2017 13:43

    Что бы лениться, нужно сначала все автоматизировать ))


    1. AkshinM
      14.07.2017 13:46
      +1

      Лень двигатель процесса)


      1. CmpeJ1ok
        14.07.2017 14:08

        странно, всегда считал, что домен, как и политики — эти вкусняшки нужны больше админам, чем рядовому пользователю (ограничения, запреты и пр. корпоративная лабудень и защита), как раз, чтобы было больше времени для лени… мда…

        ЗЫ
        статья заслуживает уважения — в свое время подобное делал для автоматизации установки софта с корпоративного портала (сразу оговорюсь, что создавал такие костыли, потому как не было домена))))))


        1. AkshinM
          14.07.2017 14:21

          спасибо большое)


  1. Protos
    14.07.2017 14:35

    Не повезло вам, я работаю в компании с > 2000 оаботников и у нас на этаж (60-100) челов по 2 принтера) у нас нет запарок с служебками и иными бумагами, все через скайп


    1. lostpassword
      14.07.2017 20:11

      Ну, принтер не только для служебок нужен.)
      Иногда просто бывает удобно что-то распечатать — например, схему или статью.


      1. dikkini
        16.07.2017 21:11

        Сейлы, технические писатели и аналитики печатают тоннами.


  1. qwertEHOK
    14.07.2017 14:51

    а у нас почти так же, только вместо сайта DFS папка на сервере (все к нему подключаются по RDP). На каждом принтере номер = IP. В папке батники, каждый батник = IP, имя = номер принтера. У пользователя ярлык на эту папку.

    Пользователь сам подключает себе принтер по нужному номеру. Если принтер сломался\нужен другой — просто заходит в папку (не нужные папки спрятаны DFS) и ставит. Это освоила даже бухгалтерия.

    Почему так
    1. Большая текучка как людей, так и принтеров
    2. Простота администрирования — батники проще всего
    3. Простота реализации


  1. Stillgray
    14.07.2017 15:19
    +1

    Очень странно, что не воспользовались ActiveDirectory GPO Preferences.
    Там есть всё это и немного удобнее. Ничего не надо программировать, ничего пользователю не надо нажимать… Автоматическая установка принтера по членству пользователя в группе AD (можно по другим атрибутам, типа ip адреса и прочего, в том числе экзотическим, например — частота процессора).
    В плюсах, кроме вышеперечисленного получаем автоматическое обновление драйверов, удаление принтеров и понимание — сколько людей в данный момент подключено к принтеру.
    При условии, что в организации развёрнут принт сервер, и все принтеры — сетевые, получаем отчёты о том. кто что и где печатал в любом разрезе.


    1. AkshinM
      14.07.2017 23:50

      все это хорошо, но как описал qwertEHOK ситуацию в свой организации «Большая текучка как людей, так и принтеров», так же и у нас. поэтому администрировать всё это через политику усложняет все нежели облегчает


  1. kiff86
    14.07.2017 15:19

    Интересно вот что: если у пользователя разные разряды ос или сама ос не типична?
    Пример:
    пользователь-1 win7x32
    пользователь-2 win10x64
    пользователь-3 macOS
    пользователь-4 linux


    Так же не понял, что видит пользователь, если при установке возникает ошибка? По идее вы внимание пользователя переключаете на окно IE (что конечно очень забавно) но там нет сообщений об ошибках.


    Наверно, возможно сделать обратную связь сервера установки и скрипта vbs, ну там например вместо открытия окна IE, отправлять запрос на ваш сайт. А на сайте будет прогрессбар, который хоть аяксом раз в 500мс или 1с опрашивает прогресс.


    Наверно в vbs есть возможность чекать юзерскую ОС (ее разрядность). Но ОС не Win думаю vbs не запуститься… Не знаю просто.


    1. Stillgray
      14.07.2017 16:04

      В этом плане могут помочь системы FollowMe Printing — когда в системе у пользователя установлен один виртуальный принтер, а печать производится в соответствии с политиками: https://habrahabr.ru/company/croc/blog/281793/

      Либо, ради кроссплатформенности, пилить CUPS.


  1. falcon81
    14.07.2017 15:19

    И где юзер должен взять этот айпи?


    1. AkshinM
      14.07.2017 23:46

      Зависит от модели. Или посмотреть на панель принтера, или распечатать конфигурацию устройства. Пользователи даже смотря на монитор принтера в упор не замечают ip адреса.


  1. bombardier
    14.07.2017 15:42

    От всего этого геморроя очень спасает нормальная система управления печатью. На каждом компьютере висит один виртуальный принтер куда-то отправляются все задания, а при подходе ногами к любому принтеру пользователь авторизуется по пину/бейджу/логину и печатает работу.


    1. ErshoFF
      15.07.2017 12:16

      Интересная и правильная система.
      Озвучьте пожалуйста стоимость закупки системы на 1000 пользователей и сопровождения на 1 год с учетом обучения персонала поддержки и расходными материалами (карточками).
      Ну и принтеры должны это уметь.


  1. prostofilya
    14.07.2017 15:46
    +1

    А с чего вдруг юзер должен знать что такое айпи и где его взять? пафосновато как-то


    1. AkshinM
      14.07.2017 23:44
      -1

      хотя бы, чтобы принтер ему смогли бы установить


  1. Stillgray
    14.07.2017 15:50

    Кстати, порекомендую Papercut print logger free для получения отчётности.

    http://www.papercut.com/products/free-software/

    Бесплатная, ставится на принт-сервер в 3 клика, не требует никакой настройки.


    1. omegik
      14.07.2017 16:30

      Беспратна для 5 юзеров. :(


      1. Stillgray
        14.07.2017 16:51

        Это система управления печатью. Принтлоггер бесплатна совсем: https://www.papercut.com/products/free-software/print-logger/

        Хотя, никто не мешает сделать самому что-то похожее — достаточно распарсить логи. По крайней мере у себя я так сделал: powershell скрипт, который отрабатывает по триггеру на событие печати в eventlog и записывает данные в MS SQL базу.
        А оттуда отчёты в любой проекции строятся бесплатным MS SSRS.


  1. Bessnov
    14.07.2017 16:31

    Много разных весёлых вариантов подключить принтер автоматически. Подскажите пожалуйста правильный, как сделать вариант не привязанный к пользователю или к группе АД? А только к компьютеру. Ну, например, пользователь пошёл поработать на другой этаж или в другой офис, и ему на этом компьютере подключился бы ближайший принтер.


    1. Stillgray
      14.07.2017 16:57

      Либо FollowMe Printing. Тут у Крок хорошо описано https://habrahabr.ru/company/croc/blog/281793/
      Либо понять, как определить «ближайший принтер». Вариантов масса: адресация, именование компов и принтеров.
      Либо, если компьютеры и принтеры достаточно стационарны, то назначать принтер не на пользователя, а на компьютер — учётная запись компьютера такой же объект в АД как и уз пользователя.


      1. Bessnov
        14.07.2017 21:16

        Очень. Очень дорогое решение.

        У меня сделано проще — маленький netlogon скриптик и структура в АДэ по местоположению, вида
        OU=Офис/Здание/Этаж/Кабинет
        Там внутри принтер и компьютеры. Имена и учётки не имеют никакого значения.
        Пользователю ничего делать не надо.

        Проблема в том, что майкрософтофилы смеются и «показывают пальцем» — так неправильно, майкрософт так не рекомендует. А как правильно и незатратно, никто не говорит.


        1. Stillgray
          15.07.2017 04:48

          Прикольно!
          Тут в принципе, даже нетлогон скрипт не нужен — всё можно сделать через предпочтения в групповых политиках — по принадлежности уз компьютера к определённому ОУ.
          А как решён вопрос Policy/No policy? Или при переносе компьютера в ОУ, на которое не распространяются политики принтеры не удаляются?


          1. Bessnov
            15.07.2017 09:56

            Компьютер достаточно перетащить мышкой в нужный OU.
            Скрипт, стартуя, удалит все принтеры и подключит ближайшие для этой OU.

            А как правильно привязать принтер через политики?
            Ткните на какой-нибудь пример из документации MS.


  1. Shakhmin
    14.07.2017 17:13

    Драйвер принтера ставится на компьютер
    Принтер тоже проще тогда ставить для компьютера
    Компьютеры в одном месте печатают на одних и тех же принтерах
    При правильных политиках, как только компьютер попал в домен, его засунули в нужную группу и пользователь даже не в курсе, что принтеры надо устанавливать


    PS а почему apache, а не IIS?


    1. AkshinM
      14.07.2017 22:29

      как-то xampp мне более по душе


  1. zirkony
    14.07.2017 19:42
    -4

    Хватит уже писать «2к17» (год).
    2к17 != 2017.
    2к17 = 2170.


    1. iig
      15.07.2017 22:23

      2к17 == 2170 ом!


  1. Year
    14.07.2017 19:42

    насколько я помню:
    -vbs не работает нигде кроме IE, а значит надо объяснить пользователю, чтобы он открывал сайт именно через него.
    -vbs, запускаемым в IE, нужно дополнительно разрешать доступ к файловой системе, и в таком случае нужно как-то централизованно добавлять сайт в Trusted Sites и изменять параметры безопасности для этой зоны.
    Но в целом это рабочий способ.

    Есть еще ленивый вариант вручную генерировать html-страницу, на которой будут ссылки на все принтеры в организации в виде \\printserver\printname. Страницу можно класть на какую-нибудь шару даже без веб сервера.Такое решение не позволяет устанавливать принтер по умолчанию и также без дополнительных манипуляций не работает в альтернативных браузерах.


    1. AkshinM
      14.07.2017 21:51

      -vbs не работает нигде кроме IE, а значит надо объяснить пользователю, чтобы он открывал сайт именно через него.

      а какая разница где юзер откроет страницу? все равно скачивается bat файл, который запустит vbs скрипт. а работает скрипт через приложение csript.exe (находится в system32)


      1. Year
        14.07.2017 22:32

        Спасибо, не вник в детали, что после нажатия «Установить» не происходит установка, а пользователю видимо нужно еще кликнуть на скачанный файл.


        1. AkshinM
          14.07.2017 23:43

          да, так надо и сделать. если бы и другие браузеры поддерживали бы использование vbs скриптов, то всех этих сложностей с bat файлами не было бы


  1. hatefulh8
    14.07.2017 21:49

    Принтера — лоулвл, даешь автоматизацию МФУ!


    1. qwertEHOK
      15.07.2017 16:44

      а что именно вы хотите автоматизировать?


  1. Artarik
    14.07.2017 21:49

    в папке %systemroot%\adminprintingscripts есть хорошие скрипты по добавлению порта принтера, установке и настройке принтера, в совокупности с psexec можно творить чудеса) плюс ип принтеров забиндить на днсп сервере и сделать для себя табличку, например, где какой принтер стоит.


  1. metaltuman
    14.07.2017 21:49
    +1

    Автоматизация это замечательно, но общение можно было спросить просто налепив порядковый номер принтера большими буквами на крышку или стену возле него, например: B1-F2-01


  1. Evil_Demon
    14.07.2017 22:01
    +1

    Интересно, что мешает подключить все принтеры к принтсерверу (-ам), переобозвать их имена по территориальной принадлежности (hp 100 бухгалтерия 2 этаж) и пусть себе ставят руками через добавление принтеров из АД в 2 клика? Ну и сделать через GPO ярлык на рабочий стол для «устройства и принтеры», для совсем деревянных.

    Ну и средствами GPO, помнится, можно принтеры на пк вешать а не на учетку пользователя, а так как пк я так понял в задаче стационарны, то…


  1. paranoya_prod
    14.07.2017 22:40
    +1

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

    1. Система именования техники: XXX-YYY-ZZZ000
      где XXX — трехбуквенное название компании, очень удобно, когда есть некая группа компаний, даже если фирма одна, то всё равно придумывается название или берётся с инвентарного номера в бухучёте, если, конечно, инвентарники начинаются с букв.
      YYY — Имя города/улицы, если есть филиалы в других городах или на других улицах. Удобно для географической привязки
      ZZZ — две или три буквы типа устройства: prn — принтер, ws — рабочая станция, srv — сервер, для контроллера домена, можно взять dc.
      000 — числовой порядковый номер в этом городе (филиале), всегда записывается так: 001.
    2. На всех системниках, принтерах и прочих сетевых устройствах имеется две наклейки: первая — его номер по системы, описанной выше. Вторая — номер места в котором он установлен, тут делается так, как удобней, либо сквозная нумерация мест по всей фирме или филиалу, либо делить, к примеру на этажи, на кабинеты.
      PS. Чтобы наклейки не отдирались, не используйте скотч и обычную бумагу, используйте клеящеюся бумагу. Тем, на ком ещё висит инвентаризация рекомендую добавить штрих-код.
    3. Каждое рабочее место, в данном случае, это физический стол, поддон с принтером и т.д., так же пронумеровано
    4. На компьютерах стоит BGInfo, которое отображает на фоновом рисунке имя компьютера
    5. Каждая иконка «Мой компьютер» содержит в себе и имя компьютера: «Мой компьютер (rgk-msc-ws001)»
      Если на фирме нет юзеров постоянно работающих на разных компьютерах (пример: студенты в ВУЗах), то ФИО юзера записывается в описании компьютера, как в AD, так и на самом компьютере. Там-же можно писать и место установки.

    6. Этого достаточно, чтобы избежать ненужных вопросов юзерам, достаточно спросить у него имя компьютера, где его искать рассказывается на инструктаже, после прохождения которого, юзер расписываться в ведомости. Или же спросить место установки (которое всегда есть перед глазами юзера), если, к примеру, вышел из строя компьютер или монитор, а системник задвинут далеко и ничего не прочитать.
      Далее, на предыдущем месте работы у меня было с принтерами всё просто — перемещение компьютера в соответствующее Подразделение в AD, автоматически удаляло старые принтера и устанавливало те принтеры, которые стояли в подразделении. А если пользователь (преподаватель) сидел в учебной аудитории, то принтеры так-же автоматически подключались к нему и он просто печатал, после шёл к принтеру на своей кафедре и забирал распечатку. И никаких звонков с просьбой установить принтер.
      При этом, никто никаким образом не мог сам установить чужой принтер себе на компьютер, у нас был редакционно-издательский центр со своими цветными принтерами, на которых печатали только они.
      Написал, вдруг, кому-то пригодится для организации своей работы так, чтобы целый день читать Хабр. :)


    1. AkshinM
      14.07.2017 23:40

      благодарю за ваш ответ, очень все четко рассортировано и организовано, но

      это отпадает:

      На компьютерах стоит BGInfo, которое отображает на фоновом рисунке имя компьютера

      политика организации запрещает использовать ее, хотя я очень даже за использование этой программы


      1. Artarik
        15.07.2017 06:06

        интересно, а на базе чего сделано управление пк пользователей?


      1. paranoya_prod
        15.07.2017 19:00

        BGInfo можно не использовать, многим хватает номера местонахождения, а для этого достаточно пронумеровать и провести инструктаж. Ну, ещё в своей HelpDesk системе, если она есть, завести поле с местонахождением.


    1. AVX
      16.07.2017 19:06

      PS. Чтобы наклейки не отдирались, не используйте скотч и обычную бумагу, используйте клеящеюся бумагу. Тем, на ком ещё висит инвентаризация рекомендую добавить штрих-код.

      Что-то на практике наоборот вышло — бумага самоклейка быстро отваливается, пришлось перейти на обычную и скотч. И скотч кстати разный, даже от партии зависит — какой-то нормально клеится, какой-то хуже.


  1. nApoBo3
    15.07.2017 00:09

    Странное решение. ИМХО в вин среде при наличии принт сервера правильно использовать публикацию принтеров в AD. При публикации у принтера задается расположение по которому или пользователь( что предпочтительно ) или администратор, может его найти. Еще лучше автоматически монтировать принтер по помещениям. А еще лучше followme printing, это когда у всех один принтер, отправляешь на него и идешь к любому, прикладываешь свою карточку и твой документ распечатывается на нем.


  1. FomkaV
    15.07.2017 12:45

    Поделюсь своим опытом. Каждый принтер, при покупке был инвентаризирован, присвоен номер, он же указывается на корпусе (Маркером, наклейкой и т.д.). Инвентаризацию мы ведем в GLPI, где записываем в том числе и MAC. Далее принтер едет в один из филиалов. Там его подключают к сети, к любой свободной сетевой розетке. Зная MAC и что принтер настроен на DHCP, мы прописываем на маршрутизаторе филиала для него статику. Добавляем принтер на принт-сервер (PS), называя его инвентарным номером. У пользователя через политики AD, на рабочем столе создается ярлык \\PS. Который так и называется: «Добавь себе принтер».


  1. Diaskhan
    15.07.2017 20:10

    Настоящий Джедай...


  1. sergeyglazyrin
    15.07.2017 20:42

    Все зависит конечно же от принтеров, от конфигурации сети. Но было бы интересно поиграться со следующей вещью:
    stackoverflow

    As far as off-the-shelf solutions go, many commercial 802.11 networking infrastructures support triangulation of both host computers and «rogue» APs by comparing the signal strength of the source among all the APs that can see the signal. I've used trapeze wireless systems that import autocad maps that include things like building materials (to compensate for different signal attenuations from drywall vs brick vs steel reinforced concrete). It then draws a picture that has all stations and APs. I believe cisco and aruba have similar tools.


    По идее если получится определять локацию компьютера (роутер, к которому подключен компьютер и принтер), то можно будет избавиться от этого всего гемороя…
    Но я подозреваю что не все роутеры поддерживают такую крутую штуку как определение расстояния по силе сигнала, да еще и направление ж нужно определять

    Пока это кажется очень дорогим и наверное не сильно возможным, особенно для дешевых роутеров, нужно куча другого еще оборудования. Но, если бы это было возможно то было бы классно :)
    Если вдруг поиграешься, то оповести в комментариях.


    1. sergeyglazyrin
      16.07.2017 12:26

      Хм. А ведь это реально сделать даже без триангуляции. У роутера можно узнать список мак адресов подсоединенных. Таким образом мы можем вычислить вообще без проблем ближайший принтер. Но правда это будет работать если 1 принтер на один роутер.