Назначение принтера по умолчанию на терминальном сервере Windows для тонких клиентов Thinstation

  • 11.09.2022
  • 369
  • 0
  • 12.09.2022
  • 1
  • 1
  • 0
Назначение принтера по умолчанию на терминальном сервере Windows для тонких клиентов Thinstation

Вступление

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

Важно! Данный скрипт будет работать только в следующих серверных операционных системах:

  • Windows 2000
  • Windows Server 2003
  • Windows Server 2003 R2
  • Windows Server 2008
  • Windows Server 2008 R2
  • Windows Server 2012
  • Windows Server 2012 R2

Данный скрипт не будет работать в следующих серверных операционных системах:

  • Windows Server 2016
  • Windows Server 2019
  • Windows Server 2022

Сценарий VBScript для автоматического назначения принтера по умолчанию

Работать описанный в статье метод будет по следующему сценарию:

При входе пользователя на сервер, срабатывает VBS скрипт, который загружает XML файл. В данном файле заранее прописаны принтеры и имена удаленных хостов, пользователям которых данные принтеры будут назначены как принтеры по умолчанию. При получении совпадения имени текущего удаленного хоста (клиента Thinstation), будет назначен принтером по умолчанию, указанный в XML файле принтер.

Выглядеть XML файл будет следующим образом:

XML файл должен быть сохранен в кодировке UTF-8.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<printers>
	<printer name="[ИМЯ ПРИНТЕРА]">
		<clients>
			<client location="[местоположение]" name="[ИМЯ УДАЛЕННОГО ХОСТА]"></client>
		</clients>
	</printer>
</printers>

Разберем вышеприведенные элементы:

  • Имя принтера - имя, под которым в операционной системе Windows установлен принтер.
  • Имя удаленного хоста - имя удаленного хоста (тонкого клиента), который используется в Windows.В Thinstation по умолчанию используется префикс ts_ и MAC адрес тонкого клиента.
  • Местоположение - не обязательный параметр, для указания местоположения тонкого клиента.

То есть, готовый XML файл должен выглядеть примерно так:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<printers>
	<!-- 1 этаж -->
	<printer name="Kyocera ECOSYS P2040dn (Ресепшн 1 этаж)">
		<clients>
			<client location="1 этаж, Ресепшн" name="ts_123456789012"></client>
			<client location="1 этаж, Ресепшн" name="ts_567890123456"></client>
		</clients>
	</printer>
	<!-- 2 этаж -->
	<printer name="HP LaserJet 400 M401dn (Ресепшн 2 этаж)">
		<clients>
			<client location="2 этаж, Ресепшн" name="ts_123456789012"></client>
			<client location="2 этаж, Ресепшн" name="ts_567890123456"></client>
		</clients>
	</printer>
	<printer name="HP LaserJet 400 MFP M425dn (Касса)">
		<clients>
			<client location="2 этаж, Касса" name="ts_345678912345"></client>
		</clients>
	</printer>
</printers>

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

Теперь перейдем к VBScript файлу. Выглядит он следующим образом:

VBS скрипт должен быть сохранен в кодировке CP1251.
Set objShell = CreateObject("WScript.Shell")
Set objWSHNetwork = CreateObject("WScript.Network")
Set objXML = CreateObject("MSXML2.DOMDocument")

objXML.async = False

' Устанавливаем принтер по умолчанию
objXML.load "[ПОЛНЫЙ ПУТЬ К XML ФАЙЛУ]"

If (objXML.parseError) Then
	MsgBox "Произошла ошибка при загрузке списка принтеров. Возможны проблемы при печати, в случае их возникновения свяжитесь с технической поддержкой." & vbCrLf & vbCrLf & "Сообщение об ошибке:" & vbCrLf & "Линия " & objXML.parseError.line & ": " & objXML.parseError.reason, 16, "Ошибка загрузки списка принтеров"
End If

objWSHNetwork.SetDefaultPrinter "[ИМЯ ПРИНТЕРА ПО УМОЛЧАНИЮ, ЕСЛИ ПРИНТЕР НЕ НАЙДЕН В XML ФАЙЛЕ]"

For Each Printer In objXML.selectNodes("//printer[(clients/client[@name = '" & LCase(objShell.ExpandEnvironmentStrings("%clientname%")) & "'])]")
	objWSHNetwork.SetDefaultPrinter Printer.getAttribute("name")
	DefaultPrinterIsSet = True
Next

Здесь следует обратить внимание на два важных параметра:

  • Полный путь к XML файлу - это путь к вышеописанному XML файлу. Он может быть как локально, или быть где-то на сетевом ресурсе. Примеры:
    • C:\Printers\printers.xml
    • \\commonserver\printers\printers.xml
  • Имя принтера по умолчанию, если принтер не найден в XML файле - здесь можно указать принтер, который будет задаваться принтером по умолчанию, если не найден принтер в XML файле. Здесь удобнее всего будет задать какой-нибудь виртуальный принтер, например стандартный Microsoft XPS Document Writer.
    Если подобный функционал не нужен, тогда из VBS скрипта следует удалить последние пять строк, чтобы он заканчивался строкой End If.

Вот так должен выглядеть рабочий VBS файл:

Set objShell = CreateObject("WScript.Shell")
Set objWSHNetwork = CreateObject("WScript.Network")
Set objXML = CreateObject("MSXML2.DOMDocument")

objXML.async = False

' Устанавливаем принтер по умолчанию
objXML.load "\\commonserver\printers\printers.xml"

If (objXML.parseError) Then
	MsgBox "Произошла ошибка при загрузке списка принтеров. Возможны проблемы при печати, в случае их возникновения свяжитесь с технической поддержкой." & vbCrLf & vbCrLf & "Сообщение об ошибке:" & vbCrLf & "Линия " & objXML.parseError.line & ": " & objXML.parseError.reason, 16, "Ошибка загрузки списка принтеров"
End If

objWSHNetwork.SetDefaultPrinter "Microsoft XPS Document Writer"

For Each Printer In objXML.selectNodes("//printer[(clients/client[@name = '" & LCase(objShell.ExpandEnvironmentStrings("%clientname%")) & "'])]")
	objWSHNetwork.SetDefaultPrinter Printer.getAttribute("name")
	DefaultPrinterIsSet = True
Next

Сохраняем данный VBS файл в кодировке CP1251 по следующему пути: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup. Теперь, при входе пользователя на сервер, он будет автоматически загружаться, и назначать пользователю нужный принтер по умолчанию.


Была ли эта статья Вам полезна?

Добавить комментарий

Ваш адрес email не будет опубликован.

Напоминаем Вам, что Ваше сообщение будет опубликовано только после проверки администратором сайта. Обычно это занимает 1-2 рабочих дня.