Скрипт для установки сетевого принтера

Обновлено: 24.04.2024

Update 28.10.2010: исправлена ошибка с назначением права ManageDocuments.

Вот и пришло время закрыть тему управления принтерами и их списками ACL в PowerShell с использованием WMI. Я в блоге уже расписывал решение частных задач по основным задачам управления принтеров и по управлению их ACL списками. В этом посте я сложу все наработки по этому вопросу в единый концептуальный скрипт, который будет называться PrinterUtils.ps1 с достаточно объёмным набором функций, которые нацелены на упрощение для администраторов автоматизации принтеров с использованием PowerShell. Если кто-то захочет разобраться в работе скрипта и понять используемые приёмы, то предлагаю ознакомиться с следующими ссылками:

В качестве основы я использовал свои предыдущие наработки с SecurityDescriptor в предыдущем блоге, когда разбирал вопрос управления SharePermissions из PowerShell:

Материала у меня на эту тему набралось достаточно много, чтобы проникнуться в идею работы классов WMI и SecurityDescriptor, который не раз пытался посадить меня в лужу :) Однако версия скрипта ShareUtils чётко говорит о том, что скрипт далеко не идеален и не оптимален, имеет свои недостатки, т.к. это был мой первый опыт работы с функциями. Сейчас я значительно переработал структуру работы скрипта (оставив только Core работы с SecurityDescriptor), добавив удалённое управление (в разумных пределах) и, главное (как мне кажется), реализовал работу функций в конвейере. Примеры использования скрипта распишу чуть ниже. Итак, представляю набор функций, которые реализованы в скрипте:

  1. Подключение (маппинг) сетевого принтера к пользователю;
  2. Отключение маппинга сетевого принтера от пользователя;
  3. Получение сведений о принтерах;
  4. Установка принтера по умолчанию;
  5. Установка принтера для общего пользования (расшаривание принтера);
  6. Отмена принтера для общего пользования;

Данная секция представляет собой базовые возможности по управлению принтерами и полностью работоспособна в среде Windows XP/Windows Server 2003. А вот секция управления ACL списками принтеров доступна только в среде Windows Vista/Windows Server 2008. Сюда входят следующие функции:

  1. Получение сведений о правах доступа на конкретный принтер, конкретный принтсервер или по списку компьютеров;
  2. Импорт сведений о правах доступа из внешнего источника. Это может быть и CSV и XML или другой формат;
  3. Добавление пользователя или группы в ACL список принтера или всех принтеров, которые подключены к принтсерверу;
  4. Удаление пользователя или группы из ACL списка принтера или всех принтеров, которые подключены к принтсерверу;
  5. Установка пользователя или группы в ACL список принтера или всех принтеров, которые подключены к принтеру. При этом все имеющиеся права доступа будут удалены и заменены только одним ACE с правом ManagePrinters.

