Предоставление локальных служб печати для мобильных пользователей — вечная проблема малых и средних компаний с несколькими офисами. В операционных системах, предшествующих Windows Vista, нет готового решения, чтобы предоставлять мобильным пользователям принтеры в зависимости от местоположения. Начиная с Vista компания Microsoft подготовила такое решение для назначения принтеров на основе их местоположения. Однако оно малопригодно для малых и средних компаний, по двум причинам. Во-первых, для политик назначения требуется структура Active Directory (AD), точно отражающая топологию WAN. Во-вторых, политики назначения вступают в силу только после обновления групповой политики.

Решить проблему поможет сценарий; для этого нужны лишь некоторые навыки подготовки сценариев и время, которого часто не хватает у администратора сети. Первая проблема — определить, где находится пользователь, когда он регистрируется в сети. Самый надежный способ выяснить местонахождение пользователя — получить идентификатор сети для локального компьютера, затем сопоставить этот адрес с известным местонахождением. Алгоритм решения прост: «Если компьютер находится в сети X, сопоставить его группе Y». Но подготовить соответствующий сценарий весьма непросто.

Прежде всего, нужно получить идентификатор сети для локального компьютера. Информацию, необходимую для вычисления идентификатора, можно получить в WMI из класса Win32_NetworkAdapterConfiguration. Требуется получить значения двух свойств — IPAddress (которое содержит IP-адреса) и IPSubnet (содержит маски подсети), а затем выполнить побитовую операцию AND над этими значениями и получить идентификатор сети. Положение осложняется тем, что у компьютеров, как правило, несколько сетевых интерфейсов, поэтому IPAddress и IPSubnet представляют собой массивы, обычно содержащие несколько IP-адресов и масок подсети соответственно. Даже если IP-адрес и маска подсети — единственные, чтобы извлечь их, необходим цикл, так как WMI возвращает IP-адрес или маску подсети в виде массива.

Если очень повезет, на данном этапе будет только один идентификатор сети. Однако в большинстве случаев имеется несколько идентификаторов, и нет прямого способа определить, какой из них используется для подключения к локальной сети. Чтобы найти нужный идентификатор, необходимо сравнивать идентификатор сети для локального компьютера с идентификаторами сети для каждого удаленного офиса, пока не будет найдено совпадение. Возможно, мобильный пользователь запустил сеанс сервера терминалов. Нежелательно сопоставлять принтеры для сеанса сервера терминалов, поскольку принтеры, расположенные рядом с сервером терминалов, по определению почти наверняка находятся далеко от пользователя. Поэтому в данной ситуации необходима учетная запись. Наконец, нужно предусмотреть две другие возможности: ситуации с несколькими совпадениями и без совпадений.

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

Чтобы применить данное решение, необязательно понимать, как работает сценарий AddressBasedPrinter.vbs. Описание алгоритма можно найти во врезке «Как работает сценарий AddressBasedPrinter.vbs». Достаточно выполнить следующие шаги:

  1. Выбрать имена офисов.
  2. Загрузить и открыть сценарий AddressBasedPrinter.vbs.
  3. Изменить исходный текст во фрагменте B.
  4. Изменить исходный текст во фрагменте D.
  5. Протестировать AddressBasedPrinter.vbs.
  6. Объединить с существующими сценариями регистрации в сеть.
  7. Изменить AddressBasedPrinter.vbs в соответствии с конкретными нуждами.

Шаг 1. Выбор имен офисов

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

Шаг 2. Загрузка и открытие сценария AddressBasedPrinter.vbs

Откройте AddressBasedPrinter.vbs в текстовом редакторе, например Notepad. Чтобы открыть сценарий в Notepad, щелкните сценарий правой кнопкой мыши и выберите команду Edit.

Шаг 3. Изменение исходного текста во фрагменте B

В AddressBasedPrinter.vbs найдите программный код во фрагменте B. В этом месте нужно внести первое изменение. Следует указать каждое имя офиса и идентификатор сети в формате

Locations ("SiteName") = "NetworkID"

где SiteName и NetworkID — имя офиса и идентификатор сети соответственно.

В AddressBasedPrinter.vbs определено пять офисов, но при необходимости их число можно уменьшить или увеличить. Если офисов меньше пяти, удалите неиспользуемые строки, если больше, скопируйте и вставьте одну из существующих строк Locations для использования в качестве шаблона.

Шаг 4. Изменение исходного текста во фрагменте D

