В. Существует ли сценарий для замены текущих сетевых принтеров принтерами на отдельном сервере печати?

О. Да. Если для развертывания принтеров используется групповая политика, то не составляет труда переместить пользователей на другие принтеры, просто обновив развернутые принтеры. Но если используется операционная система, отличная от Windows Server 2008, то процесс может быть достаточно сложным.

Рэнди Фостер подготовил сценарий, который просматривает реестр клиента и заменяет один сервер печати другим. Общие принтеры могут носить одинаковое имя на старом и новом серверах печати. Ниже приводится сценарий со всеми комментариями. Не забудьте заменить значения cosrv и co-data-01 на новом сервере печати.

'Автор - Randy Foster
'Адрес электронной почты - rfoster_2000@excite.com
'MCSE NT4, 2000
'MCSA 2003
'MCDBA SQL7, SQL2000
'CCNA

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

'Примечание: все принтеры должны существовать на новом сервере, прежде чем будет
'запущен этот сценарий. В противном случае принтер будет просто удален из
'профиля пользователя, и сценарий не сможет вновь подключить принтеры.
' "Print Migrator" -- утилита из набора ресурсов Windows 2000 и
' Windows 2003. С ее помощью можно создать все принтеры
' на новом сервере, сохранив все их параметры, в том числе
' настройки безопасности очереди печати. Учтите, что если выполнить поиск
' принтеров, то в течение некоторого времени будут видны дублированные
' принтеры, по одному на каждом сервере.

' Этот метод был использован для перемещения более 100 принтеров с одного сервера на другой
' с последующим запуском сценария как сценария регистрации в групповой политике.
' Он выполнялся несколько дней, чтобы его запустили и пользователи,
' которые не завершают свой сеанс ежедневно. Все профили пользователей
' в компании были обновлены незаметно для сотрудников. Затем все принтеры
' были удалены со старого сервера.
' Примечание: сценарий не выполняется при дистанционном управлении через терминальные службы или SMS.

Option Explicit
Dim from_sv, to_sv, PrinterPath, PrinterName, DefaultPrinterName,
DefaultPrinter
Dim DefaultPrinterServer, SetDefault, key
Dim spoint, Loop_Counter
Dim WshNet, WshShell
Dim WS_Printers
DefaultPrinterName = ""
spoint = 0
SetDefault = 0
set WshShell = CreateObject("WScript.shell")

from_sv = "cosrv" 'Имя старого сервера.
to_sv = "co-data-01" 'Имя нового сервера.

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

On Error Resume Next
key = "HKCUSoftwareMicrosoftWindows NTCurrentVersionWindowsDevice"
DefaultPrinter = LCase(WshShell.RegRead (key))
If Err.Number <> 0 Then
DefaultPrinterName = ""
else

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

spoint = instr(3,DefaultPrinter,"")+1
DefaultPrinterServer = left(DefaultPrinter,spoint-2)
if DefaultPrinterServer = from_sv then
DefaultPrinterName = mid(DefaultPrinter,spoint,len(DefaultPrinter)-spoint+1)
end if
end if
Set WshNet = CreateObject("WScript.Network")
Set WS_Printers = WshNet.EnumPrinterConnections

'Шаг должен быть 2, так как только четные числа являются именем сервера и общего ресурса
' очереди печати. Нечетные числа -- имена принтеров.

For Loop_Counter = 0 To WS_Printers.Count - 1 Step 2

'Не забудьте + 1, чтобы получить полный путь, то есть .. ваш_серверваш_принтер.

PrinterPath = lcase(WS_Printers(Loop_Counter + 1))

'Нужно работать столько с сетевыми принтерами, сопоставленными с исходным
' сервером, поэтому проверяем "ваш_сервер".

if LEFT(PrinterPath,len(from_sv)) = from_sv then

'Теперь нужно выполнить разбор пути принтера, чтобы получить имя принтера.
spoint = instr(3,PrinterPath,"")+1
PrinterName = mid(PrinterPath,spoint,len(PrinterPath)-spoint+1)

'Удаляем старое соединение с принтером,

WshNet.RemovePrinterConnection from_sv+""+PrinterName

'а затем создаем новое.
WshNet.AddWindowsPrinterConnection to_sv+""+PrinterName

'Если этот принтер совпадает с принтером по умолчанию, полученным из реестра, то
' назначаем его принтером по умолчанию.

if DefaultPrinterName = PrinterName then
WshNet.SetDefaultPrinter to_sv+""+PrinterName
end if
end if
Next
Set WS_Printers = Nothing
Set WshNet = Nothing
Set WshShell = Nothing