Для этих функций полностью реализована поддержка удалённой работы и работа в конвейере. Синтаксис команд используется примерно следующий:

  • New-NetworkPrinter -Computer <name> -name <name>
    где Computer - имя компьютера, к которому подключён сетевой принтер
    Name - сетевое имя принтера, который следует подключить к пользователю
  • Remove-NetworkPrinter -Name <name>
    где Name - имя примапленного сетевого принтера (не обязательный параметр). Если параметр Name не указан, то будут отключены все примапленные сетевые принтеры.
  • Get-PrinterInfo -Computer <name> -Name <name>
    где Computer - имя компьютера, к которому подключён принтер (не обязательный параметр. Если не указан, то будет использоваться локальная машина),
    Name - имя принтера на удалённой или локальной машине, зависит от предыдущего параметра (не обязательный параметр. Если не указан, то будет выведена краткая справка о всех принтерах указанного компьютера. Если указан, то будет выведена подробная информация о принтере). Вывод данной команды не будет содержать сведений о правах доступа на принтер.
  • Set-DefaultPrinter -Name <name>
    где Name - имя (или путь) принтера, который должен стать для пользователя принтером по умолчанию.
  • New-PrinterShare -Computer <name> -Name <name> -ShareName <name>
    где Computer - имя компьютера, к которому подключён принтер (не обязательный параметр. Если не указан, будет использоваться локальная машина)
    Name - имя принтера, который требуется предоставить для общего доступа
    ShareName - сетевое имя принтера, т.е. имя, под которым принтер будет виден из сети
  • Remove-PrinterShare -Computer <name> -Name <name>
    где Computer - имя компьютера, к которому подключён принтер (не обязательный параметр. Если не указан, будет использоваться локальная машина)
    Name - имя принтера, для которого необходимо отключить общий доступ (не обязательный параметр. Если не указан, то общий доступ будет отменён для всех расшаренных принтеров на выбранном предыдущим параметром компьютере)
  • Get-Printer -Computer <name> -Name <name>
    где Computer - имя компьютера, к которому подключён принтер (не обязательный параметр. Если не указан, будет использоваться локальная машина)
    Name - имя принтера, для которого следует получить сведения о правах доступа (не обязательный параметр. Если не указан, то будут получены сведения об ACL всех принтеров на выбранном предыдущим параметром компьютере)
    Генерирует на выходе массив объектов с необходимыми сведениями о каждом ACE. Данный массив можно использовать как для изменения прав доступа, так и просто для экспорта во внешний файл.
  • Set-Printer
    не принимает никаких аргументов, а только получает данные по конвейеру. В качестве входных данных должны использоваться объекты, которые по свойствам соответствуют объектам, которые генерирует команда Get-Printer. Команда не может быть в начале строки, а только на выходе конвейера, с которого поступают объекты. Так же по конвейеру можно передавать объекты из внешних файлов (например, CSV, XML)
  • Add-PrinterPermission -User <name> -AceType <name> -AccessMask <name>
    где User - имя пользователя/группы, которого следует добавить в ACL список принтера
    AceType - тип доступа. Может быть Allow или Deny
    AccessMask - маска доступа. Может иметь следующие значения: ManagePrinters, ManageDocuments, Print, TakeOwnership, ReadPermissions, ChangePermissions
    Данная команда так же не может быть в начале строки, а должна находиться на выходе конвейера, с которого поступают объекты. В качестве входных данных должны использоваться объекты, которые по свойствам соответствуют объектам, которые генерирует команда Get-Printer. Команда не может быть в начале строки, а только на выходе конвейера, с которого поступают объекты. Так же по конвейеру можно передавать объекты из внешних файлов (например, CSV, XML)
  • Remove-PrinterPermission -User <name>
    где User - имя пользователя/группы, которого следует удалить из списка ACL принтера
    Данная команда так же не может быть в начале строки, а должна находиться на выходе конвейера, с которого поступают объекты. В качестве входных данных должны использоваться объекты, которые по свойствам соответствуют объектам, которые генерирует команда Get-Printer. Команда не может быть в начале строки, а только на выходе конвейера, с которого поступают объекты. Так же по конвейеру можно передавать объекты из внешних файлов (например, CSV, XML)
  • Set-PrinterPermission -User <name>
    где User - имя пользователя/группы, для которого следует предоставить привилегированный доступ.
    Важно:при использовании команды Set-PrinterPermission следует помнить, что указанный пользователь/группа будут иметь единственный доступ к принтеру с правом ManagePrinters. При этом вероятно, что вы после исполнения команды потеряете доступ к принтеру
    Данная команда так же не может быть в начале строки, а должна находиться на выходе конвейера, с которого поступают объекты. В качестве входных данных должны использоваться объекты, которые по свойствам соответствуют объектам, которые генерирует команда Get-Printer.

и несколько примеров использования:

Get-Printer PrintSrv "MyPrinter" | export-csv C:\LaserJet.csv - экспортирует ACL списки принтера MyPrinter в CSV файл

Get-Printer PrintSrv | Remove-PrinterPermission Everyone - удаляет группу Everyone из списков ACL всех принтеров сервера PrintSrv

Import-Clixml C:\Printers.xml | Set-Printer - восстанавливает права для принтеров на те, которые содержатся в XML файле. При этом текущие списки ACL указанных в файле принтеров будут полностью перезаписаны списком ACL из файла.

Get-Content C:\Computers.txt | % - даёт право печати на всех принтерах, которые подключены к компьютерам из списка computers.txt

New-NetworkPrinter PrintSrv "HP LaserJet 2100" - подключает пользователю в контексте котрого исполняется скрипт сетевой принтер HP LaserJet 2100, который физически подключен к компьютеру PrintSrv

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

многовато, конечно же, но ничего космически сложного для разбора я тут не вижу. Главное - чёткое понимание структуры SecurityDescriptor и хотя бы базовые навыки работы с ним.

