Назначение принтера по умолчанию на терминальном сервере Windows для тонких клиентов Thinstation
- Recluse
- 11.09.2022
- 4 443
- 0
- 12.09.2022
- 1
- 1
- 0
Вступление
При настройке тонких клиентов, использующих дистрибутив 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 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 файлу. Выглядит он следующим образом:
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
. Теперь, при входе пользователя на сервер, он будет автоматически загружаться, и назначать пользователю нужный принтер по умолчанию.
Добавить комментарий