В AddressBasedPrinter.vbs найдите программный код во фрагменте D. В первую очередь необходимо изменить имена офисов в предложении Case инструкции VBScript Select Case. Имена офисов должны точно соответствовать именам в исходном тексте во фрагменте B. Например, если офису назначено имя «New York», предложение Case должно иметь вид

Case "New York"

Если прописные буквы (например, «new york») или пробелы (например, «NewYork») расставлены иначе, то работа сценария нарушится.

Если число офисов меньше пяти, удалите неиспользуемые предложения Case, отмеченные меткой D. Не удаляйте предложение Case Else. Если имеется больше пяти офисов, скопируйте и вставьте существующее предложение Case для использования в качестве шаблона.

Затем под каждым предложением Case нужно вставить следующую строку:

WshNetwork.AddPrinterConnection _
"PrinterName", "PrinterPath"

где PrinterName — локальное выводимое имя, которое нужно назначить принтеру, а PrinterPath — путь к общему принтеру. Во фрагменте D дан пример этой строки. В этом примере добавляется сопоставление к общему принтеру CentralPrinter на сервере NYPS01. Локальное выводимое имя этого сервера — Default.

Для каждого офиса можно назначить любое число принтеров. По умолчанию сопоставления принтеров не сохраняются в профиле пользователя и исчезнут после окончания сеанса.

Наконец, во фрагменте D нужно удалить все строки, которые начинаются с апострофа (то есть пример кода сопоставления и строки, начинающиеся с ' Code to map). Настройки закончены, можно сохранить сценарий и закрыть Notepad.

Шаг 5. Тестирование AddressBasedPrinter.vbs

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

Для начала в одном из офисов запустите AddressBasedPrinter.vbs из ноутбука, для которого нет сопоставленных локальных принтеров, и убедитесь, что сценарий сопоставляет принтеры без ошибок. Затем передайте сценарий мобильному пользователю в каждом офисе и попросите запустить сценарий, чтобы убедиться в правильности локальных сопоставлений принтеров. В случае успеха все готово для интеграции AddressBasedPrinter.vbs со сценариями регистрации в сети.

Шаг 6. Объединение с существующими сценариями регистрации в сети

AddressBasedPrinter.vbs предназначен для использования с существующими сценариями регистрации в сети. Если используются сценарии регистрации VBScript, можно вставить содержимое AddressBasedPrinter.vbs в сценарии регистрации в каждом офисе. Или можно вызвать AddressBasedPrinter.vbs в качестве внешнего сценария практически из любого сценария регистрации в сети, в том числе сценариев .cmd и VBScript.

При использовании AddressBasedPrinter.vbs в качестве внешнего сценария нужно поместить его в один каталог со сценариями регистрации в сети в каждом офисе. Предполагая, что имя AddressBasedPrinter.vbs сохранено, вызываем сценарий сопоставления из сценария регистрации .cmd с помощью строки

cscript%dp0

Для вызова AddressBasedPrinter.vbs из сценария регистрации VBScript нужно добавить следующий фрагмент исходного текста в сценарий регистрации:

Set WshShell = _
   CreateObject («WScript.Shell»)
dir = Left (_
   WScript.ScriptFullName, _
   Len (WScript.ScriptFullName) — _
   WScript.ScriptName))
PrintScript = dir & _
   "AddressBasedPrinter.vbs"
WshShell.Run PrintScript

Шаг 7. Изменение AddressBasedPrinter.vbs в соответствии с конкретными нуждами

В ходе обслуживания сети сценарий AddressBasedPrinter.vbs при необходимости обновляется. Например, его нужно обновлять всегда, когда к распределенной сети подключается новый офис или удаляются, добавляются или переименовываются общие принтеры и принт-серверы в локальной сети.

Пробный прогон

Если нужно предоставить доступ к локальным принтерам мобильным пользователям в различных офисах компании, то сценарий автоматического назначения принтеров AddressBasedPrinter.vbs заслуживает внимания. С его помощью можно сократить время на обслуживание мобильных пользователей. Кроме того, возрастет удобство работы мобильных пользователей, которым более не придется дожидаться выделения принтера.

Алекс Ангелопулос (aka@mvps.org) — старший ИТ-консультант, специализируется на технологиях автоматизации административных задач


Проблема
В малых и средних компаниях с несколькими удаленными офисами нет простого автоматизированного способа сопоставить принтеры для мобильных пользователей.

Решение
Изменить для конкретной ситуации AddressBasedPrinter.vbs, затем использовать сценарий регистрации в сети для автоматического сопоставления принтеров данного офиса при регистрации мобильного пользователя.