Важно: если не указываете необязательные параметры, то указание последующих параметров в виде именованных (не позиционных) обязательна!

Даже не знаю, что ещё добавить сюда. Вроде все вопросы разобрал ранее, сейчас просто это всё собрал воедино. Вобщем, как обычно, если есть вопросы, замечания - кнопка Comments вам в помощь ;-)

date

11.12.2018

directory

Windows 10, Windows 8

comments

комментариев 13

Готовые VBS скрипты для управления принтерами в Windows

Для управления принтерами Microsoft разработала несколько vbs скриптов, позволяющих управлять принтерами и очередями печати, устанавливать и удалять драйвера принтеров и т.д.

Эти скрипты присутствуют во всех версиях Windows (начиная с Vista и Windows Server 2008) и находятся в каталоге C:\Windows\System32\Printing_Admin_Scripts\en-US.

  1. Вместо каталога en-US может быть другой каталог, соответствующий языку установленной системы. Для русской версии Windows это будет каталог ru-RU (полный путь C:\Windows\System32\Printing_Admin_Scripts\ru-RU);
  2. В Windows XP и Windows Server 2003 эти vbs скрипты хранятся в каталоге C:\WINDOWS\system32.

windows 8 vbs скрипты для управления принетрами и заданиями из командной строки

В каталоге находятся следующие vbs скрипты:

  • Prncnfg.vbs – скрипт для отображения информации о настройках принтера;
  • Prndrvr.vbs – управление драйверами принтеров (установка/удаление драйвера);

Примечание. Одним из широко известных способов управления принтерами в системах Windows различных версий является хост-процесс rundll32.exe, которому передается имя библиотеки printui.dll и точка входа в нее (PrintUIEntry). Функционала команды rundll32 printui.dll,PrintUIEntry достаточен для выполнения базовых операций с принтерами и полностью поддерживается Microsoft, однако использование указанных vbs скриптов с точки зрения удобства администратора все таки предпочтительнее.

Рассмотрим типовые сценарии использования этих vbs скриптов.

Установка драйвера принтера из командной строки

Предположим, вам необходимо установить на компьютере пользователя универсальный драйвер печати HP (HP Universal Printer Driver). Скачайте соответствующую версию драйвера с сайта производителя и распакуйте его в произвольный каталог (например, C:\drv\HP Universal Print Driver).

Права на установки и настройку локальных принтеров есть у членов локальных Administrators (Администраторы), Print Ope­rators (Операторы печати) или Server Operators (Операторы сервера).

prndrvr.vbs скрипт установки драйвера печати принтера


Установим драйвер принтера командой:
cscript "C:\Windows\System32\Printing_Admin_Scripts\en-US\prndrvr.vbs" -a -m "HP Universal Printing PCL 6" -i "C:\drv\HP Universal Print Driver\hpcu160u.inf"

Рассмотрим параметры команды:

-а – добавить драйвер принтера;

-m "HP Universal Printing PCL 6" – имя драйвера принтера;

-i “путь” – полный путь к inf файлу драйвера.

После установки драйвера печати, он появится в свойствах сервера печати (Control Panel\Hardware and Sound\Devices and Printers ->Print Server Properties).

hp universal driver - универсальный драйвер печати HP

Примечание. Если драйвер принтера несовместимый, его можно установить вручную.

Установка нового принтера из командной строки

С помощью следующей команды можно установить новый принтер с именем HP5525, воспользовавшись ранее установленным драйвером печати HP Universal Printing PCL 6:

prnmngr.vbs установка принтера hp из командной строки

-a – устанавливается новый локальный принтер;

-p "HP5525" – отображаемое имя принтера;

-m "HP Universal Printing PCL 6" – используемый драйвер печати;

Управление принтером по-умолчанию

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

cscript "C:\Windows\System32\Printing_Admin_Scripts\en-US\prnmngr.vbs" –l

Текущий принтер по-умолчанию можно получить так:

cscript "C:\Windows\System32\Printing_Admin_Scripts\en-US\prnmngr.vbs" –g

prnmngr.vbs установить принтер по умолчанию из командной строки

Принтер по умолчанию HP Universal Printing PCL 6

Чтобы выбрать другой принтер для печати по умолчаню, выполните:

cscript "C:\Windows\System32\Printing_Admin_Scripts\en-US\prnmngr.vbs" -t –р "HP5525"

Создаем TCP/IP порт для сетевого принтера

Если вы хотите подключить сетевой принтер, необходимо сначала создать для него сетевой порт (допустим ip адрес принтера 192.168.10.26):
cscript "C:\Windows\System32\Printing_Admin_Scripts\en-US\Prnport.vbs" -a -r IP_192.168.10.26 -h 192.168.10.26 -o raw -n 9100
-r IP_192.168.10.26 – имя сетевого порта;

-h 192.168.10.26 – IP адрес устройства;

-o raw – тип порта (raw или lpr);

А потом установим в системе новый сетевой принтер:
cscript "C:\Windows\System32\Printing_Admin_Scripts\en-US\prnmngr.vbs" -a -p "HP5525" -m "HP Universal Printing PCL 6" -r "IP_192.168.10.26"
После окончания работы скрипта в системе появится новый принтер с именем HP5525

Новый принтер в системе windows8

Отправка на печать тестовой страницы

Управление очередями печати из командной строки

С помощью скрипта prnjobs.vbs вы можете просматривать задания печати в очередях. Чтобы вывести все задания печати для всех локальных принетров, выполните команду:
cscript "C:\Windows\System32\Printing_Admin_Scripts\en-US\prnjobs.vbs” –l

Чтобы вывести задания на конкретном принтере, нужно указать его имя:

cscript "C:\Windows\System32\Printing_Admin_Scripts\en-US\prnjobs.vbs” –l –p HP5525

Для очистки очереди печати, на одном принтере выполните команду:

cscript "C:\Windows\System32\Printing_Admin_Scripts\en-US\prnjobs.vbs” –x –p HP5525

Либо можно быстро очистить все очереди для всех принтеров (так гораздо удобнее, чем вручную очищать очередь печати):

cscript "C:\Windows\System32\Printing_Admin_Scripts\en-US\prnjobs.vbs” –x

Включить общий доступ к принтеру из командной строки

Все новые принтеры, которое вы установили в Windows из командной строки являются локальными. Вы можете предоставить к ним общий доступ другим пользователей из графического интерфейса Windows (см. статью). Также вы можете открыть общий доступ к принетру из командной строки. Например, вы хотите дать доступ к своему общему принтеру HP5525, опубликовав его под именем HP5525_Shared. Используйте команду:

script "C:\Windows\System32\Printing_Admin_Scripts\en-US\prncnfg.vbs” -t -p HP5525 -h "HP5525_Shared" +shared

Чтобы отключить общий доступ к принтеру, выполните:

script "C:\Windows\System32\Printing_Admin_Scripts\en-US\prncnfg.vbs” -t -p "HP5525" -shared

Аналогично вы можете опубликовать принтер в Active Directory:

script "C:\Windows\System32\Printing_Admin_Scripts\en-US\prncnfg.vbs” -t -p HP5525 +published

Чтобы отменить публикацию в AD для принтера, используйте аргумент «-published».

Как подключить сетевой принтер из командной строки

Чтобы подключить сетевой принтер, подключенный к другому компьютеру, используйте

cscript "C:\Windows\System32\Printing_Admin_Scripts\en-US\prnmngr.vbs" -ac -p “\\prnt01\hp2000”

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

Полный список принетров в системе можно вывести так:

cscript "C:\Windows\System32\Printing_Admin_Scripts\en-US\prnmngr.vbs" -l

Удалить принтер можно командой:
cscript "C:\Windows\System32\Printing_Admin_Scripts\en-US\prnmngr.vbs" -d -p "HP5525"
Драйвер печати удаляется так:
cscript "C:\Windows\System32\Printing_Admin_Scripts\en-US\prndrvr.vbs" -d -m "HP Universal Printing PCL 6" -e "Windows x64" -v 3

В этой статье мы рассмотрели базовые операции со старыми-добрыми vbs-скриптами Microsoft, позволяющими управлять принтерами и их драйверами из командной строки в различных версиях Windows. Полный список возможностей и аргументов этих скриптов доступен в документации Microsoft или во встроенной в сами сценарии помощи (просто запустите в командной строке файл сценария без параметров).

В следующей статье мы познакомимся с новыми возможностями управления принтерами в Windows 10 / 8.1 и Windows Server 2016 / 2012 R2, которые предоставляет PowerShell.