Необходимые ресурсы
AddressBasedPrinter.vbs, сценарий регистрации в сети, Notepad (или другой текстовый редактор).

Этапы решения

  1. Определите названия офисов.
  2. Загрузите и откройте сценарий AddressBasedPrinter.vbs.
  3. Измените исходный текст во фрагменте B.
  4. Измените исходный текст во фрагменте  D.
  5. Протестируйте AddressBasedPrinter.vbs.
  6. Соедините с существующими сценариями регистрации в сети.
  7. Измените AddressBasedPrinter.vbs в соответствии с конкретными нуждами.

Уровень сложности
3 из 5


Листинг. AddressBasedPrinter.vbs


Как работает сценарий AddressBasedPrinter.vbs

Сценарий AddressBasedPrinter.vbs (см. листинг) выполняет много задач, чтобы определить офис, в котором находится мобильный пользователь, и сопоставить подходящие принтеры в каждом офисе. Ниже кратко описана работа сценария.

Первая важная задача — получить TCP/IP-совместимые экземпляры Win32_NetworkAdapterConfiguration из локального принтера. Как показано во фрагменте A, для каждой конфигурации извлекаются IP-адреса и маски подсети из свойств IPAddress и IPSubnet соответственно. Проверив, что эти свойства не пусты, сценарий использует функцию NetworkID во фрагменте E для вычисления идентификаторов сети на основании IP-адресов и масок подсети. Например, если IP-адрес компьютера — 192.168.1.72 и с этим адресом связана маска подсети 255.255.255.0, идентификатор сети для компьютера (и всех остальных компьютеров в той же сети) будет 192.168.1.0. Сценарий добавляет идентификаторы к словарю идентификаторов в качестве ключей. Использовать объект Dictionary библиотеки Scripting Runtime Library предпочтительнее, чем массив, так как количество идентификаторов сети неизвестно. Сохраняя их в словаре на данном этапе, можно тонко управлять массивом переменного размера. В последней строке во фрагменте A сценарий извлекает ключи словаря идентификаторов сети и назначает их массиву IDList.

Затем создается другой словарь с именем Locations, в котором содержатся имена офисов и идентификаторы сети, указанные во фрагменте B. Программный код во фрагменте C использует словарь, чтобы выяснить, в каком офисе находится мобильный пользователь.

Во фрагменте C проверяется, не запустил ли мобильный пользователь сеанс служб терминала. Если сервер настроен правильно, мобильные пользователи не будут запускать обычный сценарий регистрации, когда регистрируются в сети, но на всякий случай сценарий проверяет переменную входа %SessionName%. Эта переменная существует во всех операционных системах, начиная с Windows 2000 Server, поддерживающих сеансы служб терминала. Когда пользователь непосредственно зарегистрирован на консоли, поддерживающей службы, эта переменная будет существовать и содержать значение Console. Если пользователь работает со старой операционной системой (в том числе Windows 2000 Professional), то переменная отсутствует, и при проверке ее значения возвращается просто %SessionName%. В любом случае сценарий обеспечивает сопоставление принтеров. Однако, если пользователь запускает сеанс не с консоли (то есть удаленный сеанс служб терминала), сценарий не выполняет никаких сопоставлений и поэтому не может случайно запустить принтер в удаленном офисе.

Когда пользователь напрямую регистрируется с консоли, сценарий проверяет соответствие идентификаторов сети в словаре Locations и массиве IDList. Если обнаруживается совпадение и это совпадение первое, то переменной SystemLocation назначается соответствующее имя офиса, полученное из словаря. Если значение SystemLocation уже установлено, поскольку было обнаружено предшествующее совпадение, переменной MultipleMatches присваивается значение True.

Затем сценарий AddressBasedPrinter.vbs проверяет значение переменной MultipleMatches. Если это True, работа сценария завершается. В результате принтеры не могут быть сопоставлены нескольким сетевым местам в случае ошибки конфигурации. Если значение — False, создается объект WshNetwork Windows Script Host (WSH), который обеспечивает связь с общими ресурсами и принтерами сети, а затем выполняется инструкция Select Case VBScript.

Инструкция Select Case выполняет поиск совпадения между офисом в переменной SystemLocation и офисами в предложении Case во фрагменте D. Когда совпадение обнаружено, запускается программный код в предложении Case (то есть код, который сопоставляет принтеры), затем сценарий завершает работу. Если совпадений не обнаружено, выполняется предложение Case Else. В этом случае выводится сообщение об отсутствии соответствующих офисов, и работа сценария завершается.