image

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

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

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

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

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

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

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

  • Максимально простая и наглядная для пользователя
  • Возможность создания учетных записей администраторов
  • Возможность добавлять\удалять принтеры администраторам
  • Возможность добавлять\удалять филиалы администраторам
  • Наличие какой-либо справочной информации для пользователя
  • Смена языка
  • Возможность устанавливать принтеры не одним, а несколькими методами (скриптами)
  • App
    1. Configs
    2. Controllers
    3. Locale
    4. Views

  • Uploads


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


Зайдем в браузере в 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 и функция для осуществления запросов к БД.

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

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

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


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


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

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

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

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

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

VBS script

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


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

Скриншоты

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

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

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

Всем привет! интересует такой вопрос - можно ли средствами powershell удаленно устанавливать сетевые принтеры. Например - есть принтсервер \\testprint\ На нем установлены различные принтера и доступны для установки по сети(шаре). Т.е. задача такая, написать скрипт где выбирать необходимый принтер с этого сервера и устанавливать его на удаленный пк. Пробовал через invoke-command отправлять команду на удаленный пк :

Пишет - имя принтера задано не верно.. хотя на локальном пк отрабатывает нормально.

Может кто нибудь знает другие методы? Или что я не так делаю в данном примере?

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь

Коннект к удалённой машине
может ктонибудь знает благодаря каким компонентам осуществляеться связка с mysql БД, и вообще.

Подключение к удаленной машине
почему я не могу подключиться к удаленной машине. вот код public bool Connect() .


Время на удаленной машине
Доброго времени суток! Необходимо получать время на удаленной машине, что использовать для этого.

Docker-compose на удаленной машине
Подскажите, как правильно производить развертывание приложения с использованием докер. Есть.

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

Если ПК доменные, то удобнее всего решить такую задачу с помощью Group Policy

) я знаю этот метод, но интересует именно средствами powershell )) Ну Вы написали про другие методы, вот я и педложил, кстати, вполне рабочий и достаточно отказустойчивый скрипт. Тогда может подскажете, есть ли возможность запускать этот батник на удаленной машине с моего рабочего места. Т.е. что бы не "беспокоить пользователя" и просто подключить ему нужный сетевой принтер ?)) Тогда может подскажете, есть ли возможность запускать этот батник на удаленной машине с моего рабочего места.

Решение

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

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

newlife_86,
Еще можно закинуть батник в Планировщик.

Спасибо большое! Этот метод сработал, добавляется нужный принтер. Может еще подскажете команду как удалить сетевые принтеры. И еще бы список установленных получать))

Вот только с получением списка сетевых принтеров есть одно, но - если пользователь подключил принтер самостоятельно, то HKLM-ветке его не будет и нужно смотреть в HKCU (HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Devices) каждого пользователя

Получить список сетевых принтеров локально намного проще:

Равно, как и удалить:

это всё понятно, но совсем неинтересно.
а интересно попробовать прикрутить DSC.
или Ansible.
а можно и Ansible + DSC.

дело за мотивацией. вот у меня пока не хватает.

Добавлено через 5 минут
дело ещё и в том, что powershell( и все его производные тоже) мутирует прямо на глазах;
надо подождать, чтобы затвердел и остепенился.

это всё понятно, но совсем неинтересно.
а интересно попробовать прикрутить DSC.
или Ansible.
а можно и Ansible + DSC

Ещё SCCM забыли

Но как я уже здесь писал, при наличие AD, задача из этой темы проще всего решается через Group Policy. Причём вплоть до автоматического подключения принтера в зависимости от номера комнаты пользователя.

Добавлено через 3 минуты

дело ещё и в том, что powershell( и все его производные тоже) мутирует прямо на глазах;
надо подождать, чтобы затвердел и остепенился. Здесь в качестве основного способа подключения предложено - RUNDLL32.EXE - по моему, твёрже уже некуда

Удаление/подключение заработало, спасибо огромное, мне это и нужно было)) а вот с получением списка проблемы
icm -Comp $ComputerName -ScriptBlock < ls "HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Devices"| %>
Такой командой выдает ошибку -
Не удается найти путь "C:\Users\user\Documents\HKEY_CURRENT_USER\Software\Microsof t\Windows NT\CurrentVersion\Devices", так как он не существует.
по моему эта команда ломится на удаленном пк в реестр, но запрашивает ветку с моей учеткой, а не под тем пользователем который сейчас там работает.

Добавлено через 1 час 4 минуты
Подправил путь к реестру, неверно прописал
icm -Comp $ComputerName -ScriptBlock < ls "HKCU:\Software\Microsoft\Windows NT\CurrentVersion\Devices" | %>
В этом случае ни чего не возвращает. Хотя если посмотреть у пользователя в реестре записи есть.

Решение

по моему эта команда ломится на удаленном пк в реестр, но запрашивает ветку с моей учеткой, а не под тем пользователем который сейчас там работает. Подправил путь к реестру, неверно прописал
icm -Comp $ComputerName -ScriptBlock < ls "HKCU:\Software\Microsoft\Windows NT\CurrentVersion\Devices" | %>
В этом случае ни чего не возвращает. Хотя если посмотреть у пользователя в реестре записи есть.

И ещё раз - в HKCU перечисленны принтеры, подключенные пользователем самостоятельно. Если информация о таких принтерах нужна, то получить их список можно примерно так:

Что то я немного запутался, только начинаю изучать Пош. Вообще изначально задача такая была - именно средствами поша (т.к. я пишу форму на нем для управления AD и удаленно Компами в целом) реализовать добавление/удаление принтера на удаленный пк(доменный) и получать список принтеров, актуальный, текущего пользователя на удаленном пк. Т.е. например поступил запрос добавить такой то принтер с принтсервера на такой то ПК. Прежде мне нужно получить список принтеров пользователя, если нужно поудалять лишние и добавить нужный по запросу с установкой его по дефолту.
Если с удалением и добавлением я более менее разобрался(спасибо за команды), а вот со списком беда.. как мне получить список принтеров текущего интерактивного пользователя на удаленном пк. что бы проанализировать что нужно убрать, добавить новый принтер, ну и в дальнейшем так же получать актуальную информацию по принтерам.

Добавлено через 5 минут
Последний приведенный пример действительно получает подключенные принтера пользователя. Но если я добавляю ему принтер удаленно, то он не появлется по моему запросу этой командой. Т.е. выводит те которые были до этого уже установлены.

Существует два способа подключить принтер к компьютеру- Локальный и Сетевой.
Локальный способ подключения- принтер подключается к компьютеру через Usb, Wi-fi, при этом используются драйвера, которые идут в комплекте с принтером, либо скачиваются с интернета. Обычно проблем с локально подключённым принтером не бывает, другое дело - сетевой принтер.
Сетевой способ подключения- способ при котором принтер подключается локально к компьютеру (принт-серверу) и путем предоставления общего доступа, предоставляется возможность подключить этот принтер к другим компьютерам локальной сети. Сделать принтер сетевым достаточно просто, необходимо его подключить к компьютеру (принт-серверу) при помощи Usb, Wi-fi, Lan и «расшарить»-дать общий доступ по сети.



Зачастую работа с сетевым принтером мягко говоря не идеальна, возникают ситуации, когда для восстановления его работоспособности необходимо его пререподключить на компьютере. Объяснить, как это делается пользователю, бывает весьма проблематично, самому- лень, выход из этого я нашел путем написания небольшого bat-ника, который позволяет отключить и подключить сетевой принтер.

rundll32 printui.dll,PrintUIEntry /c\\<указываем компьютер к которому необходимо подключить принетр>. /dn /n" < \\ имя компьютера\имя принтера (который необходимо подключить)>" - команда удаления сетевого принтера
rundll32 printui.dll,PrintUIEntry /in /n \\ имя компьютера \ имя принтера -команда подключения сетевого принтера
rundll32 printui.dll,PrintUIEntry /y /n \\ имя компьютера \ имя принтера -команда для использования сетевого принтера по умолчанию

Пример:
rundll32 printui.dll,PrintUIEntry /c\\Comp1 /dn /n"\\Comp2\Canon"
rundll32 printui.dll,PrintUIEntry /in /n \\ Comp2\Canon
rundll32 printui.dll,PrintUIEntry /y /n \\ Comp2\Canon

В этом примере к компьютеру Comp1 подключаем сетевой принтер Canon, который локально подключен к Comp2 и делаем его принтером по умолчанию.
Сохраняем написанное, затем меняем расширение файла с txt на bat. После этого при возникновении проблем решением, которых будет переподклчение принтера, просто запускаете bat файл и все.

Читайте также: